【问题标题】:apache poi how to disable external reference or external links?apache poi 如何禁用外部引用或外部链接?
【发布时间】:2011-07-07 19:31:04
【问题描述】:

我已经在网上搜索了 30 分钟,但找不到任何解释。这是我的问题:

我用 poi 编写了一个应用程序来解析大约 200 个 excel 文件中的一些数据,并将其中的一些放入一个新文件中。我使用 FormulaEvaluator 进行了一些单元格评估,以了解单元格的内容,然后再选择是否保留它们。
现在,当我在单元格中只有值的测试文件上对其进行测试时,程序运行良好,但是当我在一堆文件中使用它时,我得到了这个错误:

“无法解析外部工作簿名称”

有什么方法可以忽略外部工作簿引用或设置环境,使其不会使用外部引用评估公式?
因为我需要的不包含引用...

谢谢

【问题讨论】:

    标签: reference external apache-poi


    【解决方案1】:

    你能不只是捕捉错误,然后跳过那个单元格吗?

    您收到错误是因为您已要求 POI 评估单元格中的公式,而该公式引用了不同的文件。但是,您没有告诉 POI 在哪里可以找到引用的文件,因此它是对象。

    如果您不关心具有外部引用的单元格,只需捕获异常并继续下一个单元格。

    如果您在乎,您需要告诉 POI 在哪里可以找到您的文件。您可以使用 setupEnvironment(String[],Evaluator[]) 方法执行此操作 - 向它传递一个工作簿名称数组,以及这些工作簿的一个匹配的评估器数组。

    【讨论】:

    • 确实不错,我完全忘记了捕捉异常。我今晚试试!谢谢
    • 我确实捕捉到了异常,但问题是似乎在首次使用/创建评估器时抛出异常,然后它不适用于文件的其余部分.. .
    • 只要您依次评估每个单元格,而不是尝试一次性完成整个工作簿,我希望它会很好
    • 我同意你的观点,但是我无法让它工作......我稍后会尝试添加一些代码。
    【解决方案2】:

    为了让 POI 能够评估外部参考,它需要访问相关工作簿。由于这些在您的系统上的名称不一定与工作簿中的名称相同,因此您需要通过 setupReferencedWorkbooks(java.util.Map 为 POI 提供对打开的工作簿的外部引用的映射工作簿)方法。

    我已经完成了,请看下面在我身边运行良好的代码

    public static void writeWithExternalReference(String cellContent, boolean isRowUpdate, boolean isFormula)
        {
            try
            {
            File yourFile = new File("E:\\Book1.xlsx");
            yourFile.createNewFile(); 
            FileInputStream myxls = null;
    
            myxls = new FileInputStream(yourFile);
    
            XSSFWorkbook workbook = new XSSFWorkbook(myxls);
            FormulaEvaluator mainWorkbookEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
    
                XSSFWorkbook workbook1 = new XSSFWorkbook(new File("E:\\elk\\lookup.xlsx"));
    
            // Track the workbook references
                Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
                workbooks.put("Book1.xlsx", mainWorkbookEvaluator);
                workbooks.put("elk/lookup.xlsx", workbook1.getCreationHelper().createFormulaEvaluator());
    workbook2.getCreationHelper().createFormulaEvaluator());
    // Attach them
                mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks);
    
                XSSFSheet worksheet = workbook.getSheetAt(0);
                XSSFRow row = null;
                if (isRowUpdate) {
                    int lastRow = worksheet.getLastRowNum();
                    row = worksheet.createRow(++lastRow);
                }
                else {
                    row = worksheet.getRow(worksheet.getLastRowNum());
                }
                if (!isFormula) {
                    Cell cell = row.createCell(row.getLastCellNum()==-1 ? 0 : row.getLastCellNum());
                    cell.setCellValue(Double.parseDouble(cellContent));
                } else {
                    XSSFCell cell  = row.createCell(row.getLastCellNum()==-1 ? 0 : row.getLastCellNum());
                    System.out.println(cellContent);
                    cell.setCellFormula(cellContent);
                    mainWorkbookEvaluator.evaluateInCell(cell);
                    cell.setCellFormula(cellContent);
    //                mainWorkbookEvaluator.evaluateInCell(cell);
                    //System.out.println(cell.getCellFormula() + " = "+cell.getStringCellValue());
                }
    
                workbook1.close();
                myxls.close();
                FileOutputStream output_file =new FileOutputStream(yourFile,false);
                //write changes
                workbook.write(output_file);
                output_file.close();
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多