获取excel行作为TXT字符串

时间:2017-08-28 11:43:57

标签: excel delphi

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剪贴板复制和粘贴。工作一段时间,然后剪贴板变得不可用。无论如何,这不是我喜欢的操作系统方法。

我欢迎有关如何将工作表行读取为具有可接受性能的字符串的建议。

1 个答案:

答案 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;