在Delphi XE中使用XLSX文件进行ADO

时间:2013-03-11 17:10:19

标签: excel delphi oledb ado ms-jet-ace

这里的问题是与Excel的ADO连接 - 这仍然是在Dephi XE环境中读取/写入Excel文件的标准方法吗?我们在使用ACEOLEDB驱动程序(ACE 12)进行读/写时遇到了多个问题,其中包括

  • 使用主题标签读取单元格不会返回结果
  • 导出网格时
  • “无效浮点”。

我们还注意到在Microsoft的网站上有许多版本的ACE 12驱动程序(通过Access数据库驱动程序可执行文件),它们每个似乎都与Delphi有不同的问题。

考虑到这些事情,

  1. 此时使用ADO与Excel不好吗?
  2. 是否有其他人遇到这些问题以及您采取了哪些措施来解决这些问题(除了使用XLS文件而不是XLSX)?

2 个答案:

答案 0 :(得分:1)

Delphi中的ADO倾向于TDataSet模型,这意味着严格的表格数据...... excel不是。每个excel表格都填充了一个随机单元格,其中一些可能构成quazi-tabular范围,或者可能不是。

根据已安装的软件,您可以

1)使用Excel应用程序打开XLSX,读取单元格并将它们传递给您的程序。这是最简单和兼容的方法,但由于COM IPC编组和切换而显然很慢。有一些技巧可以固定它,比如隐藏Excel窗口,复制数据数据而不是逐个单元格的方法等。
开始探索TExcelApplication组件 - http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Component_Wrappers

2)如果您不想依赖安装商业Excel,可以尝试使用OpenOffice读取XLSX文件。 Vanilla OpenOffice只能读取它们,但其他一些发行版也可以编写它们。 OpenOffice还公开了基于COM和基于HTTP的外部API。我知道有Delphi的Delphi项目 - OOo进行交互,但个人并没有使用它们,除了注意到这种方法,我可以说没有详细的评估。

3)Microsoft也曾经出售Office for Developers等,它为您提供了Access和Excel内核作为可再发行组件,您可以将其与您的应用程序一起传递并安装并使用它们。不知道Dunno是否仍然可行。

4)有一组商业组件直接读取和写入这些文件,而不需要让外部EXE完成这项工作。虽然这将是最快速的工作方式,但它只支持某些功能子集(可能或可能不适合您的特定目标),并且可能会遇到“未来兼容性”的麻烦,因为Microsoft将推出更新版本的XLS和XLSX格式(这可能对您有些担忧或无关紧要)。就像Biff8格式有TXLSFile一样,例如OExport library。还有一个来自着名的TMS Studio and maybe some more的组件。

5)您可以加入一些开源项目并尝试根据您的需求进行增强,然后再取决于您需要多少子集。

我知道,很多人成功地使用OLE DB访问Excel数据,但对我来说它总是听起来像perversino,因为Excel文件根本就没有任何内部常规数据排列,不那么严格的表格式RDBMS就像一个

答案 1 :(得分:1)

我真的只发​​现可以通过COM操作Excel。我尝试过替代方案,比如ADO,但它们似乎总是充满了古怪的错误 - 或许这只是我的无知。

COM在某些领域肯定很慢。我已经使用了COM和(在Excel文件中)VBA的组合来实现我需要做的事情。

鉴于Excel不会消失但是微软不能依赖于不要背叛其用户,例如,取消VBA和COM支持,如果有人在某个地方(我希望我拥有它)会很棒技能)可以从Delphi中为Excel创建一些适当的支持。