我们在做项目时,难免要用到导出功能。将数据导出到Excel中做进一步加工,因为软件不可能把用户所有需求及后来的要求都做进去;多数情况下也不需要导出太多数据,如果数据导出太多就要调整需求。
但无论如何总会有需要导出大数据的时候。比如要把销售明细导出给尼尔森、商务部的信息泵等,他们都需要的是大量的明细(要按店分明细,店号+条码)。
1、用cxGrid
当数据量小于65535时,可以导出为xls格式,没有问题。
当数据量大于65535时,导出xlsx格式老出错。没有太深入去研究,感觉是xml操作实现方法的限制。
uses cxGridExportLink;
Screen.Cursor := crSQLWait;
try
ExportGridToXLSX('c:\test.xlsx', cxgrd1);
finally
Screen.Cursor := crDefault;
end;
2、用Ehlib
导出xls,xlsx都正常。但xlsx格式时,超过40万(没有测试具体数据,只是大概)也有问题,程序好长时间没有响应。
我修改了源代码,将其中的TStringStream替换成了TmemoryStream,速度快了很多。之前30分钟还导不完的数据,改后不到30秒就完成。
uses DBGridEhImpExp;
ExportDBGridEhToXlsx(DBGridEh1, 'Ehlib.xlsx', [xlsxDataAsDisplayText]);
3、采用Ole方式操作Excel
自己写了代码,虽然可以实现,但是速度太慢。后来在网上搜索‘DataSet分页导出到Excel(支持超过65536条记录)’,刚好找到一个写好的单元,一测试速度相当快,还可以支持按数据量分页,也可以一次导出多个数据集,并且可以按表格的宽度输出和显示进度。
要求客户机必须安排Excel;再说了如果没有Excel,导出又有何用?
4、还有其它导出控件
有了方法3,尽量减少三方控件的使用。
备注:
1、导出超过10万条数据,纯属测试,实际需要的可能性不大。
2、写此文档,记录此事,改变思维。之前一直在追求所见所得,即能把界面上显示的效果(字体、宽度、颜色)也一并导出,所以一直在用cxGrid、Ehlib控件自身的导出功能,经过一天的测试,发现数据量小的时候都没有问题,一旦遇到大数据就不行了。追求导出效果相对数据的使用来说,并不重要;虽然用第3种方式导出的数据格式不好看,但是还原了事物本质:导出数据是为了对数据的再利用。
3、追求技术与解决问题的关系
在解决问题同等质量的情况下,采用简单的技术、自己顺手的技术。个人体会。