delphi 导出excel类(转)

导出方法

Button

procedure TFrm_ClientGameRecord.Act_ExportExecute(Sender: TObject);
var ToExcel:TTOExecel;
begin
  ToExcel:=TTOExecel.Create(GetTreeTopNode(Tree_Time.Selected).Text+'_交易记录.xls');
  try
    ToExcel.ToExcel(DBGrid_ChongZhi,Gauge_Export);
  finally
    ToExcel.Free;
  end;
end;

导出类:

unit ToExcel_Class;

interface

uses db,Adodb,Grids, DBGrids,windows,SysUtils,Gauges,forms,Dialogs;

{ TTOExecel }
type
  TTOExecel = class(TObject)
  private
    FFileName:string;
    FSaveDlg:TSaveDialog;

    FFileHandle:THandle;
  protected

  public
    constructor Create(FileName:string);
    destructor Destroy; override;

    //导出到Excel。返回导出的记录数。
    Function ToExcel(DBGrid:TDBGrid;Pre:TGauge=nil):integer;
    //写文件
    function WriteFile(FHandle:thandle; LogTxt: string): byte;
  published

  end;

implementation

{ TTOExecel }

constructor TTOExecel.Create(FileName:string);
begin
  FFileName:=FileName;
  FSaveDlg:=TSaveDialog.Create(nil);
  FSaveDlg.DefaultExt:='.xls';
  FSaveDlg.Filter:='Excel 文件|*.xls|所有文件|*.*';
  FSaveDlg.FileName :=FileName;

end;

destructor TTOExecel.Destroy;
begin
  FSaveDlg.Free;
  inherited;
end;

function TTOExecel.WriteFile(FHandle:thandle; LogTxt: string): byte;
var FileB: pchar;
    FileLen:integer;
begin
  try
    LogTxt := LogTxt + #13 + #10;
    GetMem(Fileb, length(LogTxt)+10);
    fillchar(Fileb[0], length(LogTxt)+10, #0);
    move(LogTxt[1], fileb[0], length(LogTxt));

    if (FHandle >0) then
    begin
      FileLen:=FileSeek(FHandle, int64(0), 2);
      if FileLen >=0 then
      begin
        if FileWrite(FHandle, fileb[0], length(LogTxt))>0 then
        begin
          FreeMem(FileB);
          result := 0;
        end
        else
          Result:=1;
      end
      else
        Result:=2;
    end
    else
      Result:=3;
  except
    result := 4;
  end;
end;

function TTOExecel.ToExcel(DBGrid: TDBGrid;Pre:TGauge=nil): integer;
var i,j:integer;
    ExecelRows:string;
    RecNo:integer;
begin
  Recno:=DBGrid.DataSource.DataSet.RecNo;
  ExecelRows:='';
  if not FSaveDlg.Execute then
    exit;
  //if FileExists(FSaveDlg.FileName) then
  //  DeleteFile(FSaveDlg.FileName);
  FFileHandle :=FileCreate(FSaveDlg.FileName);
  try
    for i:=0 to DBGrid.Columns.Count -1 do
    begin
      if DBGrid.Columns[i].Visible then
        ExecelRows:=ExecelRows+DBGrid.Columns[i].Title.Caption +char(VK_TAB);
    end;
    WriteFile(FFileHandle,ExecelRows);
    DBGrid.Enabled :=false;
    DBGrid.DataSource.DataSet.First;
    if Assigned(pre) then
    begin
      pre.Visible :=true;
      pre.MaxValue :=DBGrid.DataSource.DataSet.RecordCount;
    end;
    for i:=1 to DBGrid.DataSource.DataSet.RecordCount do
    begin
      Application.ProcessMessages;
      sleep(1);
      if Assigned(pre) then
        pre.Progress :=i;
      ExecelRows:='';
      for j:=0 to DBGrid.Columns.Count -1 do
      begin
        if DBGrid.Columns[j].Visible then
          ExecelRows:=ExecelRows+DBGrid.Fields[j].Text+char(vk_tab);
      end;
      WriteFile(FFileHandle,ExecelRows);
      DBGrid.DataSource.DataSet.Next;
    end;
    if Assigned(pre) then
      Pre.Visible :=false;
    DBGrid.Enabled :=true;
    DBGrid.DataSource.DataSet.RecNo:=RecNo;
  finally
    FileClose(FFileHandle);
  end;
end;

end.

posted @ 2011-05-24 09:34  高文  阅读(587)  评论(0编辑  收藏  举报