5

我正在寻找使用 C# 将大型二维数组写入 Excel 工作表。如果数组是 500 x 500,我将用来编写它的代码如下:

 var startCell = Worksheet.Cells[1, 1];
 var endCell = Worksheet.Cells[500, 500];
 var writeRange = (Excel.Range)Worksheet.Cells[startCell, endCell;
 writeRange.Value = myArray;

我在这条线上遇到了一个例外:

var endCell = Worksheet.Cells[500, 500];

任何通过 COM 使用过 C# 和 Excel 的人都可以证明,收到的错误消息几乎没有用。我认为问题在于,当我第一次创建工作表时,用于工作表的基础数据结构的大小不足以索引单元格 500,500。

有谁知道如何达到预期的结果?我希望有一种简单的方法可以在创建 Range 之前重新调整底层数据结构的大小。

谢谢。

编辑:错误消息是:

{"Exception from HRESULT: 0x800A03EC"}

使用和excel错误代码-2146827284。

更新:下面评论中提供的链接暗示了在兼容模式下打开 Excel 工作表的问题。这似乎是问题所在。如果我在运行代码之前将文档保存为 .xlsx 或 .xlsm 格式,这似乎可行。我的问题是我不能期望我的用户每次都这样做。有没有一种程序化的方式来实现这一点?是否只是打开文件,检查扩展名,然后在需要时将其保存为新格式的情况?

4

2 回答 2

4

找到了解决方案。

不要使用 Worksheet.Cells[x, x],而是使用 Worksheet.get_range(x, x)。

于 2012-08-29T10:27:10.180 回答
1

我刚刚写了一个对我有用的小例子。最初在SO 这个答案中找到。我不得不调整这个答案,因为在我的互操作程序集(Excel 14 对象库)中没有更多的方法 Worksheet.get_Range(.., ..)

var startCell = ws.Cells[1, 1];
int row = 500, col = 500;
var endCell = ws.Cells[row, col];
try
{
    // access range by Property and cells indicating start and end           
    var writeRange = ws.Range[startCell, endCell];
    writeRange.Value = myArray;
}
catch (COMException ex)
{
    Debug.WriteLine(ex.Message);
    Debugger.Break();
}
于 2012-08-29T09:19:26.423 回答