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

时间:2020-08-13 20:49:35

标签: java excel apache-poi

我正在编写一种工具来简化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>

0 个答案:

没有答案
相关问题