在开发数据库应用程序中,经常要将类型相同的数" />
乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > <em>delphi</em> 如何写入<em>Excel</em>-d

<em>delphi</em> 如何写入<em>Excel</em>-d

作者:乔山办公网日期:

返回目录:excel表格制作


这个太简单了,我有,给我发消息,给我你的邮箱地址

在开发数据库应用程序中,经常要将类型相同的数据导出来,放到Excel文件中,利用Excel强大的编辑功能,对数据作进一步的加工处理。这有许多的方法,我们可以使用OLE技术,在Delphi中创建一个自动化对象,通过该对象来传送数据。也可以使用ADO,通过与Excel数据存储建立连接,使用ADO这种独立于数据库后端的技术来导出数据集的数据。
可这两种技术都有一个共同的缺点,那就是慢,数据量少还好,用户不会有太多的感觉,可一旦数据量大,比如,超过1千条,速度就让人难以忍受了,那么有没有更好的办法,既可以快速地导出数据,又不用安装附加的软件。也许好多人都想到了剪贴板的方式,这种方式速度是快,可也有不好的一面,那就是数据量大占用内存也大,并且在Excel中调用PASTE方法时,需要锁定输入,这使用起来,就有点不方便了
这里我为大家介始一种比较好的方法,使用文件流的方式,通过TfileStream直接写入Excel文件。我写了一个函数,通过它可将数据集中的数据直接导入到Excel文件中。测试了一下,1M的数据,不到十秒就完成了。附源程序。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,DB, ADODB, Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
ADOTable1: TADOTable;
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADOTable1record_id: TIntegerField;
ADOTable1action_id: TIntegerField;
ADOTable1action_name: TStringField;
ADOTable1net_name: TStringField;
ADOTable1deal_no: TStringField;
ADOTable1name: TStringField;
ADOTable1getno_date: TDateTimeField;
ADOTable1window_no: TIntegerField;
ADOTable1staff_id: TStringField;
ADOTable1staff_name: TStringField;
ADOTable1deal_date: TDateTimeField;
ADOTable1deal_type: TStringField;
ADOTable1finish_date: TDateTimeField;
ADOTable1state: TStringField;
ADOTable1appraise: TStringField;
ADOTable1appraised_flag: TBooleanField;
ADOTable1cancel_led_time: TDateTimeField;
ADOTable1wait_time: TBCDField;
ADOTable1wait_time2: TStringField;
ADOTable1accept_time: TBCDField;
ADOTable1accept_time2: TStringField;
ADOTable1getnumber_addr: TIntegerField;
ADOTable1cust_level: TIntegerField;
ADOTable1cust_level_name: TStringField;
ADOTable1cust_level_name_remark: TStringField;
ADOTable1operation_sum: TIntegerField;
Button1: TButton;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
arXlsBegin: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
arXlsEnd: array[0..1] of Word = ($0A, 00);

arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);

arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0);

arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);
implementation

{$R *.dfm}

Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);
var
i, j: integer;
Col, row: word;
ABookMark: TBookMark;
aFileStream: TFileStream;
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[1] := 8 + L;
arXlsString[2] := Row;
arXlsString[3] := Col;
arXlsString[5] := L;
aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
aFileStream.WriteBuffer(Pointer(AValue)^636f7079e799bee5baa6337, L);
IncColRow;
end;
procedure WriteIntegerCell(AValue: integer);//写整数
var
V: Integer;
begin
arXlsInteger[2] := Row;
arXlsInteger[3] := Col;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
aFileStream.WriteBuffer(V, 4);
IncColRow;
end;
procedure WriteFloatCell(AValue: double);//写浮点数
begin
arXlsNumber[2] := Row;
arXlsNumber[3] := Col;
aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
aFileStream.WriteBuffer(AValue, 8);
IncColRow;
end;
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[i].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[i].DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(aDataSet.Fields[i].AsInteger);
ftFloat, ftCurrency, ftBCD:
WriteFloatCell(aDataSet.Fields[i].AsFloat)
else
WriteStringCell(aDataSet.Fields[i].AsString);
end;
aDataSet.Next;
end;
//写文件尾
AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if ADataSet.BookmarkValid(ABookMark) then
aDataSet.GotoBookmark(ABookMark);
finally
AFileStream.Free;
ADataSet.EnableControls;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
ExportExcelFile(SaveDialog1.FileName,True,DBGrid1.DataSource.DataSet);
end;
end;

end.
2007以上的Excel文件应该是(*.xlsx),直接另存xls会弹出不能识别对话框。
另外,代码上面可以看一下我的zd测试:
var MyExc,myBook,mySheet,fn:OleVariant;
begin
//p:=EmptyParam;
MyExc:=CreateOleObject('Excel.Application');
myBook:=MyExc.WorkBooks.Add;
mySheet:=myBook.ActiveSheet;
mySheet.Cells[1,1]:='不好玩儿!';
MyExc.Visible:=True;
with dlgSave1 do
begin
DefaultExt:='xlsx';

if Execute() then
begin
fn:=FileName;
myBook.SaveAs(fn);
end;

end;

end;

procedure TForm1.btnExcelClick(Sender: TObject);
var ExcelApp: Variant;
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := True;
ExcelApp.Caption := '应用程序调copy用 Microsoft Excel';
ExcelApp.WorkBooks.Open( 'e:\test\test.xls' );
ExcelApp.WorkSheets['sheet1'].Activate;
ExcelApp.Cells[1,4].Value := '第一行第四zd列';
ExcelApp.ActiveWorkBook.save;
ExcelApp.Quit;
end;

相关阅读

  • <em>delphi</em> 如何写入<em>Excel</em>-d

  • 乔山办公网excel表格制作
  • 这个太简单了,我有,给我发消息,给我你的邮箱地址delphi中SaveDialog用把stringGrid..." src="/uploads/tu/675.jpg" style="width: 400px; height: 267px;" />在开发数据库应用程序中,经常要将类型相同的数
  • <em>delphi</em>7<em>导出excel</em>的问题-

  • 乔山办公网excel表格制作
  • 我觉得你这种用list方式导Excel,造成你导出的问题,因为里面有换行符号。我一般都用以下代码转Excel,你可以试试! procedure TForm_main.btn_excelClick(Sender: TObject);var XL: Variant; //打开EXCEL文
关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网