【发布时间】:2017-08-28 11:43:56
【问题描述】:
德尔福 XE10。我需要从 Excel 工作表中逐行读取作为(制表符分隔的)字符串。当您使用“选择一行 - 复制 - 在记事本中粘贴”时会得到什么。工作表包含各种格式的字符串、数字和日期。 什么是这样的:
function TexcelSource.nextRow: string;
var k : integer;
begin
result:=sheet.cells.items[currentRow,1].text;
for k:=2 to maxCol do
result:=result+tab+sheet.cells.items[currentRow,k].text;
inc(currentRow)
end;
其中 sheet 是对 excel 工作表的引用(var Variant):
XLApp:=createOLEobject('excel.application');
XLApp.Workbooks.open(filename) ;
Sheet:=XLApp.WorkSheets[1] ;
MaxRow:=Sheet.Usedrange.EntireRow.count ;
MaxCol:=sheet.Usedrange.EntireColumn.count;
但是,它的速度慢得令人无法接受。我尝试一步将整个工作表作为数组导入并从数组中读取:
sheetData:=Sheet.UsedRange.Value;
这已经足够快了,但我无法将所有 sheetData[row,col] 作为字符串值。它返回具有字符串值的单元格,但在具有整数值的单元格处停止,并出现错误“无法将类型的变体 (UnicodeString) 转换为类型 (Double)”。 (该元素的 VarType 似乎是 vtPointer - 我不明白;我也不明白错误。)
我也尝试过通过 Delphi 剪贴板进行复制和粘贴。工作一段时间,然后剪贴板变得不可用。无论如何,这不是我喜欢的操作系统方法。
我欢迎有关如何将工作表行读取为具有可接受性能的字符串的建议。
【问题讨论】:
-
哪个 Excel 版本?
-
没有XE10,FWIW这样的东西