这是我第一次使用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();
}
请告诉我如何解决?
答案 0 :(得分:1)
请改用Range.Value
。 Worksheet.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[,]
然后你可以一举分配它们:
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;
答案 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();
默认属性使初学者可以轻松编写代码,并且它有助于简化代码,但对于处于初级阶段和高级阶段的人来说,这也会让人感到困惑。