导航:
论坛 -> 报表专区
斑竹:sunyesy,iamdream
作者:
2023/5/10 12:01:01
标题:
nativeexcel 在32位程序下报内存溢出out of memory
浏览:430
加入我的收藏
楼主:
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有没有处理方式可以进行大数据的导出
----------------------------------------------
-
作者:
2023/5/11 10:10:40
1楼:
6万行,你不能一次性操作,要分成多次进行。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
2023/5/12 9:10:26
2楼:
就是因为没办法一次性操作,蔡改成这样40 *40的列数,如果把数据全部加载到Tstrings,那么Tstring也是会报内存超出
----------------------------------------------
-
作者:
lsuper (lsuper)
★☆☆☆☆
-
盒子活跃会员
2023/5/12 9:41:55
3楼:
既然有大内存述求,改为 64 位吧,现在微软 windows os 都不出 32 位了
----------------------------------------------
-
作者:
2023/5/12 9:43:56
3楼:
LZ可以试试用NativeExcel打开一个很大的excel文件,不读写,看看程序的内存占用,如果明显增大说明是一次性把文件载入内存的,这种情况下基本无解;否则还可以通过部分写入后关闭重新打开继续写的方式 我们去年遇到一个从数据库导出数据到Excel文件的案子,Excel文件到百兆量级的时候,32位程序的2G内存空间已经扛不住了,果断编译成64位,完美解决
----------------------------------------------
-
作者:
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
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2023/5/15 19:21:42
5楼:
64位确实可以解决这个问题,但是有两个要求是一个是当前用的是delphi2010 ,还有一个就是又没办法在减少内存暂用的情况下解决
----------------------------------------------
-
作者:
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位内存进程受限的问题,那如果机器物理内存本身就小呢?或者表特别大呢?
----------------------------------------------
-
作者:
2023/5/19 13:00:39
8楼:
7楼用ado的方式我也明白,但是如果在没有安装excel的前提下还是否能够使用
----------------------------------------------
-