处理 Excel 表格
如果你需要使用 Delphi 处理 Excel 表格,大概有几种方式。
- 使用 ADOConnection,前提是你的电脑里面安装了:Microsoft Access Database Engine 2016 Redistributable,下载地址:https://www.microsoft.com/en-hk/download/details.aspx?id=54920;
- Delphi 有好几个用于 Excel 的收费控件。
- 用 Python 处理 Excel 的库,然后在 Delphi 里面使用 Python4Delphi 控件操作 Python。
- 今天要介绍的 Delphi 开源代码库 Office4D。
几种不同方式的分析
- ADO 方式:此方式代码简单,导入后就是一个 TADODataSet,剩下的就是操作 DataSet 的代码了。都不用去分析有哪些字段。问题是微软的那个驱动可能有问题,如果 Excel 文件比较大,记录条数比较多,关闭 ADO 连接会耗时很长,ADOConnection1.Close 可能要等几十秒到几分钟才会执行完毕。如果在主线程里面执行,则会让程序直接冻结几十秒,显然不行。即便放到线程里面,如果程序导入结束立即退出,则线程里面的 ADOConnection1.Close 没执行完成,程序也无法退出。
- 收费控件,钱包不友好;
- 目标机器要专门安装 Python 环境,还要在 Python 环境里面用 pip 命令安装处理 Excel 的库,对用户不友好。除非专门做一个安装程序。
- Office4D 简单好用,开源免费。当然,导入数据的代码比 ADO 方式稍微多一点。
Office4D 的用法
uses Office4D.Word,
Office4D.Excel;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Fn: string;
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
i: Integer;
S, S1: string;
begin
if not OpenDialog1.Execute() then
begin
Exit;
end;
Fn := Opendialog1.FileName;
//Workbook 是接口,用完就不用管释放了。
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile(Fn);
Sheet := Workbook.Sheets[0];
for i := 0 to 26 do
begin
S := 'B' + i.ToString;
Log(Sheet.Cell[S].AsString);
end;
Log('');
for i := 0 to 30 do
begin
S := 'D' + i.ToString;
S1 := Sheet.Cell[S].AsString;
if (S1 = '') and (i > 2) then
begin
S1 := '结束:' + i.ToString;
Log(S1);
Break;
end
else
begin
Log(S1);
end;
end;
Log('');
for i := 0 to 8 do
begin
S := 'E' + i.ToString;
Log(Sheet.Cell[S].AsString);
end;
end;
procedure TForm1.Log(S: string);
begin
Memo1.Lines.Add(S);
end;
说明
- 注意 uses 部分,有 Office4D.Word. 它也能处理 Word 文件。它自己带的例子里面有代码。
- 实际测试,打开大的 Excel 文件,导入结束后,退出程序,并不像 ADO 那样要等待很久。
- 接口方式编程:Workbook 是接口。Delphi 的接口是引用计数,没用了会自动释放接口背后的对象实例。因此不需要管对象释放的问题。不用担心内存泄漏的问题。