【发布时间】:2016-01-05 07:35:34
【问题描述】:
我正在尝试使用 Delphi 7 从内存中的 XLS 或 XLSX 文件中读取 Excel 工作表。如果可能,我会使用自动化来逐个读取单元格,但是当未安装 Excel 时,我会恢复使用 ADO /ODBC Jet 驱动程序。 我使用任一连接
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=file.xls;Extended Properties="Excel 8.0;Persist Security Info=False;IMEX=1;HDR=No";
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=file.xlsx;Extended Properties="Excel 12.0;Persist Security Info=False;IMEX=1;HDR=No";
我的问题是当我使用以下查询时:
SELECT * FROM [SheetName$]
返回的结果不包含空行或空列,因此如果工作表包含此类行或列,则以下单元格会移动,并且不会在正确的位置结束。我需要“按原样”加载工作表,即确切地知道每个值来自哪个单元格位置。
我尝试通过发出一个表单查询来逐个读取单元格
SELECT F1 FROM `SheetName$A1:A1`
但现在驱动程序返回一个错误,提示“在所选区域之外有数据”。顺便说一句,我不得不使用反引号将名称括起来,因为使用像 [SheetName$A1:A1] 这样的括号会发出语法错误消息。
有没有办法告诉驱动程序按原样选择工作表而不跳过空白?或者也许是一种知道每个值从哪个单元格位置返回的方法?
出于内部政策原因(我知道它们不好,但我不决定这些),不可能使用第三方库,我真的需要它来使用标准的 Delphi 7 组件。
【问题讨论】:
-
你能展示一个这样的excel表的小例子,以及你所说的空行吗?我不确定你到底想要什么......顺便说一句,你试过删除 IMEX=1 吗?这也应该返回空白行。
-
很遗憾我不能给你一个真实的例子,因为这些都不是“小”,这是问题的核心(另一个问题是实际数据是机密的......);数据没有很好地按列排列。例如,“D”列首先包含 5 行文本,然后是徽标,然后是我需要提取的一些数据行,然后是一些文本,然后是我需要提取的更多数据,等等... IMEX= 0 将不起作用,因为该列包含混合类型。
标签: excel delphi odbc delphi-7 ado