delphi 导出到excel的7种方法
<div class="postTitle"><span>delphi 导出到excel的7种方法</span></div><div class="postText">
<div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">
<p>本文来自 爱好者8888 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kpc2000/article/details/17066823?utm_source=copy</p>
<p>===================================================================================================</p>
<div class="user-info d-flex justify-content-center flex-column">
<p>第一种方法delphi 快速导出excel</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>uses ComObj,clipbrd;
function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean;
const
xlNormal=-4143;
var
y : integer;
tsList : TStringList;
s,filename:string;
aSheet :Variant;
excel :OleVariant;
savedialog:tsavedialog;
begin
Result := true;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
//screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.FileName:=sfilename; //存入文件 savedialog.Filter:='Excel文件(*.xls)|*.xls';
if savedialog.Execute then
begin
if FileExists(savedialog.FileName) then
try
if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes
then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
//screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
if filename='' then
begin
result:=true;
Excel.Quit;
//screen.cursor:=crDefault;
exit;
end;
aSheet:=excel.Worksheets.Item;
tsList:=TStringList.Create;
//tsList.Add('查询结果'); //加入标题 s:=''; //加入字段名 for y := 0 to adoquery.fieldCount - 1 do
begin
s:=s+adoQuery.Fields.Fields.FieldName+#9 ;
Application.ProcessMessages;
end;
tsList.Add(s);
try
try
ADOQuery.First;
While Not ADOQuery.Eof do
begin
s:='';
for y:=0 to ADOQuery.FieldCount-1 do
begin
s:=s+ADOQuery.Fields.AsString+#9;
Application.ProcessMessages;
end;
tsList.Add(s);
ADOQuery.next;
end;
Clipboard.AsText:=tsList.Text;
except
result:=false;
end;
finally
tsList.Free;
end;
aSheet.Paste;
MessageBox(Application.Handle,'数据导出完毕!','系统提示',MB_ICONINFORMATION
or MB_OK);
try
if copy(FileName,length(FileName)-3,4)<>'.xls' then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName, xlNormal, '', '', False, False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
Excel.Visible := false; //true会自动打开已经保存的excel
Excel.Quit;
Excel := UnAssigned;
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>调用: ToExcel('D:\a.xsl',QueryToExcel);//路径可以自定义</p>
<p>------------------------------------------------------------------------------------------------- *************************************************************************************************</p>
<p>二; delphi如何导出EXCEL,代码。非第3方控件首先在Uses处加上ComObj</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>procedure TForm1.Button1Click(Sender: TObject);
varh,k:integer;
Excelid: OleVariant;
s: string;
begin
try
Excelid := CreateOLEObject('Excel.Application');
except
Application.MessageBox('Excel没有安装!', '提示信息',
MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
Exit;
end;
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from jj_department');
ADOQuery1.Open;
k:=ADOQuery1.RecordCount;
Excelid.Visible := True;
Excelid.WorkBooks.Add;
Excelid.worksheets.range['A1:c1'].Merge(True);
Excelid.WorkSheets.Cells.Value :='部门编码表' ;
Excelid.worksheets.Range['a1:a1'].HorizontalAlignment := $FFFFEFF4;
Excelid.worksheets.Range['a1:a1'].VerticalAlignment := $FFFFEFF4;
Excelid.WorkSheets.Cells.Value := '组别编号';
Excelid.WorkSheets.Cells.Value := '公司编号';
Excelid.WorkSheets.Cells.Value := '组别名称';
Excelid.worksheets.Range['A1:c1'].Font.Name := '宋体';
Excelid.worksheets.Range['A1:c1'].Font.Size := 9;
Excelid.worksheets.range['A1:c2'].font.bold:=true;
Excelid.worksheets.Range['A2:c2'].Font.Size := 9;
Excelid.worksheets.Range['A2:c2'].HorizontalAlignment := $FFFFEFF4;
Excelid.worksheets.Range['A2:c2'].VerticalAlignment := $FFFFEFF4;
h:=3;
ADOQuery1.First;
while not ADOQuery1.Eof do
begin Excelid.WorkSheets.Cells.Value := Adoquery1.FieldByName('Fdept_id').AsString;
Excelid.WorkSheets.Cells.Value := Adoquery1.FieldByName('Ffdept_id').AsString;
Excelid.WorkSheets.Cells.Value := Adoquery1.FieldByName('Fdept_name').AsString;
Inc(h);
Adoquery1.Next;
end;
s := 'A2:f'+ IntToStr(k+2);
Excelid.worksheets.Range.Font.Name := '宋体';
Excelid.worksheets.Range.Font.size := 9;
Excelid.worksheets.Range.Borders.LineStyle := 1;
Excelid.Quit;
except
Application.MessageBox('导入数据出错!请检查文件的格式是否正确!', '提示信息',
MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
end;
MessageBox(GetActiveWindow(), 'EXCEL数据导出成功!', '提示信息',
MB_OK +MB_ICONWARNING);
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>三; delphi导出EXCEL</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Mask, ComCtrls, StdCtrls, Buttons, Grids, ValEdit, IdBaseComponent,
CheckLst, excel97, ExcelXP, OleServer, ComObj, excel2000, mmsystem, ShellAPI,
ADODB, DB, DBGrids, clipbrd;
Var
FExcel:OleVariant; //excel应用程序FWorkBook :OleVariant; //工作表Temsheet:OleVariant; //工作薄FPicture:OleVariant;//图片tmpstr:String;
range:variant;//范围i,j,TemInt:integer;
TemFileName:String;
begin
SaveDialog1.Filter:='.xls';
if SaveDialog1.Execute then
begin
TemFileName:=SaveDialog1.FileName+'.xls';
Screen.Cursor:=CrHourGlass;
TemInt:=0;
FExcel:= CreateoleObject('excel.Application');
FWorkBook:=FExcel.WorkBooks.Add(-4167); //新的工作表 Temsheet:=FWorkBook.Worksheets.Add;
Temsheet.Name:='利润统计';
Temsheet.Select;
Temsheet.Columns.ColumnWidth:=4;//设置列宽度 Temsheet.Columns.ColumnWidth:=10;
Temsheet.Columns.ColumnWidth:=16;
Temsheet.Columns.ColumnWidth:=10;
Temsheet.Columns.ColumnWidth:=10;
Temsheet.Columns.ColumnWidth:=10;
Temsheet.Columns.ColumnWidth:=10;
Temsheet.Columns.ColumnWidth:=10;
Temsheet.Columns.ColumnWidth:=20;
Temsheet.Columns.ColumnWidth:=15;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge; //合并单元格 tmpstr:=ExtractFilePath(ParamStr(0))+'tem.jpg'; //添加图片 FPicture:=Temsheet.Pictures.Insert(tmpstr);
FPicture.Left:=20;
FPicture.Top:=5;
FPicture.width:=50;
FPicture.height:=50;
FPicture:=null;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Range.Characters.Font.FontStyle :='加粗';
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells:=ComSName;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells:=ComEName;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells:=ComName;
Temsheet.Cells:='联系人:';
Temsheet.Cells:='电话:';
Temsheet.Cells:=ComPhone;
Temsheet.Cells:='传真:';
Temsheet.Cells:=ComFax;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Range.Characters.Font.FontStyle :='加粗';
Temsheet.Cells:='入库信息:';
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Temsheet.Cells:='序号';
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells.Interior.Color:=clGray; //单元格背景色 range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 for i:=0 to DBGrid1.Columns.Count - 1 do
begin
Temsheet.Cells:=DBGrid1.Columns.Title.Caption;
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells.Interior.Color:=clGray; //单元格背景色 range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 end;
//////////////////////////////////////////////
j:=0;
DBGrid1.DataSource.DataSet.First;
while not DBGrid1.DataSource.DataSet.Eof do
begin
Temsheet.Cells.Value:=j+1;
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 for i:=0 to DBGrid1.Columns.Count - 1 do
begin
Temsheet.Cells.Value:=DBGrid1.Fields.AsString;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 end;
DBGrid1.DataSource.DataSet.Next;
j:=j+1;
end;
TemInt:=9+ DBGrid1.DataSource.DataSet.RecordCount;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
TemInt:=TemInt+1;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Range.Characters.Font.FontStyle :='加粗';
Temsheet.Cells:='出库信息:';
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
TemInt:=TemInt+1;
Temsheet.Cells:='序号';
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells.Interior.Color:=clGray; //单元格背景色 range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 for i:=0 to DBGrid2.Columns.Count - 1 do
begin
Temsheet.Cells:=DBGrid2.Columns.Title.Caption;
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 Temsheet.Cells.Interior.Color:=clGray; //单元格背景色 range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 end;
TemInt:=TemInt+1;
//////////////////////////////////////////////
j:=0;
DBGrid2.DataSource.DataSet.First;
while not DBGrid2.DataSource.DataSet.Eof do
begin
Temsheet.Cells.Value:=j+1;
Temsheet.Cells.HorizontalAlignment:=-4108; //字居中 range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 for i:=0 to DBGrid2.Columns.Count - 1 do
begin
Temsheet.Cells.Value:=DBGrid2.Fields.AsString;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 end;
DBGrid2.DataSource.DataSet.Next;
j:=j+1;
end;
TemInt:=TemInt+ DBGrid2.DataSource.DataSet.RecordCount;
TemInt:=TemInt+1;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
TemInt:=TemInt+1;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Range.Characters.Font.FontStyle :='加粗';
Temsheet.Cells:='入库总额:';
Temsheet.Cells:=Trim(Edit1.Text);
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
TemInt:=TemInt+1;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Range.Characters.Font.FontStyle :='加粗';
Temsheet.Cells:='出库总额:';
Temsheet.Cells:=Trim(Edit2.Text);
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
TemInt:=TemInt+1;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
Range.Characters.Font.FontStyle :='加粗';
Temsheet.Cells:='总利润:';
Temsheet.Cells:=Trim(Edit3.Text);
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.select;
range.merge;
range:=Temsheet.Range,Temsheet.cells];//选定表格 range.borders.linestyle:=1;//华线 Application.ProcessMessages;
Screen.Cursor:=CrDefault;
FExcel.WorkBooks.saveas(TemFileName);//保存文件 FExcel.workbooks.close; //关闭工作表 Application.ProcessMessages;
MessageBox(Handle,'导出成功','提示',MB_OK);
//FExcel.visible:=true;
FExcel.quit; //关闭Excel
FExcel := unassigned;
shellexecute(0,'open',PChar(ExtractFileName(TemFileName)),nil,PChar(ExtractFilePath(TemFileName)),SW_Show);
end;
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>四;</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Mask, ComCtrls, StdCtrls, Buttons, Grids, ValEdit, IdBaseComponent,
CheckLst, excel97, ExcelXP, OleServer, comobj, excel2000, mmsystem,
ADODB, DB, DBGrids, clipbrd;四;
procedure TFIND_FM.Button1Click(Sender: TObject);
var
i,j : integer;
reportname, wpath : string;
ExApp1 : TExcelApplication;
ExWrbk1 : TExcelWorkbook;
ExWrst1 : TExcelWorksheet;
begin
if Main_FM.ADOQuery_TEMP.IsEmpty then
begin
Showmessage('沒有可導出的資料!');
Exit;
end
else
begin
Main_FM.SaveDialog1.FileName := 'qcreport';
ifMain_FM.savedialog1.Execute then
begin
//savedialog1.FileName := formatdatetime('YYYYMMDDHHMMSS',now())+'md_orderqc_list.xls';
reportname :=formatdatetime('YYYYMMDDHHMMSS',now())+ExtractFileName(Main_FM.savedialog1.FileName);
//reportname :=formatdatetime('YYYYMMDDHHMMSS',now())+'';
wpath := ExtractFilePath(Main_FM.savedialog1.FileName);
//showmessage(wpath);
try
ExApp1 := TExcelApplication.Create(application);
ExWrbk1 := TExcelWorkbook.Create(application);
ExWrst1 := TExcelWorksheet.Create(application);
ExApp1.Connect;
except
Showmessage('電腦沒裝Excel!無法導出!');
Abort;
end;
try
try
ExApp1.Workbooks.Add(EmptyParam,0);
ExWrbk1.ConnectTo(ExApp1.Workbooks);
ExWrst1.ConnectTo(ExWrbk1.Worksheets as _worksheet);
Main_FM.ADOQuery_TEMP.First;
for j := 0 to Main_FM.ADOQuery_TEMP.FieldCount-1 do
begin
ExWrst1.Cells.Item := Main_FM.ADOQuery_TEMP.Fields.DisplayName;
//
end;
for i := 2 to Main_FM.ADOQuery_TEMP.RecordCount+1 do
begin
for j := 0 to Main_FM.ADOQuery_TEMP.FieldCount-1 do
begin
ExWrst1.Cells.Item := Main_FM.ADOQuery_TEMP.Fields.Value;
end;
Main_FM.ADOQuery_TEMP.Next;
end;
ExWrst1.SaveAs(wpath+reportname);
//ExWrst.SaveAs(formatdatetime('YYYYMMDDHHMMSS',now())+reportname);;
Showmessage('數據已成功導出!');
except
Showmessage('導出失敗!');
abort;
end;
finally
ExApp1.Disconnect;
ExApp1.Quit;
ExApp1.Free;
ExWrbk1.Free;
ExWrst1.Free;
end;
end;
end;
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>delphi导出数据至Excel的三种方法及比较闲来无事,跑到网上搜集了几种导出DataSet至Excel的几种方法。另外使用GetTickcount函数计算时差,以便比较。(本来使用Timer控件,但是Timer不适合做高精度时间计算)使用TADOConnect,TADOQuery查询数据。方法五: 使用TADOQuery + Varaint方法,循环遍历数据集中数据,直接插入到Excel的WookBook单元。这是初学者最易懂和易接受的方法。在下面代码中没有仔细注意语法(比如没有使用try..finally结构体),如果需要使用,请注意://使用ADO循环方式保存。</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>procedure TForm1.btn_WhileClick(Sender: TObject);
var
Eclapp:variant;
n:integer;
filename: string;
t1,t2: Int64;
begin
Eclapp := CreateOleObject('Excel.Application');
Eclapp.WorkBooks.Add;
Eclapp.Visible:= False;
filename :='d:\数据1.xls';
lbl2.Caption := '0';
if FileExists(fileName) then
DeleteFile(fileName);
t1:= GetTickCount;
qry1.DisableControls;
qry1.First;
n:=2;
while not qry1.Eof do
begin
eclapp.cells := qry1.Fields.AsString;
eclapp.cells := qry1.Fields.AsString;
eclapp.cells := qry1.Fields.AsString;
eclapp.cells := qry1.Fields.AsString;
//为了简单,只添加了4个栏位 inc(n);
qry1.Next;
application.ProcessMessages;
end;
qry1.EnableControls;
t2:= GetTickCount;
eclapp.visible := false;
eclapp.Workbooks.SaveAs(filename);
Eclapp.Quit;
Eclapp:= Unassigned;
lbl2.Caption := IntToStr(t2 - t1);
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>方法六:使用OLE方法导入。 先讲TDateSet中的数据保存为二维OLEVariant数组中,再保存到Excel Sheet中 ///使用OLE方式保存。</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>procedure
TForm1.btn_OleVariantClick(Sender: TObject);
var
fileName: string;
xlApp, Sheet: OleVariant;
rowCount, Colcount, index: Integer;
t1,t2: Int64;
function RefToCell(RowID, ColID: Integer): string;
var
ACount, APos: Integer;
begin
ACount := ColID div 26;
APos := ColID mod 26;
if APos = 0 then
begin
ACount := ACount - 1;
APos := 26;
end;
if ACount = 0 then
Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID);
if ACount = 1 then
Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID);
if ACount > 1 then
Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToStr(RowID);
end;
function getData(ds: TDataSet): OleVariant;
var
Data: OLEVariant;
i,j : Integer;
begin
rowCount := ds.RecordCount;
colCount := ds.FieldCount;
Data := VarArrayCreate(, varVariant); //1,rowCount
表示第一维数组的上下标,1,colCount表示第二维数组的上下标 i := 1;
for j := 0 to colCount - 1 do
begin
if not ds.Fields.Visible then
continue;
Data := ds.Fields.DisplayLabel;
end;
Inc(i);
ds.DisableControls;
try
ds.First;
while not ds.Eof do
begin
for j := 0 to colCount - 1 do
begin
Data := ds.Fields.AsString;
end;
Inc(i);
ds.Next;
Application.ProcessMessages;
end;
finally
ds.EnableControls;
end;
result := Data;
end;
begin
fileName := 'd:\数据.xls';
lbl1.Caption := '0';
t1:= GetTickCount;//开始计时if FileExists(fileName) then
DeleteFile(fileName);
xlApp := CreateOleObject('Excel.Application');
try
XLApp.Visible := False;
XLApp.DisplayAlerts := False;
XLApp.Workbooks.Add;
// 删除多余的 worksheet
for index := XLApp.SheetsInNewWorkbook downto 2 do
begin
XLApp.Workbooks.Worksheets.Delete;
end;
Sheet := XLApp.Workbooks.Worksheets;
index := 1;
if index <> 0 then
Sheet := XLApp.Workbooks.Worksheets.Add;
Sheet.Name := qry1.Name;
//Sheet.Columns.NumberFormatLocal := '@'; //设置单元格式为文本 Sheet.Range.Value := getData(qry1);
XLApp.Workbooks.SaveAs(fileName);
finally
if not VarIsEmpty(XLApp) then
begin
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
application.ProcessMessages;
t2:= GetTickCount;
lbl1.Caption := IntToStr( t2 - t1);
end;
end;
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>方法七:现在最流行的文件流方法</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
<pre>.....
var
Form1: TForm1;
arXlsBegin: array of Word = ($809, 8, 0, $10, 0, 0);
arXlsEnd: array of Word = ($0A, 00);
arXlsString: array of Word = ($204, 0, 0, 0, 0, 0);
arXlsNumber: array of Word = ($203, 14, 0, 0, 0);
arXlsInteger: array of Word = ($27E, 10, 0, 0, 0);
arXlsBlank: array of Word = ($201, 6, 0, 0, $17);
Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);
implementation
{$R *.dfm}
//使用文件流procedure incColRow; //增加行列号begin
if Col = ADataSet.FieldCount - 1 then
begin
Inc(Row);
Col :=0;
end
else
Inc(Col);
end;
procedure WriteStringCell(AValue: string);//写字符串数据var
L: Word;
begin
L := Length(AValue);
arXlsString := 8 + L;
arXlsString := Row;
arXlsString := Col;
arXlsString := L;
aFileStream.WriteBuffer(arXlsString, SizeOf (arXlsString));
aFileStream.WriteBuffer(Pointer(AValue)^, L);
IncColRow;
end;
procedure WriteIntegerCell(AValue: integer);//写整数var
V: Integer;
begin
arXlsInteger := Row;
arXlsInteger := Col;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
aFileStream.WriteBuffer(V, 4);
IncColRow;
end;
procedure WriteFloatCell(AValue: double );//写浮点数begin
arXlsNumber := Row;
arXlsNumber := Col;
aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
aFileStream.WriteBuffer(AValue, 8);
IncColRow;
end;
Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);
var
i,j: integer;
Col , row: word;
ABookMark: TBookMark;
aFileStream: TFileStream;
//......
//......
begin
if FileExists(FileName) then DeleteFile(FileName); //文件存在,先删除 aFileStream := TFileStream.Create(FileName, fmCreate);
Try //写文件头 aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin)); //写列头
Col := 0; Row := 0;
if bWriteTitle then
begin
for i := 0 to aDataSet.FieldCount - 1 do
WriteStringCell(aDataSet.Fields.FieldName);
end; //写数据集中的数据
aDataSet.DisableControls;
//ABookMark := aDataSet.GetBookmark;
aDataSet.First ;
while not aDataSet.Eof do
begin
for i := 0 to aDataSet.FieldCount - 1 do
case ADataSet.Fields.DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(aDataSet.Fields.AsInteger);
ftFloat, ftCurrency, ftBCD:
WriteFloatCell(aDataSet.Fields.AsFloat)
else
WriteStringCell(aDataSet.Fields.AsString);
end;
aDataSet.Next;
Application.ProcessMessages;
end;
//写文件尾
AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
//if ADataSet.BookmarkValid(ABookMark) then aDataSet.GotoBookmark(ABookMark);
Finally
AFileStream.Free;
ADataSet.EnableControls;
end;
end;
//调用:procedure TForm1.btn_FileStreamClick(Sender: TObject);
var
t1,t2: Int64;
begin
lbl3.Caption := '0';
t1:= GetTickCount;
ExportExcelFile('d:\数据2.xls',true,qry1);
t2:= GetTickCount;
lbl3.Caption:= IntToStr(t2 - t1);
end;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif"></span></div>
</div>
</div>
</div>
</div>
</div>
<div id="MySignature" role="contentinfo">
<div id="AllanboltSignature"> <div>作者:沧江魅影</div> <div>出处:https://www.cnblogs.com/ynmsnc/</div> <div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.</div> </div><br><br>
来源:https://www.cnblogs.com/ynmsnc/p/18343172
頁:
[1]