2

我正在尝试编写一个 Delphi 程序,该程序将遍历 Excel 文件中的每个工作表并格式化一些单元格。不过,我在尝试对 Workbook.Worksheets 集合使用 for-in 循环时收到错误消息。错误具体是:

[DCC 错误] Office.pas(36):E2431 for-in 语句无法对集合类型“Sheets”进行操作,因为“Sheets”不包含“GetEnumerator”的成员,或者无法访问

发生这种情况的代码行是:

for Worksheet in Workbook.Worksheets do

Worksheet和Workbook的定义如下:

var ExcelApp: ExcelApplication;
var Workbook: ExcelWorkbook;
var Worksheet: ExcelWorksheet;

我正在将此代码从 C# 移植到 Delphi,它可以在其中工作。有谁知道为什么我会收到这个 GetEnumerator 错误?我正在使用 Office 2007 Excel 互操作文件和 Embarcadero® Delphi® 2010 版本 14.0.3593.25826。

4

3 回答 3

1

C# 处理类似于 Delphi 的枚举器。有一个 IEnumerable 接口,它有两个方法:MoveNext 和 Reset;还有一个名为 Current 的属性。

对于 ExcelWorkBook.Sheets 属性,你应该注意,虽然 MSDN 文档说它有一个 GetEnumerator 方法,但是 Delphi 提供的 ExcelXP 单元中的这个类的定义并没有提供这样的方法。因此,也许您必须将其类型库的较新版本导入 Delphi。

于 2010-03-15T18:29:39.187 回答
1

我不确定 C# 如何处理可枚举集合,但对于 Delphi,它会在集合上查找一个名为 GetEnumerator 的方法,该方法返回一个枚举器。枚举器必须是至少包含以下两个成员的数据结构:

public
  function MoveNext: boolean;
  property Current: <some type> read <some read method>;
end;

如果 Delphi 说“Sheets”不包含“GetEnumerator”的成员,或者它不可访问,那么这正是它所说的。表格上没有 GetEnumerator,或者它不是公共方法。Sheets的定义是什么样的?

于 2010-03-15T17:18:36.520 回答
0

编辑:根据评论,该对象存在 GetEnumerator 方法,因此此解决方案可能不正确。

自从我使用 Delphi 以来已经有一段时间了,但我基于错误的猜测是 ExcelWorksheet 集合未枚举,这意味着执行 for/each 样式循环将不起作用,您需要使用 C-像 for 循环:

 For  i := 1 to Length(Workbook.Worksheets) do
  Worksheet = Workbook.Worksheets[i];
end;
于 2010-03-15T17:08:09.387 回答