DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ZMskyuza
今日帖子: 27
在线用户: 15
导航: 论坛 -> 报表专区 斑竹:sunyesy,iamdream  
作者:
男 mengyufeng (Raphael) ▲▲▲▲△ -
普通会员
2023/5/10 12:01:01
标题:
nativeexcel 在32位程序下报内存溢出out of memory 浏览:1056
加入我的收藏
楼主: procedure TForm1.Button1Click(Sender: TObject);
var
  excel: IXLSWorkbook;
  sheet: IXLSWorksheet;
  data: array of Variant;
  i, j, y: Integer;
begin

  excel := TXLSWorkbook.Create;
  excel.Open('D:\MyWorkbook.xlsx');
  sheet := excel.Sheets[1];
  SetLength(data, 40);
  for y := 0 to 40 - 1 do
  begin
    for j := 0 to 60000 - 1 do
    begin
      for i := 0 to High(data) do
      begin
        data[i] := Random(10000);
      end;
      sheet.RCRange[j, 1 + y * 40, j, 40 + y * 40].Value := data;

    end;


  end;
  excel.saveas('D:\MyWorkbook.xlsx', xlOpenXMLWorkbook);
end;
这段测试代码会报内存溢出,基本可以判断为32位程序内存分配不够造成,想询问一下各位大佬在,32位程序下nativeexcel有没有处理方式可以进行大数据的导出
----------------------------------------------
-
作者:
男 hnxxcxg (咏南中间件) ★☆☆☆☆ -
盒子活跃会员
2023/5/11 10:10:40
1楼: 6万行,你不能一次性操作,要分成多次进行。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
男 mengyufeng (Raphael) ▲▲▲▲△ -
普通会员
2023/5/12 9:10:26
2楼: 就是因为没办法一次性操作,蔡改成这样40 *40的列数,如果把数据全部加载到Tstrings,那么Tstring也是会报内存超出
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2023/5/12 9:41:55
3楼: 既然有大内存述求,改为 64 位吧,现在微软 windows os 都不出 32 位了
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2023/5/12 9:43:56
3楼: LZ可以试试用NativeExcel打开一个很大的excel文件,不读写,看看程序的内存占用,如果明显增大说明是一次性把文件载入内存的,这种情况下基本无解;否则还可以通过部分写入后关闭重新打开继续写的方式

我们去年遇到一个从数据库导出数据到Excel文件的案子,Excel文件到百兆量级的时候,32位程序的2G内存空间已经扛不住了,果断编译成64位,完美解决
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2023/5/13 13:52:56
4楼: 1. 直接用OLE可以分段导出,参考代码:https://www.2ccc.com/article.asp?articleid=2530 (注意,老Excel每页Sheet最多65535行<似乎是这个数>,新的版本最多1048576行)
2. 程序启用3G扩展内存支持:在dpr中uses后加上{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE},当然需要引用Windows
3. 如3楼所述,编译成64位,支持更多内存

windows内存使用限制可以参考:https://learn.microsoft.com/en-us/windows/win32/memory/memory-limits-for-windows-releases?redirectedfrom=MSDN#memory_limits
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 mengyufeng (Raphael) ▲▲▲▲△ -
普通会员
2023/5/15 19:21:42
5楼: 64位确实可以解决这个问题,但是有两个要求是一个是当前用的是delphi2010 ,还有一个就是又没办法在减少内存暂用的情况下解决
----------------------------------------------
-
作者:
男 mengyufeng (Raphael) ▲▲▲▲△ -
普通会员
2023/5/15 19:27:08
6楼: 感谢4楼回复,我就是用OLE的方式改过来的,OLE在处理大内存时也会有问题,因为使用了Tstrings,另外对必须要装excel,现在就是不像使用excel
你所说的内存扩展倒是可以尝试一下,但是我现在就是想有没有办法解决内存占用,nativeexcel的处理方式好像确实会加载大量内存,看了源码也没有找到相关的方法
----------------------------------------------
-
作者:
男 hectic (村雨Hectic) ▲▲▲▲▲ -
普通会员
2023/5/17 1:39:51
7楼: 用ADO连接excel,然后用sql添加修改删除数据。excel也是个数据库,完全可以当做标准数据库来读写。

ConnString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\myfolder\myfile.xls;Extended Properties="Excel 8.0;HDR=YES"';

然后循环里用insert into添加
excel表名默认是sheet1 sheet2 sheet3 ...
字段名默认是F1 F2 F3 ...

你用IXLSWorksheet这种对象内存肯定爆啊,改成64位是能解决32位内存进程受限的问题,那如果机器物理内存本身就小呢?或者表特别大呢?
----------------------------------------------
-
作者:
男 mengyufeng (Raphael) ▲▲▲▲△ -
普通会员
2023/5/19 13:00:39
8楼: 7楼用ado的方式我也明白,但是如果在没有安装excel的前提下还是否能够使用
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行921.875毫秒 RSS