您的位置:首页 > 编程语言 > Delphi

delphi 的一个导出excel的方法的类

2013-01-02 09:34 381 查看
导出方法

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: