首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

公式
EN

Stack Overflow用户
提问于 2016-01-29 20:31:13
回答 3查看 9.2K关注 0票数 8

我试图使用Java和Apache在我的“VLookup”文件中添加简单的.xlsx公式。

这个公式是有外部参考的,这对我不起作用。

因此,为了给您提供更多的细节,我正在使用poi和poi版本3.13和excel 2007。

我以这种方式将公式放入单元格(其中单元格是单元格):

代码语言:javascript
运行
复制
cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("StringContainingFormula");

然后评估公式,我尝试了三种不同的方法,但没有运气。(wb为XSSFWorkbook)。

1

代码语言:javascript
运行
复制
FormulaEvaluator mainWorkbookEvaluator = wb.getCreationHelper().createFormulaEvaluator();
Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
workbooks.put("SpreadsheetName.xlsx", mainWorkbookEvaluator);
mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks);
mainWorkbookEvaluator.evaluateAll();

2

代码语言:javascript
运行
复制
XSSFEvaluationWorkbook.create(wb);
Workbook nwb = wb;
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
for (Sheet sheet : nwb) {
    for (Row r : sheet) {
        for (Cell c : r) {
            if (c.getCellType() == Cell.CELL_TYPE_FORMULA) {
                try {
                    //evaluator.evaluateFormulaCell(c);
                    evaluator.evaluate(c);
                } catch (Exception e) {
                    System.out.println("Error occured in 'EvaluateFormulas' : " + e);
                }
            }
        }
    }
}

3.

代码语言:javascript
运行
复制
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);  

问题是,它写入Excel文件,然后在计算时抛出错误:

java.lang.IllegalArgumentException:无效sheetIndex:-1

现在,如果我打开Excel文件,它会给我警告:

链接的自动更新已被禁用

如果我启用了内容,那么公式将正确显示结果,并且如果我没有做任何导致#N/A.的公式之外的事情

现在,如果我选择包含公式的单元格,然后单击公式栏并点击enter,就会显示结果。

更新:

因此,我通过进入Excel选项禁用了警告消息,它开始给出单元格内的公式。

但是,当我试图从它获得结果值时,我使用

代码语言:javascript
运行
复制
if (cell.getCachedFormulaResultType == Cell.CELL_TYPE_STRING) {
    System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
}

它从来没有给我getCachedFormulaResultType作为CELL_TYPE_STRING,它总是返回CELL_TYPE_NUMERIC。它应该返回字符串值。我正在删除URL和其他值(由“”--“猫-狗-鸟”分隔)。

我感谢任何帮助/建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-08 14:19:18

因此,由于我没有任何其他选择,我不得不将引用的数据复制到主工作簿(我知道如果数据很大的话,这不是个好主意)。

所以我做的是:

  1. 从外部工作簿复制引用的数据。
  2. 在主工作簿上创建新的工作表(您需要在其中编写公式)并粘贴引用的数据。
  3. 现在编写公式,这次使用新创建的工作表(粘贴数据)代替外部工作簿。 注释*您需要首先编写所有数据(包括公式),然后才能对公式进行计算。
  4. 然后打开工作簿供阅读,如果您已经关闭,并评估所有的公式如下(wb是XSSFWorkbook):

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

票数 0
EN

Stack Overflow用户

发布于 2016-02-02 05:43:46

看来起作用了。您必须温和地对待excel;如果您首先打开外部工作簿,然后打开主工作簿,您会更高兴。如果没有,它会给出一个关于不安全链接的信息,但除此之外,一切看起来都没问题。评估器只在单个单元格上工作,因此如果要重新计算整个电子表格,则必须循环。此外,外部引用必须已经由excel链接,POI还没有实现该功能。以下是我对github的投入:

代码语言:javascript
运行
复制
    // Open workbooks
    Path pathBook1 = Paths.get("c:/users/karl/scsb/Vlookup/Book1.xlsx");
    InputStream is = Files.newInputStream(pathBook1);
    XSSFWorkbook book1 = new XSSFWorkbook(is);
    // Add Linked Cell
    // The workbook must already have been linked to Book2.xlsx by Excel
    // The linkExternalWorkbook has not yet been implemented: SEE BUG #57184
    Cell cell = book1.getSheetAt(0).createRow(2).createCell(0);
    cell.setCellFormula("A2+[Book2.xlsx]Sheet1!A1");
    // Create evaluator after the new cell has been added.
    FormulaEvaluator mainEvaluator = book1.getCreationHelper().createFormulaEvaluator();
    XSSFWorkbook book2 = new XSSFWorkbook("c:/users/karl/scsb/Vlookup/Book2.xlsx");
    Map<String, FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
    workbooks.put("Book1.xlsx", mainEvaluator);
    workbooks.put("Book2.xlsx", book2.getCreationHelper().createFormulaEvaluator());
    mainEvaluator.setupReferencedWorkbooks(workbooks);
//  mainEvaluator.evaluateAll();                            // doesn't work.
//  XSSFFormulaEvaluator.evaluateAllFormulaCells(book1);    // doesn't work.
    mainEvaluator.evaluateFormulaCell(cell);
    System.out.println(cell.getNumericCellValue());
    book2.close();
    // Close and write workbook 1
    is.close();
    OutputStream os = Files.newOutputStream(pathBook1);
    book1.write(os);
    os.close();
    book1.close();
票数 1
EN

Stack Overflow用户

发布于 2016-02-08 06:38:42

我最近也有同样的问题。问题是,对于当前的POI,不能编写文档,不能将公式添加到特定的字段中,不能对a执行公式计算,此时仍然没有现有的文档。我解决这个问题的诀窍是:

  1. 将所有数据和公式写入工作簿
  2. 在关闭此文档之前添加workbook.setForceFormulaRecalculation(true);
  3. 书写和关闭文档
  4. 再次打开同一文档,只执行FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); evaluator.evaluateAll();操作
  5. 再写又关
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35093505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档