C#使用Microsoft.Office.Interop.Excel错误将范围.Formula设置为范围.Value2

时间:2019-12-19 21:40:51

标签: c# excel-formula excel-interop comexception

我有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

1 个答案:

答案 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++;
        }

因此,使用互操作并不容易,并且无法进行最佳的错误检查。我的错误与我的实际问题无关。