在EPPlus中设置*两个*值和公式

是否有任何方法来设置单元格的ValueFormula属性,以便他们坚持到书面的XLSX文件?

由于EPPlus不计算公式(它依靠excel来完成),所以我正在为用户预先计算结果。 这是因为如果他们不打开文件,但是然后重新上传它,'价值'是不是空的。 公式非常简单。

注意: sheet.SetValue().Value都重置了ExcelCell类的Formula属性,因此必须先调用.Value 。 查看ExcelCell.SetRichText()的源代码来查看它发生的情况。

这几乎是testing用例的确切代码:

 var package = new ExcelPackage(); // and setup code var sheet = package.Workbook.Worksheets.First(); sheet.Cells["A2"].Value = 10; sheet.Cells["A2"].Formula = "=A1 * 3"; // Cell is OK now. shows both ".Value" and ".Formula" using (var s = new MemoryStream()) { package.Save(s); var newPackage = new ExcelPackage(s); var newSheet = newPackage.Workbook.Worksheets.First(); var cell = newSheet.Cells["A2"]; // cell.Value == null // cell.Formula = "=A1 * 3" } 

从EpPlus版本4.0.1.1开始,有一个扩展方法Calculate(this ExcelRangeBase range) 。 调用它:

 cell.Calculate(); 

之后cell.Value将返回预期的结果。

UPDATE

从官方文档 :

EPPlus支持从版本4进行公式计算。这意味着您可以让EPPlus在工作簿中计算公式的结果。

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

 using(var package = new ExcelPackage(new FileInfo(@"c:\temp\tmp.xlsx"))) { // calculate all formulas in the workbook package.Workbook.Calculate(); // calculate one worksheet package.Workbook.Worksheets["my sheet"].Calculate(); // calculate a range package.Workbook.Worksheets["my sheet"].Cells["A1"].Calculate(); } 

已知的问题

公式计算中目前不支持Excel的以下function:数组公式,Intersect运算符,对外部工作簿的引用。