Delphi 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剪贴板复制和粘贴。工作一段时间,然后剪贴板变得不可用。无论如何,这不是我喜欢的操作系统方法。
我欢迎有关如何将工作表行读取为具有可接受性能的字符串的建议。
答案 0 :(得分:0)
一次性阅读范围就是这样做的方式(正如您已经尝试过的那样):
sheetData := Sheet.UsedRange.Value;
如果我在循环中直接连接sheetData
元素,我可以重现你得到的错误。我没有调查错误的原因。
但是,如果首先将每个元素分配给string
变量,则没有错误,然后连接该变量。因此,以下使用临时字符串变量tmpstr
的解决方法适用于各种数值:
for row := ...
begin
rowstr := sheetData[row, 1];
for col := 2 to ...
begin
tmpstr := sheetData[row, col];
rowstr := rowstr + tab + tmpstr;
end;
// use rowstr as needed
end;
A"清洁工"将任何单元格值转换为字符串的方法是使用VarToStr()
函数,该函数至少存在于Delphi 7中。
for row := ...
begin
rowstr := sheetData[row, 1];
for col := 2 to ...
rowstr := rowstr + tab + VarToStr(sheetData[row, col]);
// use rowstr as needed
end;