【问题标题】:How to re-calculate a cell's formula?如何重新计算单元格的公式?
【发布时间】:2014-06-06 18:49:08
【问题描述】:

我的代码设置了很多单元格值。最后,每个单元格中的公式都需要在生成 Excel 文件之前进行评估。对于大多数工作表来说,事情进展顺利。

但是,有一个单元格引发了异常。该单元格正在计算其后面的一系列单元格和其他工作表中的参考单元格的平均值。我猜当第一个单元格试图计算平均值时,后面的单元格还没有被评估。

这是那个单元格上的公式

=IFERROR(AVERAGEIF(D2:AU2,"<>-"),"-")

我怀疑这是因为该范围内的单元格引用了其他工作表中的单元格。例如D2 有以下公式=Common!E2

所以我决定做的是:

  1. 将调用封装在 try-catch 块中以执行公式。
  2. 如果执行单元格引发异常,我会保存该单元格的坐标。
  3. 然后我执行抛出异常的单元格

我注意到同一个单元格不断抛出错误。为了能够退出循环,我数到 3 次迭代。

生成 excel 生成时,该单元格的值为 -。但是,当我选择单元格然后按enter 时,它会执行并显示正确的值。

我推迟执行该单元格的原因是,在第一次迭代之后,引用其他工作表的单元格已经被评估。但是,它仍然无法正常工作,因为它不断抛出异常。

感谢您的帮助。

更新

我正在使用 npoi 和 c#。

【问题讨论】:

  • 也许...application.Calculate 打开工作簿。或在保存之前生成之后。
  • @xQbert 我不知道 application.Calculate 是否是 npoi 的一部分。我现在正在检查。

标签: c# excel npoi


【解决方案1】:

在非营利组织中

if(wb is XSSFWorkbook) {
    XSSFFormulaEvaluator.EvaluateAllFormulaCells(wb);
} else {
    HSSFFormulaEvaluator.EvaluateAllFormulaCells(wb);
}

【讨论】:

  • 具体来说,如果你只想重新计算一个单元格,workbook.GetCreationHelper().CreateFormulaEvaluator().EvaluateFormulaCell(cell) 可能是更好的选择
【解决方案2】:

您是否检查过MSDN:以编程方式运行 Excel 计算?

【讨论】:

    【解决方案3】:

    使用 NPOI 时,Evalds 的答案是最好的。我正在读取通过 FTP 接收并加载到我的项目中的 excel 文件。因此,只需在加载点评估所有单元格。

    static void InitializeWorkbook(string path)
        {
            using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
            {
                xssfworkbook = new XSSFWorkbook(file);
                XSSFFormulaEvaluator.EvaluateAllFormulaCells(xssfworkbook);
            }
    
            handleSheet(xssfworkbook.GetSheetAt(0));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多