1

这是我第一次使用 C# 处理 excel 文件。

作为演示,我在 excel 文件中写了一行,它可以工作,但现在我试图插入 DataTable 的所有行,但它给出了以下错误:

“HRESULT:0x800A03EC”

这是代码:

for (int i = 0; i < table.Rows.Count; i++)
{
    xlWorkSheet.Cells[i, 1] = table.Rows[i]["Ref"].ToString();
    xlWorkSheet.Cells[i, 2] = table.Rows[i]["Name"].ToString();
}

请告诉我我该如何解决?

4

3 回答 3

1

而不是 DataTable,将所有值放入object[,]

然后,您可以一口气分配它们:

using (var targetRangeHeader = _excelApp.Range[TargetRangeTopAddress].WithComCleanup())
 using (var targetRangeFirstDataCell = targetRangeHeader.Resource.Offset[1, 0].WithComCleanup())
  using (var targetRange = targetRangeFirstDataCell.Resource.Resize[MyObjectArrayValues.Length, 1].WithComCleanup())
{
 targetRange.Resource.Value2 = MyObjectArrayValues;

使用http://jake.ginnivan.net/vsto-com-interop

于 2012-07-20T01:26:05.017 回答
1

改为使用Range.ValueWorksheet.Cells属性是只读的:

for (int i = 0; i < table.Rows.Count; i++)
{
    xlWorkSheet.Cells[i, 1].Value = table.Rows[i]["Ref"].ToString();
    xlWorkSheet.Cells[i, 2].Value = table.Rows[i]["Name"].ToString();
}
于 2012-07-20T00:35:09.143 回答
0

我全心全意地支持 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();

默认属性让初学者更容易编写代码,也有助于代码简洁,但对于介于初学者和高级阶段的人来说,它也会感到困惑。

于 2012-07-20T04:09:38.530 回答