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

2016-02-19 19:35 23 1 收藏

今天图老师小编给大家展示的是快速导出数据到Excel(三):利用Excel内置功能,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

将数据导出到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;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

    //设置页脚
    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;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

          //查询结果,导到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;
  

来源:https://www.tulaoshi.com/n/20160219/1621365.html

延伸阅读
标签: excel
Excel系统导出的数据前面有小逗号   Excel系统导出的数据前面有小逗号 Excel提取指定条件的不重复值   Excel提TuLaoShi.com取指定条件的不重复值 Ewww.tulaoshi.comxcel多维条形图   Excel多维条形图
标签: Web开发
Excel报表的方法,一个过於简单,一个只能用於window平台(因为使用jdbc-odbc bridge),且无法使用到Excel内部的各种公式或是方法,因此,今天介绍一个apache出的元件叫POI,它可以在UNIX或window平台处理word或Excel档案,而不需要依靠window的com,并且可设定储存格格式、列印格式等等;今天我来介绍其中有关资料读取、新增、修改及删除的...
标签: 电脑入门
自动筛选 自动筛选一般用于简单的条件筛选,筛选时将不满足条件的数据暂时隐藏起来,只显示符合条件的数据。我们通过下面的实例来进行讲解(如图1)。图1为某单位的职工工资表,打开数据菜单中筛选子菜单中的自动筛选命令,以基本工资字段为例,单击其右侧向下的列表按钮,可根据要求筛选出基本工资为某一指定数额或筛选出基本工资最高(低)的前1...
标签: 办公软件
在Microsoft OfficeAccess和 Microsoft OfficeExcel之间存在多种交换数据的方法。 ·若要将Access中的数据装入 Excel,可以从Access数据表中复制数据并粘贴到Excel工作表中,从Excel工作表连接到Access数据库,或者将Access数据导出到Excel工作表中。 ·若要将Excel中的数据装入 Access,可以从Excel工作表复制数据并粘贴到Acc...
标签: excel
Excel内置序列批量填充   Excel中行列隐藏操作   tulaoShi.com Excel监视窗口的功能 &nbstulaoship; Excel工作簿怎么加密保存?  

经验教程

114

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部