Delphi cxGridExportToExcel

//cxGrid导出到Excel:通过数据集的方式导出------>数据量大时,还待继续优化,尽量加快导出Excel速度

//需要应用单元ComObj

function TWorkWindowForm.DataSetToExcel(cds_Temp: TClientDataSet; AcxGridDBTableView: TcxGridDBTableView; ToSavePath:string; var sMsg: string): Boolean;
var  
   XLS,WorkBook,WorkSheet: variant;
   i,m,Row,Col,RecNums: integer;
   sFieldName,
   SheetName,
   tmpSheetName: string;
   nSheetNums,nLoopCount,nMaxRows: Integer;
   cds_DataSet: TClientDataSet;
begin
  Result := False;

  //检查数据完整性
  sMsg := '没有导出的数据或导出路径为空!';
  if not cds_Temp.Active then exit;
  if cds_Temp.RecordCount<=0 then exit;
  if AcxGridDBTableView.DataController.RecordCount<=0 then Exit;
  if ToSavePath = '' then Exit;
  
  if FileExists(ToSavePath) then
  begin
    CopyFile(PChar(ToSavePath),PChar('C:\temp.xls'),True);
    DeleteFile(ToSavePath);
  end;
  try
    RecNums := 0;
    nMaxRows := 65536;     //Excel2003最大行数
    nLoopCount := 1;       //循环次数----->针对循环sheet页
    Row := 2;              //从第2行开始写内容

    try
      XLS := createoleobject('Excel.Application');  //创建Excel工程
      WorkBook := XLS.WorkBooks.Add;  //新增一个工作簿
      WorkSheet := XLS.WorkSheets.Add; //新建一个Sheet
      XLS.Visible := False;
      SheetName := '数据目录1';  //第1个Sheet
      WorkSheet.Name := SheetName; //Sheet名称
      XLS.WorkSheets[SheetName].Activate;

      XLS.WorkSheets['Sheet1'].Activate; //设置一个活动的Sheet
      XLS.WorkSheets['Sheet1'].Delete;   //删除
      XLS.WorkSheets['Sheet2'].Activate;
      XLS.WorkSheets['Sheet2'].Delete;
      XLS.WorkSheets['Sheet3'].Activate;
      XLS.WorkSheets['Sheet3'].Delete;
    except
      CopyFile(PChar('C:\temp.xls'),PChar(ToSavePath),True);
      if FileExists('C:\temp.xls') then DeleteFile('C:\temp.xls');
      sMsg := '创建Excel失败,请确认安装Excel2003或以上版本!';
    end;

    try
      //写入表头
      m := AcxGridDBTableView.ItemCount;  //cxGrid列总数
      for i:=0 to m-1 do
      begin
        XLS.cells[1,i+1]:=AcxGridDBTableView.Columns[i].Caption;   //左上角第一个方格是[1,1]
      end;

      cds_DataSet := TClientDataSet.Create(nil);
      cds_DataSet.Data := cds_Temp.Data;
      RecNums := cds_DataSet.RecordCount;
      try//写入Excel数据
        cds_DataSet.DisableControls;
        cds_DataSet.First;
        while not cds_DataSet.Eof do
        begin
          for Col := 1 to m do
          begin
            sFieldName := AcxGridDBTableView.Columns[Col-1].DataBinding.FieldName;
            XLS.cells[Row,Col] := cds_DataSet.FieldByName(sFieldName).AsString;
          end;
        
          Inc(Row);
          if Row > nMaxRows then
          begin
            Inc(nLoopCount);   //循环次数
            //建立第下一个Sheet页,继续写数据
            SheetName := '数据目录'+inttostr(nLoopCount); //第i个Sheet
            WorkSheet := XLS.WorkSheets.Add; //新建一个Sheet
            XLS.Visible := False;
            WorkSheet.Name := SheetName; //Sheet名称
            XLS.WorkSheets[SheetName].Activate;

            //写入表头
            m := AcxGridDBTableView.ItemCount;  //cxGrid列总数
            for i:=0 to m-1 do
            begin
              XLS.cells[1,i+1]:=AcxGridDBTableView.Columns[i].Caption;   //左上角第一个方格是[1,1]
            end;
            Row := 2; //从第i个Sheet,第2行开始写内容
          end;

          cds_DataSet.Next;
        end;
      finally
        cds_DataSet.EnableControls;
        FreeAndNil(cds_DataSet);
      end;
    Except
      CopyFile(PChar('C:\temp.xls'),PChar(ToSavePath),True);
      if FileExists('C:\temp.xls') then DeleteFile('C:\temp.xls');
      sMsg := '写入Excel内容失败!';
    end;

      XLS.WorkBooks[1].SaveAs(ToSavePath, 56); //fileformat:=56 -- Office Excel 97-2003 format
  finally
    XLS.WorkBooks.Close; //关闭工作簿
    if not VarIsEmpty(XLS) then
       XLS.Quit;
    XLS := Unassigned;

    if FileExists('C:\temp.xls') then DeleteFile('C:\temp.xls');
  end;

  Result := True;
  Application.MessageBox(PChar('数据导出完毕,共计'+ inttostr(RecNums) + '条!'),'提示',MB_ICONINFORMATION + MB_OK);
end;

猜你喜欢

转载自blog.csdn.net/qq_39951605/article/details/82453634
今日推荐