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