带有外部工作簿的单元格公式参考HSSFWorkbook

问题描述

我正在编写一种工具来简化Excel的某些电子表格工作。我有需要以前文件的Excel文件我有一些单元格具有引用其他工作簿的公式。例如:PERIOD 2.xls需要PERIOD 1.xls。据我了解,这意味着我需要添加此参考并对其进行评估。下面是我的代码片段,展示了我如何做这一切:

public PeriodFileWriter(File currentPeriodFile) throws IOException,InvalidFormatException {
    Files.copy(templateFile.toPath(),currentPeriodFile.toPath(),StandardcopyOption.REPLACE_EXISTING);
    referencedFiles = new HashMap<>();
    loadCurrentWorkbook(currentPeriodFile);
    loadPrevIoUsWorkbook();
  }
    
  private void loadCurrentWorkbook(File currentPeriodFile) throws IOException {
    this.currentPeriodFile = currentPeriodFile;
    this.currInputStream = new FileInputStream(currentPeriodFile);
    this.currWorkbook =  new hssfWorkbook(currInputStream);
    this.currEvaluator = currWorkbook.getCreationHelper().createFormulaEvaluator();
    referencedFiles.put(currentPeriodFile.getName(),currEvaluator);
  }
  
  private void loadPrevIoUsWorkbook() throws IOException {
    String prevFilePath = templateFile.getParent() + "\\" + getPrevIoUsFilename();
    prevIoUsPeriodFile = new File(prevFilePath);
    prevInputStream =  new FileInputStream(prevIoUsPeriodFile);
    prevWorkbook = new hssfWorkbook(prevInputStream);
    prevEvaluator = prevWorkbook.getCreationHelper().createFormulaEvaluator();
    referencedFiles.put(getPrevIoUsFilename(),prevEvaluator);
    currEvaluator.setupReferencedWorkbooks(referencedFiles);
    currEvaluator.evaluateall();
  }

  public void updateYTDBudget(String sheetName) {
    String prevFileName = getPrevIoUsFilename();
    String cellFormula = String.format("'[%s]%s'!%s + E56",prevFileName,sheetName,"H56");
    Sheet sheet = getWorkbook().getSheet(sheetName);
    ExcelUtil.setCellFormula(sheet,"H56",cellFormula);
  }

但是,当我运行代码时,我得到了:

Exception in thread "main" java.lang.RuntimeException: No external workbook with name 'PERIOD 1.xls'
    at org.apache.poi.hssf.model.LinkTable.getExternalSheetIndex(LinkTable.java:445)
    at org.apache.poi.hssf.model.InternalWorkbook.getExternalSheetIndex(InternalWorkbook.java:1571)
    at org.apache.poi.hssf.usermodel.hssfEvaluationWorkbook.getSheetExtix(hssfEvaluationWorkbook.java:291)
    at org.apache.poi.hssf.usermodel.hssfEvaluationWorkbook.get3DReferencePtg(hssfEvaluationWorkbook.java:88)
    at org.apache.poi.ss.formula.FormulaParser.createAreaRefParseNode(FormulaParser.java:984)
    at org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:576)
    at org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:322)
    at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1548)
    at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1506)
    at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1493)
    at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1867)
    at org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1994)
    at org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1978)
    at org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1935)
    at org.apache.poi.ss.formula.FormulaParser.intersectionExpression(FormulaParser.java:1908)
    at org.apache.poi.ss.formula.FormulaParser.unionExpression(FormulaParser.java:1889)
    at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:2036)
    at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:170)
    at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:190)
    at org.apache.poi.hssf.model.hssfFormulaParser.parse(hssfFormulaParser.java:79)
    at org.apache.poi.hssf.usermodel.hssfCell.setCellFormulaimpl(hssfCell.java:542)
    at org.apache.poi.ss.usermodel.CellBase.setCellFormula(CellBase.java:132)
    at brilam.qboTool.ExcelUtil.setCellFormula(ExcelUtil.java:34)
    at brilam.qboTool.PeriodFileWriter.updateYTDBudget(PeriodFileWriter.java:87)
    at brilam.qboTool.App.main(App.java:28)

我当前正在使用此

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)