在C#中创建excel文件

时间:2012-07-20 00:31:51

标签: c# winforms excel excel-interop

这是我第一次使用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();
}

请告诉我如何解决?

3 个答案:

答案 0 :(得分:1)

请改用Range.ValueWorksheet.Cells属性是readonly:

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();
}

答案 1 :(得分:1)

将所有值放入object[,]

,而不是DataTable

然后你可以一举分配它们:

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

答案 2 :(得分:0)

我全心全意地赞同杰里米·汤普森使用二维物体阵列的答案。性能将提高几个数量级。我正在写信解释为什么你写的代码不起作用(为什么你认为它应该有用)。

在Visual Basic中,有一个“默认”属性的概念。当你在VBA中写这个时,你正在使用这个概念:

xlWorkSheet.Cells(i, 1) = someValue

Cells属性返回一个Range对象。在VBA中,由于您没有使用Set关键字,因此该行不会重新分配对象的值(如果添加了Set关键字,则无法重新分配对象的值,因为它是只读的如里亚指出的那样,财产。

缺少Set关键字会导致赋值转到Cells(i, 1)返回的Range对象的默认prpoperty。当然,默认属性是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();

默认属性使初学者可以轻松编写代码,并且它有助于简化代码,但对于处于初级阶段和高级阶段的人来说,这也会让人感到困惑。