【问题标题】:Java apache poi setting the cell formulaJava apache poi设置单元格公式
【发布时间】:2010-03-25 20:08:56
【问题描述】:

我正在尝试设置一个引用其他工作簿中的单元格的单元格公式。但是,当我打开以编程方式生成的工作簿时,公式单元格显示为 #REF!。我打印出在日志中生成的公式。如果我将它们剪切并粘贴到单元格中,则会拉入外部工作簿中的数字。

        String formula = "'C:\\tmp\\ForecastAggregate\\Total Products\\[ForecastWorksheet.xls]2010 Budget'!C10"; 
        HSSFCell cell = row.createCell(0); //row was created above
        cell.setCellFormula(formula);

有人可以帮忙吗?

【问题讨论】:

    标签: java apache formula apache-poi


    【解决方案1】:

    我对从工作表中读取公式进行了快速测试,结果没有单引号,如:

    [test.xls]testsheet!A1

    但是,当我尝试将其设置为公式时,出现错误:

    线程“main”中的异常 java.lang.RuntimeException: No external workbook with name 'test.xls' Links 似乎暗示,当您阅读使用外部引用的公式时,您需要将工作簿加载到公式评估器并设置环境。但是,我尝试了这个,但它仍然没有工作......但它可能是值得一看的:

     // Set up the workbook environment for evaluation
     HSSFFormulaEvaluator ev = new HSSFFormulaEvaluator(testwb); 
     String[] workbookNames = { "test.xls", };
     HSSFFormulaEvaluator[] evaluators = { ev, };
     HSSFFormulaEvaluator.setupEnvironment(workbookNames, evaluators); 
    

    http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.html

    【讨论】:

      【解决方案2】:

      您可以通过 INDIRECT 函数对引用使用动态评估来解决此问题。

      INDIRECT 函数计算单元格的值,其中要计算的单元格是从另一个单元格的值中提取的。

      例如,

      1. 在单元格 A1 中,将单元格引用作为纯文本(不是公式),例如"'C:\tmp\ForecastAggregate\Total Products\[ForecastWorksheet.xls]2010 Budget'!C10"

      2. 在 A2 中,您希望该引用单元格的值出现的单元格,输入公式

        =间接(A1)

      这将从 A1 获取目标单元格并在 A2 中显示其值。

      在 Java 中,您可以设置一个模式,在其中创建一个单独的工作表(例如“indirectRef”)来管理间接。每当您编写对单元格的外部引用时,您改为编写 INDIRECT(xx) 并将引用放在“indirectRef”工作表中的单元格 xx 中。鉴于 Poi 主要是接口,您可以透明地执行此操作,而无需在您的 java 电子表格构建器代码中更改代码。

      Excel 也有一个动态评估公式的 EVALUATE 宏,这将更容易开始工作,但这是官方未记录的(但在其他地方有大量记录!)并且可能并非所有版本的 Office 都支持它。

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        试图环顾四周,但我能找到的关于这个问题的唯一信息是这个 apache 错误报告,它表明这是一个长期存在的错误:

        https://issues.apache.org/bugzilla/show_bug.cgi?id=46670

        虽然在同一工作簿中引用其他工作表似乎没有问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-06
          • 1970-01-01
          • 1970-01-01
          • 2020-12-14
          • 1970-01-01
          相关资源
          最近更新 更多