代码之家  ›  专栏  ›  技术社区  ›  3-14159265358979323846264

为什么这个公式不能计算,除非我双击一个单元格?

  •  3
  • 3-14159265358979323846264  · 技术社区  · 8 年前

    看到这个了吗 .xlsx 文件当然,没有宏!

    打开文件时,您将看到以下单元格:

    [Series     ]
    [10         ]
    [20         ]
    [30         ]
    [           ]
    [           ]
    [=SUM(B3:B7)]
    

    除非您双击底部三个单元格中的一个,然后按enter键(例如两个空白,=总和(B3:B7)),否则总和不会计算


    更奇怪的是,一旦你“将公式踢进了生活”,如果你保存工作簿并重新打开,它的表现就很好了。

    我已尝试将扩展名更改为。zip,并尝试使用Xml,看看是否可以通过在Xml开始工作后保存它来识别所做的更改,但我只能看到版本号已更改。

    我们税务局。


    此外,我尝试将其保存为早期的Excel格式,但问题仍然存在。


    我只想重申一下,随附的电子表格是一个。xlsx文件,因此没有任何宏!如果没有附带的电子表格,真的没有其他方法来解释这个问题。希望通过50分的声誉,有人会相信我不是一个脚本小子,看看吧!


    我使用EPPlus和以下C代码创建了该文件:

        public void Generate(string outputPath)
        {
            using (FileStream fsTemplate = new FileStream(TemplatePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (FileStream fsReport = new FileStream(outputPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    using (ExcelPackage ep = new ExcelPackage(fsReport, fsTemplate))
                    {
                        using (ExcelWorksheet ws = ep.Workbook.Worksheets[TemplateSheetName])
                        {
                            //
                            int iHeadingsRow = 2;
                            int dataRowIndex = iHeadingsRow + 1;
                            //
                            List<decimal> list = new List<decimal>() { 10, 20, 30 };
                            //
                            foreach (var number in list)
                            {
                                ws.Cells[dataRowIndex, 2].Value = list[dataRowIndex - iHeadingsRow - 1];
                                //
                                ws.InsertRow(dataRowIndex + 1, 1, iHeadingsRow + 1);
                                //
                                dataRowIndex++;
                            }
                            //
                            ep.Save();
                        }
                    }
                }
            }
        }
    

    我想强调的是,这不是EPPlus问题!这是Excel打开有效工作簿并拒绝计算公式的常见问题。将单元格格式化为数字不会产生任何影响。几个月来,我一直在使用EPPlus创建工作Excel文件,但我没有安装任何EPPlus更新,所以肯定是Excel有问题,对吧?!

    解决方案必须在于原始文件与已生效并保存的版本之间的差异。我似乎无法准确指出这两者的区别是什么。。。


    模板文件中已存在=SUM(B3:B7)以及文本“Series”。代码只将{10,20,30}项添加到电子表格中。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    您正在将数据添加到已存在的Excel工作表中,该工作表中已包含 =SUM(B3:B7) 公式

    我想是吧 EPPlus问题。也就是说,问题是您没有调用 Calculate() 输入数据后的方法:

    ... 您可以让EPPlus计算工作簿中公式的结果。

    这是通过调用Calculate()方法完成的,该方法可在工作簿、工作表和范围级别上使用。调用Calculate()时,EPPlus将计算公式的结果,并将结果存储为单元格的值,就像Excel一样。

    在Excel中键入公式后,Excel将计算值并将其与值一起存储在文件中。

    例如,您的工作表如下所示:

    100
    200
    =SUM(A1:A2)
    

    Excel存储以下内容(我删除了不相关的XML属性):

    <sheetData>
        <row r="1">
            <c r="A1">
                <v>100</v>
            </c>
        </row>
        <row r="2">
            <c r="A2">
                <v>200</v>
            </c>
        </row>
        <row r="3">
            <c r="A3">
                <f>SUM(A1:A2)</f>
                <v>300</v></c>
        </row>
    </sheetData>
    

    在外部将数据插入到XLSX文件时,如果没有该值,Excel将不会存储缓存的值并显示 0 。您的XLSX文件(您上载的文件)包含在 sheet1.xml :

    <row r="8">
        <c r="B8">
            <f>SUM(B3:B7)</f>
            <v>0</v>
        </c>
    </row>
    

    类似的Java库中有一些解释 Apache POI :

    有时Excel会注意到自己,并在加载时触发重新计算,但除非您知道您使用的是易失性函数,否则通常最好触发重新计算。

    还有一个类似的问题 Excel cell displaying zero instead of a calculated / referenced value 从Java的角度来看。

    推荐文章