公式评估在NPOI 2.1.3.0中不起作用

时间:2015-07-30 13:06:09

标签: c# excel formula npoi

我正在代码中创建一个Excel工作簿,并将其另存为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确认,公式将正确评估。这意味着公式本身不应该有任何问题。

我通过手动进行计算解决了这个问题。这不是我的长期解决方案,因为用户应该能够插入自己的计算,但它是我现在能够提出的唯一解决方案,除了使用另一个Excel框架(糟糕的计划;))。

0 个答案:

没有答案