繁体   English   中英

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

[英]C# Using Microsoft.Office.Interop.Excel Error Setting Range .Formula to Range .Value2

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

找到了另一篇关于 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++;
        }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM