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

时间:2018-04-05 15:17:23

标签: excel excel-formula

请参阅此.xlsx文件。当然没有宏!

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

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

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

如果你保存工作簿并重新打开工作簿,那么一旦你将公式付诸实践,Weirder仍然会表现得很好。

我已经尝试将扩展名更改为.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}项添加到电子表格中。

1 个答案:

答案 0 :(得分:1)

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

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

  

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

     

这是通过调用Calculate()方法完成的,该方法在Workbook,Worksheet和Range级别上可用。当调用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会注意到自己,并在加载时触发重新计算,但除非您知道使用的是volatile函数,否则通常最好触发重新计算。

从Java的角度来看,存在类似的问题Excel cell displaying zero instead of a calculated / referenced value