`

将大量数据导出到Excel

阅读更多
之前做了一个对将数据导出到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文件程序总结

    这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...

    C#大量数据导出到Excel自动分页导出

    C#大量数据导出到Excel,超过65536行时自动分页导出

    导出大量数据到excel

    在IT行业中,将大量数据导出到Excel是常见的需求,特别是在数据分析、报表生成或数据共享时。本话题主要探讨如何高效地处理百万级别的数据导出,并利用内置的压缩功能优化存储和传输。以下是对这个主题的详细阐述: ...

    使用python将大量数据导出到Excel中的小技巧分享

    如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以上两个问题。 (2)具体步骤如下: 1.第一步,安装openpyxl, 使用pip install openpyxl即可,但是在windows下安装的是2.2.6版本,但是centos自动安装的是...

    C# 大数据量快速导出到 Excel方法

    9. **考虑使用其他库**:除了Interop,还有许多第三方库(如EPPlus、NPOI)提供更高效的数据导出,它们不依赖于Excel进程,适合大数据量操作。 在提供的`Demo`文件中,可能包含了实现以上优化策略的示例代码,你...

    Data From Keil to Excel (keil数据导出至excel)

    为了将这些数据导出到Excel,我们需要在KEIL中设置数据导出选项。通常,KEIL可以通过仿真器或调试器的内存查看器来查看和复制内存数据。在内存窗口中选择要导出的数据范围,然后通过复制(Ctrl+C)将数据粘贴到Excel...

    C#利用Response流将数据库数据导出成Excel

    在本文中,我们将探讨如何使用C#语言将数据库数据导出到Excel文件中。 Response流 在C#中,Response流是指ASP.NET框架中用于将数据发送到客户端的流媒体。Response流可以将服务器端的数据推送到客户端,实现实时...

    delphi高效率导出数据到excel

    在这篇文章中,我们将介绍如何使用 Delphi 高效率地将数据导出到 Excel 中。 Delphi 中的 Excel 操作 在 Delphi 中,我们可以使用多种方式来操作 Excel,例如使用 OLE 自动化、ADO、DBGridEh 等。其中,使用 OLE ...

    如何将WinCC归档的历史数据导出到EXCEL CSV文件.zip

    有时,用户可能需要将这些历史数据导出到更通用的格式,如Excel CSV文件,以便进行进一步的数据分析和处理。下面,我们将详细介绍如何实现这个过程。 首先,理解WinCC的数据归档系统。WinCC的归档功能允许用户定义...

    数据库大量数据导出Excel

    POI3.8版本之前的版本处理大量数据的导出Excel效果不是很理想,主要在与Excel2003版本单个Sheet的行限制为65536,大量数据的导出得分多个Sheet,针对这一点,客户就不会满意。其次,在实验过程中,大数据量的导出很...

    easyui+数据导出为Excel

    在IT行业中,前端数据处理和展示是至关重要的,特别是在企业级应用中,用户往往需要将大量数据导出为便于分析的格式,如Excel。本文将详细介绍如何在基于EasyUI的前端框架下实现数据导出为Excel的功能。 EasyUI是一...

    将listcontrl控件里的数据导出到excel表格里

    在某些情况下,开发者可能需要将这些数据导出到Excel文件中,以便进行更复杂的分析或共享。标题提到的"将listcontrl控件里的数据导出到excel表格里"就是这样一个需求。 要实现这个功能,你需要遵循以下步骤: 1. *...

    java中将数据和图片导出到Excel文件

    通过以上步骤,我们可以使用Java轻松地将数据和图片导出到Excel文件中。这不仅可以提高工作效率,还能使得报表更加直观和美观。需要注意的是,在实际应用中还需要根据具体的业务需求进行调整和优化。

    thinkPHP实现数据库数据导出Excel表格

    这个过程展示了如何结合ThinkPHP的MVC架构和第三方库来处理复杂的业务需求,为开发者提供了一种便捷的方式将大量数据导出到Excel,便于分析和共享。在实际项目中,你还可以根据需要添加更多功能,如数据过滤、格式化...

    java poi导出大量数据到Excel

    ### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...

    MSFlexGrid表格数据导出到EXCEL

    本话题聚焦于如何高效地将MSFlexGrid中的数据导出到Excel文件,以适应大量数据处理的需求。 MSFlexGrid控件虽然功能强大,但在处理大量数据时,如果使用传统的FOR循环逐行逐列导出数据,效率会显著降低。为了解决这...

    C#将Datagridview中的数据导出到Excel表格实例

    ### C#将DataGridView中的数据导出到Excel表格实例详解 #### 概述 在实际开发过程中,经常需要处理数据导出的功能,其中一种常见的需求是将DataGridView中的数据导出到Excel表格。本篇文章将详细介绍如何使用C#...

    C#把数据导出到EXCEL强大类

    在C#编程中,将数据导出到Excel是一种常见的需求,尤其在数据分析、报表生成或者数据交换场景下。本文将详细介绍如何使用C#实现这一功能,主要涉及的知识点包括: 1. **Excel文件格式理解**:Excel文件有两种主要...

    plsql导出数据到excel的三种方法

    - **方法2**:先将数据导出为HTML格式,然后使用IE浏览器打开HTML文件,并选择【导出到Microsoft Excel】功能。这种方法同样能够解决乱码问题。 3. **另存为Excel**:完成上述步骤后,即可将CSV文件另存为Excel...

Global site tag (gtag.js) - Google Analytics