从DBGrid的导出数据到Excel,由于格式太难看了就先设置好Excel的格式,然后在向该模板导数据,格式事好看了,可是导出速度慢的让人受不了,各位大侠有没有更好的办法?

解决方案 »

  1.   

    try
     XLApp := CreateOleObject('Excel.Application');
    except
     Screen.Cursor := crDefault;
     Exit;
    end;
    XLApp.WorkBooks.Add[Trim(ExtractFilePath(Application.ExeName))+'1.xls'];//无格式 方法1
    //XLApp.WorkBooks.Add[Trim(ExtractFilePath(Application.ExeName))+'格式.xls']; //根据格式 方法2
    XLApp.WorkBooks[1].WorkSheets[1].Name := 'sheet1';
    Sheet := XLApp.Workbooks[1].WorkSheets['sheet1'];
    if not Target.DataSource.DataSet.Active then
    begin
     Screen.Cursor := crDefault;
     Exit;
    end;
    Target.DataSource.DataSet.first;for iCount := 0 to Target.Columns.Count - 1 do
    begin
     Sheet.cells[1, iCount + 1] := Target.Columns.Items[iCount].Title.Caption;
    end;jCount := 1;
    while not Target.DataSource.DataSet.Eof do
    begin for iCount := 0 to Target.Columns.Count - 1 do   //
     begin
      if iCount = 0 then
       Sheet.cells[jCount + 1, iCount + 1] := IntToStr(jCount)
      else
       Sheet.cells[jCount + 1, iCount + 1] := Target.Columns.Items[iCount].Field.AsString;
     end;
    Inc(jCount);
    Target.DataSource.DataSet.Next;
    end;方法2要比方法1慢很多很多
      

  2.   

    你可以用将DataSet(Query)中的数据导成EXCEL,不是直接用DBGrid 
    这样的控件有很多,比如XLSReadWriteII ,DVExport等~~
      

  3.   

    我以前用的也是 gmj412(良苦用心) 的方法,但就是慢得吓人,特别是转出的记录数多时,比牛车还慢。后来用了一种最简单的方法,当然格式是没法好看了,但速度超一流的快(基本是一秒)。
    就是倒出至文本文件,将文本文件的后缀保存成XLS。
      

  4.   

    试一下这个:
    procedure TDBGrid.ExportExcel(VFileName:string);  //导出数据
        function SaveAsExcelFile(AFileName: string): Boolean;
              procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
              const AValue: string);
              var
                L: Word;
              const
                {$J+}
                CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
                {$J-}
              begin
                L := Length(AValue);
                CXlsLabel[1] := 8 + L;
                CXlsLabel[2] := ARow;
                CXlsLabel[3] := ACol;
                CXlsLabel[5] := L;
                XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
                XlsStream.WriteBuffer(Pointer(AValue)^, L);
              end;
        const
          {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
          CXlsEof: array[0..1] of Word = ($0A, 00);
        var
          FStream: TFileStream;
          I, J: Integer;
        begin 
          Result := False;
          FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
          try
            CXlsBof[4] := 0;
            FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
            for i := 0 to ColCount - 1 do
              for j := 0 to RowCount - 1 do
                XlsWriteCellLabel(FStream, I, J, cells[i, j]);
            FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
            Result := True;
          finally
            FStream.Free;
          end;
        end;var   SaveDialog:TSaveDialog;
    begin
       SaveDialog:=TSaveDialog.Create(Application);
       SaveDialog.Filter:= 'Excel文件格式|.xls';   if trim(VFileName)=''  then  VFileName:=FormatDateTime('yy年mm月dd日hh时nn分',now)+FTitle+'.xls';
       SaveDialog.FileName:=VFileName;
       try
           IF SaveDialog.Execute  THEN
           BEGIN
              if UpperCase(TRIM(COPY(SaveDialog.FileName,Length(SaveDialog.FileName)-3,Length(SaveDialog.FileName))))<>'.XLS' THEN
                    SaveDialog.FileName:=SaveDialog.FileName+'.xls';
              if SaveAsExcelFile(SaveDialog.FileName)  then
                 showmessage(SaveDialog.FileName+'导出数据成功!')
              else
                 showmessage(SaveDialog.FileName+'导出数据失败,请重试!');
           END;
       finally
           SaveDialog.Free;
       end;
    end;
      

  5.   

    用三方控件吧,dbgrideh或者cxgrid
      

  6.   

    应该不会很慢吧
    试试formulone控件试试,设计好界面,赋值,然后保存成excel文件就可以了