excel - 为什么除非我双击单元格,否则这个公式不会计算?

标签 excel excel-formula

查看此.xlsx文件。当然,没有宏!

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

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

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

<小时/>

更奇怪的是,一旦您“将公式付诸实践”,如果保存工作簿并重新打开它,它就会表现良好。

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

我们。 Ird。

<小时/>

此外,我尝试将其保存为早期的 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} 项添加到电子表格中。

最佳答案

您正在向现有的 Excel 工作表添加数据,该工作表已包含 =SUM(B3:B7) 公式。

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

... you can let EPPlus calculate the results of the formulas in a workbook.

This is done by calling the Calculate() method, which is available on Workbook, Worksheet and Range level. When Calculate() is called EPPlus will evaluate the result of the formula and store the result as the Value of the cell - just like Excel do.

在 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中有一些解释:

Sometimes Excel will notice itself, and trigger a recalculation on load, but unless you know you are using volatile functions it's generally best to trigger a Recalculation.

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

关于excel - 为什么除非我双击单元格,否则这个公式不会计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49675963/

相关文章:

excel - 检查Word文档是否已经打开+错误处理

c# - 在使用c#导入datagridview之前根据单元格值删除一些行

excel - 如何在 VBA 中 VLOOKUP 获取#N/A 值?

excel - 如何在当前单元格上使用 HYPERLINK 和 VLOOKUP?

java - 使用 Apache-POI 将 Excel 十进制格式解析为 Java BigDecimal

forms - 在 Word 用户窗体中创建一个 'Group Box'

excel - 下拉列表 VLOOKUP 返回多个匹配项

excel - If 语句公式破坏 VBA 循环代码

Excel - 连接多列

c# - 不带参数的 Excel DNA 函数在 Excel 函数向导中仍显示一个参数