之前做了一个对将数据导出到Excel的性能优化。
原有程序对格式的控制比较精致,但是缺点在于它是逐cell写数据的,效率是在是太低了,200万数据导了三个小时。但好处是这样子进度比较好跟踪。
要注意,excel每页最大允许记录数是65536行,列为256列,所以最好要定义个全局常量来限制。一般来说列是不会超过256的,行是很容易超过。
目前我所找到的最快的方法有两种
1.利用OLE编程中Excel自带的querytables属性,将查询SQL输入,直接得到结果
2.利用Excel的剪贴板属性,一页粘贴
这两种方法都涉及到分页。这里介绍下第一种,这一种相对而言还要快一些。
分页时采用 ceil(记录总数/每页最大记录数),round()也是可以的,以这个结果作为excel的页号。注意使用querytables时它是将所有数据一次性写入excel,如果你查询SQL选择了所有数据,然后想再用ADOQuery自带的filter属性是不对的,导完后就会报数据超出最大限制。因为它始终只读取最原始的SQL。所以过滤应该在原始SQL上就进行了。
贴代码
{1.获取查询记录行数}
with qryADOExport do
begin
if qryADOExport.Active then Close;
qryADOExport.SQL.Text:='select count(1) cnt from ('+mmo1.Lines.Text+' )';//根据输入的SQL(末尾勿加分号)查询记录总数
try
qryADOExport.Open;
except
on E:Exception do
begin
Application.MessageBox(PChar('执行SQL错误,原因为'+E.Message),'错误',0);
Exit;
end;
end;
end;
if qryADOExport.FieldByName('cnt').asinteger>MaxPerSheet-2 then //每一页留出页首和页尾,供写标题行与统计行
begin
iPageCount := Round(qryADOExport.FieldByName('cnt').asinteger/(MaxPerSheet-2));
iRecordCount := MaxPerSheet-2;
end
else begin
iPageCount := 1;
iRecordCount := qryADOExport.FieldByName('cnt').asinteger;
end;
if qryADOExport.Active then
qryADOExport.Close;
StartTime:=Now;
ExcelApp.SheetsInNewWorkbook := 1;
while iPageCount>0 do
begin
if SheetNo>0 then ExcelApp.Sheets.Add;
Inc(SheetNo);
//stringreplace,第四个参数为空,默认替换第一个
strSql:='select * from ('+StringReplace(UpperCase(mmo1.Lines.Text),'SELECT','SELECT CEIL(ROWNUM/'+Inttostr(MaxPerSheet-2)+') L_PAGENO,',[])+')';//替换第一个select,加上序号字段,为分页做好准备。
strFilter:=' where l_pageno='+inttostr(iPageCount);
ExcelApp.ActiveSheet.Name := '第'+IntToStr(iPageCount)+'页';
xlSheet := ExcelApp.ActiveSheet;
j := 0;
iNextRow := 0;
if iCount < iPageCount then
begin
Dec(iPageCount);
Inc(iNextRow);
strTmp:= 'OLEDB;'+qryADOExport.ConnectionString;
xlQuery := xlSheet.QueryTables.Add(strTmp ,xlSheet.Range[Format('A%d', [iNextRow])],strSql + strFilter);//此方法重点,使用QueryTables属性,依次传入数据库连接串,列标题,查询SQL。注意此处连接串应该使用OLEDB类型的
xlQuery.FieldNames := false;
xlQuery.Refresh;
Inc(iNextRow, iRecordCount);
end
else Break;
end;
效率方面测了一下,20万数据集,十几个字段,导了一分钟左右,效率有非常显著的提高。
分享到:
相关推荐
这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...
C#大量数据导出到Excel,超过65536行时自动分页导出
在IT行业中,将大量数据导出到Excel是常见的需求,特别是在数据分析、报表生成或数据共享时。本话题主要探讨如何高效地处理百万级别的数据导出,并利用内置的压缩功能优化存储和传输。以下是对这个主题的详细阐述: ...
如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以上两个问题。 (2)具体步骤如下: 1.第一步,安装openpyxl, 使用pip install openpyxl即可,但是在windows下安装的是2.2.6版本,但是centos自动安装的是...
9. **考虑使用其他库**:除了Interop,还有许多第三方库(如EPPlus、NPOI)提供更高效的数据导出,它们不依赖于Excel进程,适合大数据量操作。 在提供的`Demo`文件中,可能包含了实现以上优化策略的示例代码,你...
为了将这些数据导出到Excel,我们需要在KEIL中设置数据导出选项。通常,KEIL可以通过仿真器或调试器的内存查看器来查看和复制内存数据。在内存窗口中选择要导出的数据范围,然后通过复制(Ctrl+C)将数据粘贴到Excel...
在本文中,我们将探讨如何使用C#语言将数据库数据导出到Excel文件中。 Response流 在C#中,Response流是指ASP.NET框架中用于将数据发送到客户端的流媒体。Response流可以将服务器端的数据推送到客户端,实现实时...
在这篇文章中,我们将介绍如何使用 Delphi 高效率地将数据导出到 Excel 中。 Delphi 中的 Excel 操作 在 Delphi 中,我们可以使用多种方式来操作 Excel,例如使用 OLE 自动化、ADO、DBGridEh 等。其中,使用 OLE ...
有时,用户可能需要将这些历史数据导出到更通用的格式,如Excel CSV文件,以便进行进一步的数据分析和处理。下面,我们将详细介绍如何实现这个过程。 首先,理解WinCC的数据归档系统。WinCC的归档功能允许用户定义...
POI3.8版本之前的版本处理大量数据的导出Excel效果不是很理想,主要在与Excel2003版本单个Sheet的行限制为65536,大量数据的导出得分多个Sheet,针对这一点,客户就不会满意。其次,在实验过程中,大数据量的导出很...
在IT行业中,前端数据处理和展示是至关重要的,特别是在企业级应用中,用户往往需要将大量数据导出为便于分析的格式,如Excel。本文将详细介绍如何在基于EasyUI的前端框架下实现数据导出为Excel的功能。 EasyUI是一...
在某些情况下,开发者可能需要将这些数据导出到Excel文件中,以便进行更复杂的分析或共享。标题提到的"将listcontrl控件里的数据导出到excel表格里"就是这样一个需求。 要实现这个功能,你需要遵循以下步骤: 1. *...
通过以上步骤,我们可以使用Java轻松地将数据和图片导出到Excel文件中。这不仅可以提高工作效率,还能使得报表更加直观和美观。需要注意的是,在实际应用中还需要根据具体的业务需求进行调整和优化。
这个过程展示了如何结合ThinkPHP的MVC架构和第三方库来处理复杂的业务需求,为开发者提供了一种便捷的方式将大量数据导出到Excel,便于分析和共享。在实际项目中,你还可以根据需要添加更多功能,如数据过滤、格式化...
### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...
本话题聚焦于如何高效地将MSFlexGrid中的数据导出到Excel文件,以适应大量数据处理的需求。 MSFlexGrid控件虽然功能强大,但在处理大量数据时,如果使用传统的FOR循环逐行逐列导出数据,效率会显著降低。为了解决这...
### C#将DataGridView中的数据导出到Excel表格实例详解 #### 概述 在实际开发过程中,经常需要处理数据导出的功能,其中一种常见的需求是将DataGridView中的数据导出到Excel表格。本篇文章将详细介绍如何使用C#...
在C#编程中,将数据导出到Excel是一种常见的需求,尤其在数据分析、报表生成或者数据交换场景下。本文将详细介绍如何使用C#实现这一功能,主要涉及的知识点包括: 1. **Excel文件格式理解**:Excel文件有两种主要...
- **方法2**:先将数据导出为HTML格式,然后使用IE浏览器打开HTML文件,并选择【导出到Microsoft Excel】功能。这种方法同样能够解决乱码问题。 3. **另存为Excel**:完成上述步骤后,即可将CSV文件另存为Excel...