我全心全意地支持 Jeremy Thompson 使用二维对象数组的回答。性能将快几个数量级。我写信是为了解释为什么您编写的代码不起作用(以及为什么您可能认为它应该起作用)。
在 Visual Basic 中,有一个“默认”属性的概念。当您在 VBA 中编写此代码时,您正在使用该概念:
xlWorkSheet.Cells(i, 1) = someValue
Cells 属性返回一个 Range 对象。在 VBA 中,由于您没有使用 Set 关键字,因此该行不会重新分配对象的值(并且,如果您添加了 Set 关键字,它将无法重新分配对象的值,因为它是只读的财产,正如 Ria 所指出的)。
缺少 Set 关键字会导致分配转到由返回的 Range 对象的默认属性Cells(i, 1)
。当然,默认属性是 Value 属性。换句话说,上面的 VBA 示例等价于:
Dim r As Range
Set r = xlWorkSheet.Cells(i, 1)
r.Value = someValue
当然,你也可以跳过r
变量:
xlWorkSheet.Cells(i, 1).Value = someValue
现在,C# 没有默认属性概念。因此,您无法以快捷方式编写此代码,这导致我们使用 Ria 回答中建议的代码:
xlWorkSheet.Cells[i, 1].Value = someValue;
或者,用实际值代替someValue
:
xlWorkSheet.Cells[i, 1].Value = table.Rows[i]["Ref"].ToString();
默认属性让初学者更容易编写代码,也有助于代码简洁,但对于介于初学者和高级阶段的人来说,它也会感到困惑。