HRESULT 异常:0x800A03EC - 将数组写入 Excel 加载项中的范围

Exception from HRESULT: 0x800A03EC - Writing array to range in Excel Add-In

我在 C# 的 Excel 加载项中有以下代码:

long lngArrayLength = 14;
long lngArrayLength2 = array2.Length;

Excel.Range rngValues1 = (Excel.Range)wsNew.Cells[2, 1];
Excel.Range rngValues2 = (Excel.Range)wsNew.Cells[lngArrayLength2 + 1, lngArrayLength];
Excel.Range rngValues = wsNew.get_Range(rngValues1, rngValues2);

rngValues.Value = array2;

作为参考,array2 有十个元素,每个元素有 14 个子元素。示例:

array2 = { (0, "a0", "b0", "c0"... "n0"), ... {9, "a9", "b9", "c9"... "n9) }

rngValues 以上大小为 {[1..10,1..14]}

每次尝试 运行 时,我都会收到以下错误:

Exception from HRESULT: 0x800A03EC

我已经排除:
1) 文件格式,将Book1 保存为.xlsx 没有帮助
2) 达到列或行限制,对数千个元素或其中的 10 个元素做同样的事情
3) [0] vs [1] - 索引数组 and/or 范围,似乎 matter/help

我在调试时仍然遇到问题...这是否可能与数组的维度与范围有关?我如何确定是否是这种情况?

更新 1:

我创建了一个用数据填充数组的循环:

for (i = 1; i <= lngRows; i++)
{
    for (j = 1; j <= lngCols; j++)
    {
        strTest[i-1, j-1] = "test (" + i.ToString() + "," + j.ToString() + ")";
    }
}

...这很好用。

我现在想到数组中的元素可能包含 NULL 值。

我想这可能是问题所在...是吗?

更新 2:

好的,所以我现在写了一个小例程来将任何 NULL 转换为 0(b/c 数据类型是 decimal?(可空十进制),我想我真的需要 decimal相反:

public decimal replaceNullDec(decimal? decInput)
{
    if (decInput != null)
    {
        decimal rtn = (decimal)decInput;
        return rtn;
    }
    else
    {
        decimal rtn = 0;
        return rtn;
    }
}

所以,现在我已经确认所有 NULL 都被替换了,但是在将数组写入范围时我仍然遇到错误...

更新 3:

好吧,然后我认为这可能是数据类型问题,所以我重写了代码,将数组中的所有元素都转换为字符串,而不是在写入 sheet 之前。我现在获取数据,但不是实际值,而是文本告诉我原始类型(在本例中是自定义 class,称为 Response)。

我注意到有趣的是,我得到了 10 列文本和 4 列 #N/A

这让我觉得也许我需要转置数组?

快把我逼疯了,但仍在努力。

任何帮助都会很棒!

更新 4:

好的,我相信我越来越接近了。在研究如何在 C# 中转置二维数组时,我遇到了一些错误,这些错误让我相信我实际上没有二维数组,而是 "array of arrays"(我认为二维数组是,老实说),这可能是我使用 ToArray() 方法将我的 List 转换为 Array 的问题。

这是代码:

object[] array2 = listAllData.ToArray();

所以下一个问题就变成了"how to convert a list to a 2d array?"

答案:

问题归结为我没有将二维数组写入范围,而是构建了一个 Response 对象数组并尝试将其写入范围。

有关该解决方案的更多详细信息,请参阅此相关 post: