我有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
现在我正在尝试使用类型范围的列表:
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 HERE
System.Runtime.InteropServices.COMException:'来自HRESULT的异常:0x800A03EC'
但是它将公式打印为没有该行代码的字符串,并且我必须进入每个单元格并按Enter才能将其评估为公式。 为什么语法有效,没有编译错误。它运行在代码的第一部分,不在列表中。我将Range放在列表中,然后崩溃。 不确定.Formula是导致崩溃还是.Value2。
如果这样做,我会得到相同的错误
Range temp = formularange1[i];
temp.Formula = temp.Value2; //CRASHES HERE
答案 0 :(得分:0)
找到了另一篇有关Excel的文章,该文章帮助我发现了我的错误。因为我的excel公式是自动生成的并且很大,所以我没有意识到我的某些公式以+号结尾。因为我要添加内容并检查长度,所以有些以+结尾。 因此,我正在查找并将“ =”替换为“ =”,这将导致对所有公式求值。除了以“ +”结尾的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++;
}
因此,使用互操作并不容易,并且无法进行最佳的错误检查。我的错误与我的实际问题无关。