【问题标题】:Get excel row as TXT string获取excel行作为TXT字符串
【发布时间】: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这样的东西

标签: excel delphi


【解决方案1】:

一次性读取范围是一种方法(正如您已经尝试过的那样):

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;

将任何单元格值转换为字符串的“更简洁”的方法是使用 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;

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2020-11-29
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2016-10-01
    相关资源
    最近更新 更多