`
宋科明
  • 浏览: 101563 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

快速导出数据到Excel(三):利用Excel内置功能

阅读更多

将数据导出到Excel的方法有多种,速度有快慢之分,我用过三种方法,速度都比较快,下面的一种利用Excel内置的功能,是三种之中最快的。其中最主要的是下面两句:
    xlQuery := xlSheet.QueryTables.Add(ADOQExport.Recordset ,xlSheet.Range['A3']);
    xlQuery.Refresh;
  不过我这里稍为复杂一点,要通过某种条件完成分类汇总。

function ExportToExcel: Boolean;
var
  xlApp, xlBook, xlSheet, xlQuery: Variant;
  SQLCmd: String;
  i, iNextRow: Integer;

  //设定单元格默认格式
  procedure ExcelSetDefaultFormat;
  begin
    xlSheet.Cells.Font.Name := '宋体';
    xlSheet.Cells.Font.Size := 12;
    xlSheet.Cells.VerticalAlignment := 2;
    //xlSheet.Cells.RowHeight := 17.25;
    xlSheet.Range['C:D'].HorizontalAlignment := xlCenter;
  end;

  //输出标题
  procedure ExcelSetHeader;
  begin
    xlSheet.Range['A1'].Value := '显示在报表第一行的标题';
    xlSheet.Range['A1:F1'].HorizontalAlignment := 7;
    xlSheet.Range['1:1'].Font.Size := 18;
    xlSheet.Range['1:1'].Font.Bold := true;
    xlSheet.Range['A2'].Value := '文件编号:WL/B 19';
    xlSheet.Range['A2'].Font.Size := 11;
    xlSheet.Range['F2'].Value := '记录编号:GZ-023';
    xlSheet.Range['F2'].HorizontalAlignment := xlRight;
    xlSheet.Range['F2'].Font.Size := 11;
    xlSheet.Range['A3'].Value := 'XXXXX有限公司';
    xlSheet.Range['F3'].Value := '日期:2005-X-X' ;
    xlSheet.Range['F3'].HorizontalAlignment := xlRight;
    //输出字段名
    ADOQExport.SQL.Strings[4] := 'where 1=0';
    if ADOQExport.Active then ADOQExport.Requery else ADOQExport.Open;
    xlQuery := xlSheet.QueryTables.Add(ADOQExport.Recordset ,xlSheet.Range['A4']);
    xlQuery.FieldNames := true;
    xlQuery.RowNumbers := False;
    xlQuery.FillAdjacentFormulas := False;
    xlQuery.PreserveFormatting := True;
    xlQuery.RefreshOnFileOpen := False;
    xlQuery.BackgroundQuery := True;
    xlQuery.RefreshStyle := xlOverwriteCells;   //xlInsertDeleteCells;
    xlQuery.SavePassword := True;
    xlQuery.SaveData := True;
    xlQuery.AdjustColumnWidth := True;
    xlQuery.RefreshPeriod := 0;
    xlQuery.PreserveColumnInfo := True;
    xlQuery.Refresh;
    iNextRow := 5;
  end;

  //设置页脚
  procedure ExcelSetFooter;
  begin
    xlSheet.PageSetup.LeftFooter := '制表:' + DM.UserInfo.UserName;
    xlSheet.PageSetup.CenterFooter := '审核:';
    xlSheet.PageSetup.RightFooter := '第 &P 页,共 &N 页';
  end;

  //输出汇总数据
  procedure ExcelSetSum;
  begin
    xlSheet.Range[Format('A%d', [iNextRow])].Value := '条数合计(条)';
    xlSheet.Range[Format('A%d:B%0:d', [iNextRow])].HorizontalAlignment := 7;
    xlSheet.Range[Format('C%d', [iNextRow])].Value := FloatToStr(DBGridEh1.Columns[6].Footer.SumValue);
    xlSheet.Range[Format('C%d:F%0:d', [iNextRow])].HorizontalAlignment := 7;
    xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true;
    Inc(iNextRow);
    xlSheet.Range[Format('A%d', [iNextRow])].Value := '重量合计(kg)';
    xlSheet.Range[Format('A%d:B%0:d', [iNextRow])].HorizontalAlignment := 7;
    xlSheet.Range[Format('C%d', [iNextRow])].Value := FloatToStr(DBGridEh1.Columns[7].Footer.SumValue);
    xlSheet.Range[Format('C%d:F%0:d', [iNextRow])].HorizontalAlignment := 7;
    xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true;
  end;

  //根据类别输出数据到Excel
  procedure ExportData(DataType: Byte);
  begin
      SQLCmd := Format('where DataType=%d ', [DataType]);
      ADOQExport.SQL.Strings[4] := SQLCmd;
      if ADOQExport.Active then ADOQExport.Requery else ADOQExport.Open;
      ProgressBar1.StepIt;

      if not ADOQExport.IsEmpty then begin
        //标题
        xlSheet.Range[Format('A%d', [iNextRow])].Value := DM.GetDataTypeStr(DataType);//将DataType转换为相应的文字显示
        xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].HorizontalAlignment := 7;
        xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true;
        Inc(iNextRow);

        xlQuery := xlSheet.QueryTables.Add(ADOQExport.Recordset ,xlSheet.Range[Format('A%d', [iNextRow])]);
        xlQuery.FieldNames := false;
        xlQuery.Refresh;
        Inc(iNextRow, ADOQExport.RecordCount);
        xlSheet.Range[Format('A%d', [iNextRow])].Value := DM.GetDataTypeStr(DataType) + '合计(条)';
        xlSheet.Range[Format('A%d:B%0:d', [iNextRow])].HorizontalAlignment := 7;
        xlSheet.Range[Format('C%d', [iNextRow])].Value := Format('=SUM(C%d:C%d)', [iNextRow-ADOQExport.RecordCount, iNextRow-1]);
        xlSheet.Range[Format('D%d', [iNextRow])].Value := Format('=SUM(D%d:D%d)', [iNextRow-ADOQExport.RecordCount, iNextRow-1]);
        xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true;
        Inc(iNextRow);
      end;
      ProgressBar1.StepIt;
  end;

begin
    Result := true;
    ShowProgress(0, cbbDataType.KeyItems.Count*2+2, 0); //调用前面例子中的函数显示进度面板
    Screen.Cursor := crHourGlass;
    try try
        //建立OLE对象
        xlApp := CreateOleObject('Excel.Application');
        xlBook := xlApp.Workbooks.Add;
        xlSheet := xlBook.Worksheets['sheet1'];
        xlApp.Visible := false;
        ProgressBar1.StepIt;
        //设置格式
        ExcelSetDefaultFormat;
        //输出标题内容
        ExcelSetHeader;
        ProgressBar1.StepIt;

        //查询结果,导到EXCEL
        for i:=0 to cbbDataType.KeyItems.Count-1 do  //cbbDataType: TDBComboBoxEh
            ExportData(StrToInt(cbbDataType.KeyItems.Strings[i]));
        //输出汇总内容
        ExcelSetSum;
        //设置边框
        xlSheet.Range[Format('A4:F%d', [iNextRow])].Borders.LineStyle := xlContinuous;
        xlSheet.Cells.EntireColumn.AutoFit;
        //输出页脚
        ExcelSetFooter;
    except
        if not VarIsNull(xlApp) then
        begin
            xlApp.Quit;
            xlApp.Disconnect;
            xlApp := Unassigned;
            xlApp := NULL;
        end;
        result := false;
        Exit;
    end;
    finally
        pnlShadow.Visible := false;
        pnlProgress.Visible := false;
        Screen.Cursor := crDefault;
        xlSheet := Unassigned;
        xlBook := Unassigned;
        if not VarIsNull(xlApp) then begin
            xlApp.Visible := true;
            xlApp := Unassigned;
        end;
        if ADOQExport.Active then ADOQExport.Close;
    end;
end;

 

分享到:
评论

相关推荐

    SQL定时导出数据到Excel

    ### SQL Server 定时导出数据到Excel及其他格式 #### 概述 在数据库管理和维护过程中,...通过以上步骤和技术方案,我们可以有效地实现在SQL Server中定时导出数据到Excel等功能,极大地提高了数据处理的工作效率。

    myxls三方控件(利用第三方控件导出数据到Excel中)

    总结来说,myxls控件是ASP.NET开发中一个实用的工具,它极大地简化了数据导出到Excel的过程,提供了丰富的功能和易用的API,能够帮助开发者快速实现数据导出的需求,提升开发效率。通过学习和熟练掌握myxls的使用,...

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

    本话题主要关注如何从KEIL环境中导出内存数据,并利用Excel进行进一步的处理和可视化,以便更好地理解和分析数据。 首先,KEIL在仿真运行时会生成内存映像,这些数据包含了程序执行过程中的变量值、堆栈信息等。...

    导出大量数据到excel

    本话题主要探讨如何高效地处理百万级别的数据导出,并利用内置的压缩功能优化存储和传输。以下是对这个主题的详细阐述: 一、Excel与大数据 Excel是一款广泛使用的电子表格软件,它在处理中小规模数据时表现出色。...

    ext实现导出excel的功能。

    7. **实现方法**:EXTJS没有内置的直接导出到Excel的功能,但可以借助第三方库如`sheetJS`(XLSX.js)或者服务端API来实现。通常,我们先将数据转换为适合Excel的格式,然后利用`blob`对象和`window.URL....

    Data From Keil to Excel_keil数据导出分析_keilexcel_

    - **公式和函数**:Excel内置了大量的数学和统计函数,如SUM、AVERAGE、COUNT等,可以用于计算总和、平均值、计数等。 - **条件格式化**:通过对数据应用条件格式,可以快速识别满足特定条件的单元格,例如高亮...

    android 导出数据到excel表格文件 .zip

    在Android平台上,将数据导出到Excel表格是一项常见的需求,特别是在数据管理和分析的应用场景中。这个.zip文件似乎包含了实现这一功能的代码或资源,命名为"familybill",可能是一个家庭账单管理应用的示例。下面...

    Qt实现导出数据库为Excel表

    本文将详细介绍如何利用Qt来实现从数据库导出数据到Excel表格的功能。 首先,我们需要理解Qt中的数据库模块。Qt支持多种数据库系统,如SQLite、MySQL、PostgreSQL等,通过QSqlDatabase类进行连接和操作。在项目开始...

    数据导入导出Excel

    - **Excel的数据连接功能**:Excel内置了数据连接工具,允许用户直接链接到外部数据源,实时更新数据。 - **VBA宏编程**:通过Visual Basic for Applications (VBA),可以编写脚本来自动化导入过程,比如定时从...

    c#导出数据到excel中,包含数据和饼图,饼图和数据联动

    在C#编程中,将数据导出到Excel文件是一项常见的任务,特别是在数据分析、报表生成以及数据可视化场景下。本主题将深入探讨如何在C#中创建一个包含数据和饼图的Excel文件,并实现饼图与数据的联动效果。首先,我们...

    delphi表格数据导出到excel的控件

    在Delphi编程环境中,开发人员经常需要处理数据的导入导出功能,特别是在处理表格数据时,将数据从数据库或表格组件导出到Excel文件是非常常见的需求。标题提到的"delphi表格数据导出到excel的控件"是解决这类问题的...

    表格导出Excel_labview_Labview表格_Labview表格导出到excel表格_labview数据导入_labv

    “表格导出Excel.vi”是LabVIEW程序,其主要功能是实现从LabVIEW的表格数据导出到Excel文件。这个过程涉及到几个关键步骤: 1. 数据准备:首先,需要将LabVIEW中的表格数据转换成可以被Excel识别的格式。这通常意味...

    Android 导出数据库到Excel表格功能

    在Android应用开发中,有时需要将应用程序内部的SQLite数据库数据导出到常见的Excel格式,以便用户可以方便地查看、编辑或共享数据。这个过程涉及到Android的数据库操作、文件读写以及与Excel文件格式的交互。以下是...

    利用VFP中将所有数据表导出到EXCEL

    通过以上步骤,我们可以看到,在VFP中利用OLE技术和内置函数可以非常方便地将数据表导出到Excel中。这种方法不仅可以提高数据处理的效率,还能简化代码的维护工作。希望本文能对从事VFP开发的同行们有所帮助,同时也...

    Excel导出百万级数据

    总结来说,通过C#编程,结合有效的数据处理策略和第三方库,我们可以有效地导出和管理Excel中的百万级数据,从而克服Excel的性能限制。同时,考虑到性能优化和用户体验,还可以结合分批处理、数据压缩等技术,确保...

    Excel导入导出 Excel导入 Excel导出

    - **公式和函数**:Excel内置了丰富的公式和函数,如SUM、AVERAGE、COUNT、VLOOKUP等,可用于计算、过滤和处理导入的数据。 4. **自动化和宏**: - **宏**:通过录制或编写VBA(Visual Basic for Applications)...

    易语言高级表格导出EXCEL

    在"易语言高级表格导出EXCEL"这个主题中,我们主要关注的是如何使用易语言来操作表格数据,并将这些数据高效地导出到Microsoft Excel格式。易语言提供了丰富的库函数和组件,使得开发者可以方便地实现对表格数据的...

    将pb数据表导出excel

    标题中的“将pb数据表导出excel”是指在PowerBuilder(PB)9.0环境中,将数据窗口(DataWindow)中的数据转换并保存为Excel电子表格格式的过程。PowerBuilder是一款强大的客户端/服务器应用程序开发工具,它支持数据...

    西门子TP1200触摸屏U盘导出的数据在EXCEL中无法分列显示的解决办法.docx

    西门子TP1200触摸屏是一款广泛应用于工业自动化领域的设备,它允许用户通过U盘导出数据以便于进一步的分析和处理。...无论是通过Excel内置的分列工具还是调整系统设置,都可以有效地解决这一问题。

    asp.net+Ajax实现Excel文件导出

    本篇文章将详细讲解如何利用ASP.NET与Ajax技术实现在Web应用中导出Excel文件。 首先,ASP.NET是Microsoft开发的一个用于构建动态网站、Web应用程序和服务的框架。它基于.NET Framework,提供了丰富的服务器控件、...

Global site tag (gtag.js) - Google Analytics