【问题标题】:Writing a large 2d array to Excel将大型二维数组写入 Excel
【发布时间】:2012-08-29 18:27:10
【问题描述】:

我希望使用 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。

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

【问题讨论】:

  • 虽然它“几乎没用”,但如果你告诉我们你所看到的会很有趣。也许你有这个问题(stackoverflow.com/questions/7099770/…)?
  • 请注意,在旧版本的 excel(例如 2003)中,您的工作表不能超过 256 列(最后一个是 IV)和 65536 行,因此它们不能包含 500 *500 矩阵不拆分

标签: c# excel


【解决方案1】:

找到了解决办法。

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

【讨论】:

    【解决方案2】:

    我刚刚写了一个对我有用的小例子。最初发现于SO this answer。我不得不调整这个答案,因为在我的互操作程序集 (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();
    }
    

    【讨论】:

    • 这与我上面的代码几乎相同,并且在正常情况下确实有效。问题是当工作簿以兼容模式打开时。
    • 我目前正在研究一个新示例。请确认一些假设:程序应该打开一个文件,根据文件的当前版本(
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多