我将C#代码写入到Excel中。下面的代码可以工作:
var probForExcel = new string[profileSize, 1];
Range range3 = worksheet.Range["C5", "C" + (startRow + profileSize - 1)];
range3.Value = probForExcel;
range3.NumberFormat = "0.00000000000E+0";
range3.Formula = range3.Value2; //NEEDED FOR ACTUAL FORMULAS otherwise writes in xls as string现在我尝试使用Type Range列表:
var formulaForExcel = new List<string[,]>();
var formularange1 = new List<Range>();
for (var i = 0; i < profileSize; i++)
{
var count = formulas[i].Count();
formularange1.Add(worksheet.Range[worksheet.Cells[rowTracker, 2], worksheet.Cells[rowTracker, count]]);
formulaForExcel.Add(new string[1, count]);
var j = 0;
foreach (var formula in formulas[i])
{
formulaForExcel[i][0, j] = formula;
j++;
}
formularange1[i].Value = formulaForExcel[i];
formularange1[i].Formula = formularange1[i].Value2;//CRASHES HERE
rowTracker++;
}该程序运行时不需要以下代码行:
formularange1[i].Formula = formularange1[i].Value2;//CRASHES HERESystem.Runtime.InteropServices.COMException:‘来自HRESULT的异常: 0x800A03EC’
但它将公式打印为字符串,而不是一行代码,我必须进入每个单元格并按enter键才能将其计算为公式。为什么语法可以工作,没有编译错误。它在代码的第一部分运行,在那里它不在列表中。我把Range放在一个列表中,它就崩溃了。不确定是.Formula还是.Value2导致崩溃。
如果我这样做,我会得到同样的错误
Range temp = formularange1[i];
temp.Formula = temp.Value2; //CRASHES HERE发布于 2019-12-20 07:31:36
我找到了另一篇关于Excel的文章,帮助我找到了我的bug。因为我的excel公式是自动构建的,并且非常大,所以我没有意识到我的一些公式以+号结尾。因为我在添加内容并检查长度,所以有些以+结尾。所以我做了一个查找并将"=“替换为"=”,这将导致所有公式求值。除了末尾有+的那些,excel抛出了一个错误。一旦我找到了这个并更新了我的公式生成器,现在它就可以工作了:
for (var i = 0; i < profileSize; i++)
{
var count = formulas[i].Count();
sumrangeForExcel[i, 0] = "=sum(C" + rowTracker + ":c" + rowTracker + ")";
formularange1.Add(worksheet.Range[worksheet.Cells[rowTracker, 3], worksheet.Cells[rowTracker,3+ count-1]]);
formulaForExcel.Add(new string[1, count]);
var j = 0;
foreach (var formula in formulas[i])
{
formulaForExcel[i][0, j] = formula;
//formularange1[i][0, j].Formula = formularange1[i][0, j].Value2; Erased my formulas
j++;
}
formularange1[i].Value = formulaForExcel[i];
formularange1[i].Formula = formularange1[i].Value2;//NO CRASHING
formularange1[i].NumberFormat = "###,###,##0";
rowTracker++;
}因此,使用互操作并不容易,并且没有最好的错误检查。我所犯的错误与我的实际问题无关。
https://stackoverflow.com/questions/59417206
复制相似问题