公式评估不适用于NPOI 2.1.3.0

我在后面的代码中创buildExcel工作簿,并将其保存为XLSX和PDF。 为此,我使用了一个模板工作簿,它具有格式化和公式生成完成后进行评估。 当我打开Excel文件时,只有当我将ForceFormulaRecalculation设置为true时,公式才计算。 当我对PDF文件做同样的处理时,我会得到#VALUE! 结果应该在哪里。 我的相关代码:

 ReportGenerator generator = new ReportGenerator(); List<Activity> activities = GetActivitiesForItemCollection(items); generator.CreateWorkbook(templatePath); generator.Year = int.Parse(year); generator.Month = int.Parse(month); activities = generator.SortActivitiesByDateTime(activities); activities = generator.GenerateBreaksForProject(activities); bool isExternalReport = false; if (project == "Intern") isExternalReport = true; generator.GenerateReports(activities, isExternalReport); if (pdf && !xlsx) generator.SaveReportToList(OutputFileType.PDF, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.PDF)); else if (xlsx && !pdf) generator.SaveReportToList(OutputFileType.XLSX, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.XLSX)); else { generator.SaveReportToList(OutputFileType.XLSX, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.XLSX)); generator.SaveReportToList(OutputFileType.PDF, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.PDF)); } 

这里是我的代码,我在那里做评估:

 public void SaveReportToList(OutputFileType outputType, string filename) { string siteUrl = SPContext.Current.Web.Url; SPSecurity.RunWithElevatedPrivileges(delegate() { using (MemoryStream mStream = new MemoryStream()) { sheet.PrintSetup.Landscape = true; sheet.PrintSetup.FitWidth = 1; sheet.PrintSetup.FitHeight = 1; XSSFFormulaEvaluator.EvaluateAllFormulaCells(workbook); workbook.Write(mStream); using (MemoryStream crutchStream = new MemoryStream(mStream.ToArray())) { using (SPSite spsite = new SPSite(siteUrl)) { using (SPWeb spweb = spsite.OpenWeb()) { .... 

我也尝试过这种方式:

 private void ForceCalculateSheet() { XSSFFormulaEvaluator helper = (XSSFFormulaEvaluator)workbook.GetCreationHelper().CreateFormulaEvaluator(); for(int i = 0; i<sheet.LastRowNum; i++) { XSSFRow row = (XSSFRow)sheet.GetRow(i); for(int j = 0; j< row.LastCellNum; j++) { XSSFCell cell = (XSSFCell)row.GetCell(j); if(cell != null && cell.CellType == CellType.Formula) { helper.EvaluateFormulaCell(cell); } } } } 

以下是我尝试评估的几个公式(某些单元格值是24小时时间值):

 =IF(D37-C37-E37>0;D37-C37-E37;0) =INT(J39/60) =J39-C39*60 

奇怪的是,当我在Excel中跟踪评估时,直到最后一步。 然后突然,该值变成#VALUE!

有人知道这里发生了什么?


只是要小心,我更新NPOI到它的最新的.NET版本(2.1.3.1)。 这仍然没有解决问题。

当我单击公式中的单元格时,更改其值,然后按Enter键确认,公式计算结果正确。 这意味着公式本身不应该有任何问题。

我通过手动进行计算来解决这个问题。 这不是我的长期解决scheme,因为用户应该能够插入他们自己的计算,但是除了使用另一个Excel框架(坏计划;)之外,这是我现在唯一可以提出的解决scheme。