我正在寻找使用C#将大型2d数组写入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"}
with和excel错误代码-2146827284。
更新:以下评论中提供的链接提到了在兼容模式下打开Excel工作表的问题。这确实是问题所在。如果我在运行代码之前以.xlsx或.xlsm格式保存文档,这似乎有效。我的问题是我不能指望我的用户每次都这样做。是否有一种程序化方式来实现这一目标?它只是打开文件,检查扩展名然后在需要时以新格式保存它的情况吗?
答案 0 :(得分:4)
找到解决方案。
而不是使用Worksheet.Cells [x,x],而是使用Worksheet.get_range(x,x)。
答案 1 :(得分:1)
我刚刚写了一个适合我的小例子。最初发现于SO this answer。我必须在我的Interop程序集( 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();
}