EPPlus 公式在不调用 Calculate 的情况下不起作用
EPPlus formula not working without calling Calculate
我尝试使用 excel INDEX and MATCH and according to EPPlus codeplex, these should be supported 中的两个函数。每次我打开文件时,都会有一条警告消息说有什么东西坏了,问我是否要修复文件,当它打开时,所有的公式都没有了。修复文档时会显示一个对话框,说明公式已从 /xl/worksheets/sheet1.xml-del
.
中删除
我可以手动将公式放入电子表格并且它们可以工作,但是要在生成的 xlsx 文件中显示任何数据的唯一方法是在工作表上调用 Calculate()
。这将正确输出数据,但我需要的是在文档中包含公式。
这是我试过的公式的一个小例子
private byte[] TestingFormula()
{
using (ExcelPackage pck = new ExcelPackage(_helper.GetTemplateStream("TEST.xlsx")))
{
var ws = pck.Workbook.Worksheets[1];
ws.Cells["A4"].Formula = "INDEX($C:$D;4;2)";
ws.Cells["A6"].Formula = "INDEX(C1:D24;6;2)";
ws.Cells["B26"].Formula = "MATCH($B;$C:$D;0)";
// sum works as expected
//ws.Cells["D25"].Formula = "SUM(D2:D24)";
//pck.Workbook.Calculate();
//pck.Workbook.CalcMode = ExcelCalcMode.Automatic;
return pck.GetAsByteArray();
}
}
The TEST.xlsx is just a template that looks like this
那么,我做错了什么?
在公式中使用逗号而不是分号:
ws.Cells["A4"].Formula = "INDEX($C:$D,4,2)";
ws.Cells["A6"].Formula = "INDEX(C1:D24,6,2)";
ws.Cells["B26"].Formula = "MATCH($B,$C:$D,0)";
我猜当你在 Excel 中直接输入分号时,MS 会即时修正公式。实际的 XML 可能需要逗号,但我不确定。
reasra 的正确答案(我还不能发表评论)。这记录在本页的 "Some common mistakes" 下:
- 不要使用本地化的函数名称。仅支持英文名称(如 SUM、IF、VLOOKUP 等)。
- 不要使用分号作为函数参数之间的分隔符。仅支持逗号。
- 不要在公式中添加前导 = 号。 "=SUM(A1:A2)" 错误,"SUM(A1:A2)" 正确
我尝试使用 excel INDEX and MATCH and according to EPPlus codeplex, these should be supported 中的两个函数。每次我打开文件时,都会有一条警告消息说有什么东西坏了,问我是否要修复文件,当它打开时,所有的公式都没有了。修复文档时会显示一个对话框,说明公式已从 /xl/worksheets/sheet1.xml-del
.
我可以手动将公式放入电子表格并且它们可以工作,但是要在生成的 xlsx 文件中显示任何数据的唯一方法是在工作表上调用 Calculate()
。这将正确输出数据,但我需要的是在文档中包含公式。
这是我试过的公式的一个小例子
private byte[] TestingFormula()
{
using (ExcelPackage pck = new ExcelPackage(_helper.GetTemplateStream("TEST.xlsx")))
{
var ws = pck.Workbook.Worksheets[1];
ws.Cells["A4"].Formula = "INDEX($C:$D;4;2)";
ws.Cells["A6"].Formula = "INDEX(C1:D24;6;2)";
ws.Cells["B26"].Formula = "MATCH($B;$C:$D;0)";
// sum works as expected
//ws.Cells["D25"].Formula = "SUM(D2:D24)";
//pck.Workbook.Calculate();
//pck.Workbook.CalcMode = ExcelCalcMode.Automatic;
return pck.GetAsByteArray();
}
}
The TEST.xlsx is just a template that looks like this
那么,我做错了什么?
在公式中使用逗号而不是分号:
ws.Cells["A4"].Formula = "INDEX($C:$D,4,2)";
ws.Cells["A6"].Formula = "INDEX(C1:D24,6,2)";
ws.Cells["B26"].Formula = "MATCH($B,$C:$D,0)";
我猜当你在 Excel 中直接输入分号时,MS 会即时修正公式。实际的 XML 可能需要逗号,但我不确定。
reasra 的正确答案(我还不能发表评论)。这记录在本页的 "Some common mistakes" 下:
- 不要使用本地化的函数名称。仅支持英文名称(如 SUM、IF、VLOOKUP 等)。
- 不要使用分号作为函数参数之间的分隔符。仅支持逗号。
- 不要在公式中添加前导 = 号。 "=SUM(A1:A2)" 错误,"SUM(A1:A2)" 正确