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:
我在 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: