delphi,当在Excel Interop Worksheets集合上使用for循环时,我该怎么做“没有GetEnumerator存在”错误?

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

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

这发生的代码行是:

for Worksheet in Workbook.Worksheets do 

工作表和工作簿的定义如下:

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

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

提前致谢。

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

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

如果delphi说“表格”不包含“GetEnumerator”的成员,或者它是无法访问的,那就意味着它正是如此。 表格上没有GetEnumerator,或者它不是公共方法。 Sheets的定义是什么样的?

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

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

编辑:基于注释,GetEnumerator方法存在的对象,所以这个解决scheme可能是不正确的。

我已经使用Delphi了一段时间了,但是基于错误的猜测是,ExcelWorksheet集合没有被枚举,这意味着做一个for / each样式循环是行不通的,你需要使用C-像循环一样:

  For i := 1 to Length(Workbook.Worksheets) do Worksheet = Workbook.Worksheets[i]; end;