急求:cxGrid导出Excel时,如何导出多个Sheet??请大虾们指教,感激!比如说cxGrid有多个View或多个Level,如何处理?没分了,最后50分,多谢!!!

解决方案 »

  1.   

    cxgrid沒有此現成的功能,自己導出...
      

  2.   

      我前段时间也出现这样的问题,,自己写了个可以这样的功能,但是  delphi 写excel速度太慢了,,我要写几百万条..实在忍受不了,最后改成导出文本.速度相差上百倍.如果你的数据量大的话,也可以Test.把每60000条数据放到一个txt文件里Procedure TFrmPubDbToExcel.DbToExcel(aHandle:TComponent;dbset:TDataSet);
    var
      Excel,WrkBook,WrkSheet:oleVariant;
      SaveDialog1:TSaveDialog;
      tmp,Row,SheetCount:integer;
    begin
      try
        Excel:=CreateOleObject('Excel.Application');
      Except
        if Application.MessageBox('对不起,你的机器没有安装Microsoft Excel,是否继续导出?'
               + #13#13 + '导出后在您的机器上不能直接打开,必须安装Excel到机器上才能打开!',
                  '注意', MB_OKCANCEL) = ID_no then
         exit;
      end;
      SaveDialog1:=TSaveDialog.Create(aHandle);
      SaveDialog1.Filter:='*.xls|(*.xls Excel文件)';
      try
        if SaveDialog1.Execute then
        begin
          WrkBook:=Excel.WorkBooks.Add;
          Row:=1;
          SheetCount:=1;      dbSet.DisableControls;
          dbSet.First;
          ProBar.Max := dbSet.RecordCount;
          ProBar.Position:=0;
          while not dbSet.Eof do
          begin
            if Row=1 then
            for tmp:=0 to dbSet.FieldCount-1 do
              if dbSet.Fields.Fields[tmp].Visible then
                Excel.WorkSheets[SheetCount].Cells[Row,tmp+1].Value:=dbSet.Fields.Fields[tmp].DisplayLabel;
            inc(Row);        for tmp:= 0 to dbSet.FieldCount-1 do
            begin
              if dbSet.Fields[tmp].Visible then
               Excel.WorkSheets[SheetCount].Cells[Row,Tmp+1].value:= '''' + dbSet.Fields[tmp].AsString;
            end;        if Row>=50000 then
            begin
              SheetCount:=SheetCount+1;
              Row:=0;          if SheetCount>3 then
              begin
                WrkSheet:=WrkBook.WorkSheets[WrkBook.WorkSheets.Count];
                wrkBook.WorkSheets.Add(EmptyParam,WrkSheet,1,$FFFFEFB9);
              end;
            end;
            ProBar.Position:=ProBar.Position+1;
            dbSet.Next;
          end;      Excel.ActiveWorkBook.SaveAs(SaveDialog1.FileName);
          WrkBook.close;
          Excel.Quit;
          Excel:=unassigned;
          Messagebox(self.Handle,Pchar('系统已经导出,请到《'+SaveDialog1.FileName+'》里查看!!!')
             ,'提示信息',MB_OK+MB_ICONINFORMATION);
        end;
      finally
        SaveDialog1.Free;
        dbSet.EnableControls;
      end;
    end;
      

  3.   

    下面代码在一个workbook上建立三个sheet页。请参考,自己解决建立多个sheet页的代码:  MainFrm.ExcelApplication1.Caption:='导出Excel数据';     // Excel任务栏标题
      MainFrm.ExcelApplication1.Workbooks.Add(null,0);       // 加入一个workbook
      MainFrm.ExcelWorkbook1.ConnectTo(MainFrm.ExcelApplication1.Workbooks[1]);// 连接Workbook
      MainFrm.ExcelWorksheet1.ConnectTo(MainFrm.ExcelWorkbook1.Worksheets[3] as _Worksheet);
      MainFrm.ExcelWorksheet1.Name:='第3页';                                     // 修改sheet名称
      MainFrm.ExcelWorksheet1.ConnectTo(MainFrm.ExcelWorkbook1.Worksheets[2] as _Worksheet);
      MainFrm.ExcelWorksheet1.Name:='第2页';                                     // 修改sheet名称
      MainFrm.ExcelWorksheet1.ConnectTo(MainFrm.ExcelWorkbook1.Worksheets[1] as _Worksheet);
      MainFrm.ExcelWorksheet1.Name:='第1页';                                     // 修改sheet名称
      

  4.   

    能不能在没有安装Office环境的条件下导出?cxExport就可以在没有Office环境下导出,我看了一下cxExport的部分代码,没那么时间细看,本人水平也不有限。有兴趣的朋友可以研究一下嘛,分析一下也许可以将它功能扩展。
      

  5.   

    xlsReadandwriteII----好像是這個名字,利用它 ,可以在沒有裝office的狀況下導出。
      

  6.   

    导入导出我基本都是自己定义的。dbgrideh可以自定义导出,但是导入就不行了,到头来还是要自己来处理楼主稍微看下delphi操作excel的例子,就可以融会贯通了。
      

  7.   

    问题已经解决,我是先用cxExport逐个导出,再用Excel将导出的多个文件合并