【发布时间】:2013-10-31 22:30:45
【问题描述】:
我有一个 C# 数据库程序,并使用 EPPlus 生成一个带有一张表的 Excel 文件 (*.xlsx)。问题是至少某个版本的 Excel 在打开文档时不会重新计算公式。我正在为其他人开发该应用程序,下周可以告诉您显示问题的 Excel 的确切版本。
我不打算展示我的完整代码,而是展示一个简单的例子来演示这个问题。 我已经从这里复制了这个例子并稍微熟练了一点:EPPlus not caluculating formula output after binding
代码如下:
using (var pck = new OfficeOpenXml.ExcelPackage())
{
var ws = pck.Workbook.Worksheets.Add("MySheet");
ws.Cells["A3"].Value = 2.3;
ws.Cells["A4"].Value = 10.2;
ws.Cells["A5"].Formula = "=SUM(A3:A4)";
ws.Cells["A5"].Style.Numberformat.Format = "#,##0.00";
ws.Workbook.CalcMode = ExcelCalcMode.Automatic;
pck.SaveAs(new FileInfo(@"c:\users\richard\tmp1.xlsx"));
}
文档在 LibreOffice 中可以正常打开。它也可以在(未知的)Excel 版本中打开,但打开时不会重新计算公式。
我不愿意购买 MS Office 的许可证,所以我先下载了一个 Excel 查看器。 ExcelViewer.exe,文件版本 12.0.4518.1071。此查看器显示相同的行为:未计算公式。
所以,我很不情愿地购买了 Office 365 家庭高级版,猜猜看:这个版本的 Excel 确实会重新计算公式。
我认为这是 Excel 版本中的错误,而不是 EPPlus 或我的代码中的错误。但是是否有任何解决方法可以强制所有版本的 Excel 重新计算公式?
是的,我已尝试在这里阅读所有其他相关帖子,这不是重复的。
非常感谢。
【问题讨论】:
-
@Charles Williams:感谢您的回复。不幸的是,您的回复告诉我,您认为 Execel 不是原因,并且设置计算模式还不够,但它没有提供解决方案或建议我应该做些什么。请告诉我上面代码中的错误???我只有一个工作簿,上面的代码为那个工作簿设置了标志。
-
更新:不重新计算公式的版本是 Excel 2010。免费的 Excel 查看器也有这种行为。
-
然后我已经阅读了很多关于 SO 的 cmets 并且设置计算模式似乎是要走的路。 XlsxWriter 还将公式的所有结果设置为零,然后设置“一个标志”(我希望这是计算模式)以强制重新计算。这适用于 LibreOffice 和 Excel 2013,但不适用于 Excel 2010。无论如何,我们决定要么在报告中写入计算值(ugh!)要么使用 LibreOffice,因为更新到 Excel 2013 的成本太高。谢谢大家。
-
@Charles Williams,引用:顺便说一句,我不明白您希望如何在无法测试的情况下成功创建 Excel 文件。 1) 文档相当简单,我曾期望 Excel 和 LibreOffice 中的行为相同。 2)我可以用观众测试。 3)由于我是免费开发的(它是为我的兄弟),我不想付出任何代价。但我最终购买了 2013 版的许可证。我不想购买旧版本的许可证。但在 Excel 2013 中它可以正常工作。
-
在不知道它应该设置什么 Excel 属性的情况下,我无法评论 EPPlus“标志”。正如我所说 - 在工作簿中设置计算模式仅在 Excel 会话中打开第一个工作簿时才设置 Excel 计算模式。我建议您告诉最终用户在打开生成的文件后在 Excel 中按 Ctrl/Alt/F9。或者在文件中生成一些 VBA 以在工作簿打开时触发计算。或者告诉您的用户在打开文件时确保 Excel 处于自动计算模式。