delphi 如何写入Excel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 如何写入Excel相关的知识,希望对你有一定的参考价值。

本人是菜鸟
现需要将字符串"abc"和当前时间添加到某Excel的末尾,应如何写代码。
代码要完整的,包括如何创建Excel对象,需use哪些东西,和具体写入代码,望各位高人指点,谢啦!

在开发数据库应用程序中,经常要将类型相同的数据导出来,放到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)^, 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.
参考技术A 在数据库应用软件的开发过程中,经常需要把数据转换成Excel文件,让用户作进一步的数据处理。而BorlandDelphi是开发数据库应用系统的常用工具,如何在Delphi中操作Excel呢?
我们知道,在MicrosoftOffice软件中有一种内嵌的编程语言,即VBA,它是一种宏语言、VB的子集。利用它,你可以编写出功能强大的代码,如打开文件、修改数据、保存数据、设置字体等。另一方面,MicrosoftOffice软件中的宏能以VBA代码的形式记录下你的操作过程。因此借助宏操作,可以很轻松地实现某一功能,并把这些代码稍作修改嵌入到你的软件中。但是VBA的一个缺点是,它必需有MicrosoftOffice作平台,在哪里编写,必须在哪里执行。例如在Excel下编写的一段VBA代码,则它只有在Excel下才能运行。
关于Excel中的VBA编程方法、Excel对象属性、方法说明可以在Office的安装(完全安装)目录下的VBAXL8.hlp帮助文件中找到。
因此,只有把VBA代码嵌入到BorlandDelphi中,才能实现用Delphi操作Excel。
下面,以Delphi为例,说明这种调用方法。
Unit excel;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,StdCtrls,ComObj;
ComObj是操作OLE对象的函数集type TForm1 =
class(Tform)
Button1: Tbutton;
procedure Button1Click(Sender: Tobject);
private
Private declarations
public
Public declarations
end;

var
Form1: TForm1;

implementation

$R*.DFM

procedure TForm1.Button1Click(Sender: Tobject);
var
eclApp,WorkBook:Variant;
声明为OLE Automation对象
xlsFileName:string;begin
xlsFileName:='ex.xls';
try
创建OLE对象:Excel Application与 WorkBook
eclApp:=CreateOleObject('Excel.Application');
WorkBook:=CreateOleobject('Excel.Sheet');
except
ShowMessage('您的机器里未安装Microsoft Excel.');
Exit;
end;

try
ShowMessage('下面演示:
新建一个XLS文件,并写入数据,最后
关闭它');
workBook:=eclApp.workBooks.Add;
eclApp.Cells(1 , 1):='字符型';
eclApp.Cells(2 , 1):='Excel文件';
eclApp.Cells(1 , 2):='Money型';
eclApp.Cells(2 , 2):=10.01;
eclApp.Cells(1 , 3):='日期型'
;eclApp.Cells(2 , 3):=Date;

WorkBook.saveas(xlsFileName);
WorkBook.close;

ShowMessage('下面演示:打开刚创建的XLS文件,
并修改其中 的内容,然后,由用户决定是否保存。');
WorkBook:=eclApp.workBooks.Open(xlsFileName);
eclApp.Cells(2 , 1):='Excel文件类型';
if MessageDlg(xlsFileName+'文件已被修改,
是否保存?',mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
WorkBook.save
else
workBook.Saved := True; 放弃修改
WorkBook.Close;

eclApp.Quit; //退出Excel Application
释放VARIANT变量
eclApp:=Unassigned;
except
ShowMessage('不能正确操作Excel文件。
可能是该文件已被其他程序打开,或系统错误');
WorkBook.close;
eclApp.Quit;
释放VARIANT变量
eclApp:=Unassigned;
end;
end;
end.
了解上述操作过程后,我们可以很容易地将数据库中的数据转换成Excel文件了。pp.Cells(1 , 1):='字符型';
eclApp.Cells(2 , 1):='Excel文件';
eclApp.Cells(1 , 2):='Money型';
eclApp.Cells(2 , 2):=10.01;
eclApp.Cells(1 , 3):='日期型'
;eclApp.Cells(2 , 3):=Date;

WorkBook.saveas(xlsFileName);
WorkBook.close;

ShowMessage('下面演示:打开刚创建的XLS文件,
并修改其中 的内容,然后,由用户决定是否保存。');
WorkBook:=eclApp.workBooks.Open(xlsFileName);
eclApp.Cells(2 , 1):='Excel文件类型';
if MessageDlg(xlsFileName+'文件已被修改,
是否保存?',mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
WorkBook.save本回答被提问者采纳
参考技术B 看这里很全了http://www.officexy.com/Articles/office/Cowork_programing/2006102993750107.htm

如何使用 OpenOffice 通过 Matlab 写入 Excel 文件?

【中文标题】如何使用 OpenOffice 通过 Matlab 写入 Excel 文件?【英文标题】:How to write to an Excel file through Matlab using OpenOffice? 【发布时间】:2011-10-07 21:45:00 【问题描述】:

我想在 Matlab 中编写一个用于写入 excel 文件的模块。我在 Windows Vista 中使用 Openoffice。

我有一个可以使用 Microsoft excel 的模块,因为我没有 Microsoft Office,所以它会引发异常。

这是我想更改为适用于 openoffice 的 Matlab 代码段

Excel = actxserver ('Excel.Application');

此代码段正在引发异常。知道如何更改代码以适用于开放式办公室吗?

我不熟悉用于读取/写入 excel 文件的 Matlab API

【问题讨论】:

【参考方案1】:

这并不完全是 Matlab 所做的。您正在创建一个 Excel ActiveX 对象并通过它创建文件。结果是 Excel 本身正在写入文件,因为您只是在控制 Excel。

OpenOffice 似乎允许类似的东西,即使 ActveX。 Here 是介绍。但您可能必须重新创建从头开始创建文件的所有代码,因为 API 不兼容。

【讨论】:

【参考方案2】:

正如@Joey 所说,您需要重新编写所有与 excel 相关的代码才能让 Excel 创建 XLS 文件。如果您需要编写一些允许您根据安装的内容在 Excel 和 OpenOffice 之间切换的东西,那么我将使用 MATLAB OOP 功能通过创建一个实现流程的抽象基类和派生类来包装 Excel-和基于 OOO 的低级命令。

【讨论】:

以上是关于delphi 如何写入Excel的主要内容,如果未能解决你的问题,请参考以下文章

[delphi]如何调用excel文档

如何关闭运行中的excel.exe delphi

Delphi 如何操作Excel

delphi如何实现像excel中那样,有多个窗口,窗口可以最大化。但是只能在父窗口移动

delphi数据如何导出为excel

Delphi 窗体中怎样嵌入网页