在 Delphi 中操作 Excel 2007(以及更新的 Office 版本,如 2010、2013、2016、2019 和 Microsoft 365),通常有以下几种主流方式,由于 Excel 2007 使用的是 .xlsx 格式(基于 Open XML),但 Delphi 通过 COM 自动化接口操作 Excel 时,底层逻辑与旧版 .xls 基本一致,主要区别在于文件扩展名和某些新特性支持。
以下是几种常用方法,按推荐程度排序:
使用 COM 自动化(OLE Automation) 最常用
这是最直接的方式,需要客户端安装 Microsoft Excel,它适用于需要精确控制 Excel 界面、图表、公式等场景。
基本步骤
- 创建 Excel 应用程序对象。
- 添加工作簿和工作表。
- 读写单元格数据。
- 保存并释放资源。
示例代码(Delphi)
uses
ComObj, ActiveX, Variants;
procedure CreateExcel2007;
var
ExcelApp, Workbook, Worksheet: Variant;
FileName: string;
begin
// 初始化 COM
CoInitialize(nil);
try
// 创建 Excel 应用程序对象
ExcelApp := CreateOleObject('Excel.Application');
// 设置可见性(调试时可设为 True,生产环境建议 False)
ExcelApp.Visible := False;
// 添加一个新工作簿
Workbook := ExcelApp.Workbooks.Add;
Worksheet := Workbook.Worksheets[1];
// 写入数据(Excel 2007 支持最大 1,048,576 行)
Worksheet.Cells[1, 1] := '姓名';
Worksheet.Cells[1, 2] := '年龄'
;
Worksheet.Cells[2, 1] := '张三';
Worksheet.Cells[2, 2] := 25;
Worksheet.Cells[3, 1] := '李四';
Worksheet.Cells[3, 2] := 30;
// 设置列宽自适应(可选)
Worksheet.Columns[1].AutoFit;
Worksheet.Columns[2].AutoFit;
// 保存为 Excel 2007+ 格式 (.xlsx)
FileName := 'C:TempTestExcel2007.xlsx';
// xlOpenXMLWorkbook = 51 (Excel 2007+ .xlsx 格式)
Workbook.SaveAs(FileName, 51);
// 关闭工作簿
Workbook.Close(False);
// 退出 Excel
ExcelApp.Quit;
// 释放变量
Worksheet := Unassigned;
Workbook := Unassigned;
ExcelApp := Unassigned;
ShowMessage('Excel 文件已创建:' + FileName);
except
on E: Exception do
begin
ShowMessage('错误:' + E.Message);
// 确保 Excel 进程被终止
try
ExcelApp.Quit;
except
end;
end;
end;
CoUninitialize;
end;
关键常量说明
| 常量名 | 值 | 说明 |
|---|---|---|
xlOpenXMLWorkbook |
51 | 保存为 .xlsx(Excel 2007+) |
xlExcel8 |
56 | 保存为 .xls(旧版) |
xlNormal |
-4143 | 正常显示模式 |
⚠️ 注意:使用 COM 自动化时,务必确保正确释放对象,否则会在后台残留
EXCEL.EXE进程。
使用第三方库(无需安装 Excel)
如果目标机器上没有安装 Microsoft Excel,或你希望提高性能、避免 COM 开销,建议使用第三方库。
推荐库:
- TMS Excel(商业)
- DevExpress VCL(商业)
- FastReport(商业,支持导出 Excel)
- LibXL(商业,轻量级)
- OpenXML 相关开源库(如
Delphi-OpenXML)
这些库可以直接生成 .xlsx 文件,无需依赖 Excel 应用程序,适合服务器端或无 GUI 环境。
直接生成 XML/ZIP 文件(高级)
Excel 2007 的 .xlsx 文件本质上是一个 ZIP 压缩包,内部包含多个 XML 文件,你可以手动构造这些文件并打包为 .xlsx。
- 优点:完全独立,无需 Excel 或第三方库。
- 缺点:开发复杂度高,需熟悉 Open XML 规范。
- 适用场景:对文件大小、性能有极致要求,且不需要 Excel 功能。
常见问题与注意事项
-
Excel 版本兼容性:
- Delphi 通过 COM 操作 Excel 时,使用的是客户端安装的 Excel 版本。
- 如果你用 Delphi 连接 Excel 2016,可以读写 Excel 2007 的文件,但某些新特性(如新函数)可能不被支持。
- 保存时指定
51(xlOpenXMLWorkbook)即可生成.xlsx文件。
-
性能优化:
- 大量数据写入时,建议关闭屏幕更新和自动计算:
ExcelApp.ScreenUpdating := False; ExcelApp.Calculation := -4135; // xlCalculationManual
- 写入完成后恢复:
ExcelApp.ScreenUpdating := True; ExcelApp.Calculation := -4105; // xlCalculationAutomatic
- 大量数据写入时,建议关闭屏幕更新和自动计算:
-
内存泄漏:
- 始终使用
Unassigned释放 Variant 变量。 - 使用
try...finally确保 Excel 进程被终止。
- 始终使用
-
64 位 Delphi 与 32 位 Excel 的兼容性问题:
- Delphi 编译为 64 位,而系统只安装了 32 位 Excel,COM 自动化会失败。
- 解决方案:
- 安装 64 位 Office。
- 或将 Delphi 项目编译为 32 位。
- 或使用第三方库(不依赖 COM)。
- 快速开发 + 有 Excel 环境 → 使用 COM 自动化(方法一)。
- 无 Excel 环境 / 服务器端 / 高性能 → 使用 第三方库(方法二)。
- 极致控制 / 无依赖 → 使用 OpenXML 手动构建(方法三)。
对于大多数 Delphi 开发者,方法一 是最简单且功能最全面的解决方案,只需注意保存时使用格式代码 51 即可兼容 Excel 2007+。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/483036.html



