在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.Value
。 Worksheet.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;
我完全赞同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
当然,你也可以跳过r
variables:
xlWorkSheet.Cells(i, 1).Value = someValue
现在,C#没有默认的属性概念。 因此,您无法将此代码编写为快捷方式,这导致了我们在Ria的答案中提出的代码:
xlWorkSheet.Cells[i, 1].Value = someValue;
或者,用真实的价值而不是一些价值:
xlWorkSheet.Cells[i, 1].Value = table.Rows[i]["Ref"].ToString();
默认的属性使得初学者可以很容易地编写代码,它有助于编写简洁的代码,但是对于处于初学者阶段和高级阶段之间的人来说,这也是令人困惑的。