在C#中创buildexcel文件

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

请告诉我如何解决?

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

把所有的值放到一个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

我完全赞同Jeremy Thompson的答案,使用二维对象数组。 性能会提高几个数量级。 我正在写解释为什么你写的代码不工作(以及为什么你可能认为它应该工作)。

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

 xlWorkSheet.Cells(i, 1) = someValue 

Cells属性返回一个Range对象。 在VBA中,由于没有使用Set关键字,因此这一行不会重新指定对象的值(并且,如果添加了Set关键字,将无法重新分配对象的值,因为它是只读的财产,如Ria笔记)。

Set关键字的缺失导致赋值转到由Cells(i, 1)返回的Range对象的默认prpoperty。 默认属性当然是Value属性。 换句话说,上面的VBA示例等同于:

 Dim r As Range Set r = xlWorkSheet.Cells(i, 1) r.Value = someValue 

当然,你也可以跳过rvariables:

 xlWorkSheet.Cells(i, 1).Value = someValue 

现在,C#没有默认的属性概念。 因此,您无法将此代码编写为快捷方式,这导致了我们在Ria的答案中提出的代码:

 xlWorkSheet.Cells[i, 1].Value = someValue; 

或者,用真实的价值而不是一些价值:

 xlWorkSheet.Cells[i, 1].Value = table.Rows[i]["Ref"].ToString(); 

默认的属性使得初学者可以很容易地编写代码,它有助于编写简洁的代码,但是对于处于初学者阶段和高级阶段之间的人来说,这也是令人困惑的。