如何使用poi更新Excel工作表链接

我想在使用setForceFormulaRecal方法后得到更新的单元格值。 但是我还是老旧的价值。 这不是实际的结果。 如果我通过点击打开原始文件将会询问更新链接对话框。 如果我点击“确定”button,则更新所有单元格公式结果。 所以我想通过使用poi来更新excel表格链接。 请帮助在这种情况下。

//设置值之前

HSSFCell cel2=row1.getCell(2); HSSFCell cel4=row1.getCell(5); cel2.setCellValue(690); cel4.setCellValue(690); wb.setForceFormulaRecalculation(true); wb.write(stream); 

//在评估工作簿公式后,我正在尝试如下

  HSSFWorkbook wb = HSSFReadWrite.readFile("D://workspace//ExcelProject//other.xls"); HSSFSheet sheet=wb.getSheetAt(14); HSSFRow row11=sheet.getRow(10); System.out.println("** cell val: "+row11.getCell(3).getNumericCellValue()); 

我也尝试与公式评估,但其显示错误如下

 Could not resolve external workbook name '\Users\asus\Downloads\??? & ???? ?????_091230.xls'. Workbook environment has not been set up. at org.apache.poi.ss.formula.OperationEvaluationContext.createExternSheetRefEvaluator(OperationEvaluationContext.java:87) at org.apache.poi.ss.formula.OperationEvaluationContext.getArea3DEval(OperationEvaluationContext.java:273) at org.apache.poi.ss.formula.WorkbookEvaluator.getEvalForPtg(WorkbookEvaluator.java:660) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:527) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:288) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:230) at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.java:351) at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCell(HSSFFormulaEvaluator.java:213) at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateAllFormulaCells(HSSFFormulaEvaluator.java:324) at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateAll(HSSFFormulaEvaluator.java:343) at HSSFReadWrite.readSheetData(HSSFReadWrite.java:85) at HSSFReadWrite.main(HSSFReadWrite.java:346) Caused by: org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment$WorkbookNotFoundException: Could not resolve external workbook name '\Users\asus\Downloads\??? & ???? ?????_091230.xls'. Workbook environment has not been set up. at org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.getWorkbookEvaluator(CollaboratingWorkbooksEnvironment.java:161) at org.apache.poi.ss.formula.WorkbookEvaluator.getOtherWorkbookEvaluator(WorkbookEvaluator.java:181) at org.apache.poi.ss.formula.OperationEvaluationContext.createExternSheetRefEvaluator(OperationEvaluationContext.java:85) ... 11 more 

好,试着回答:

首先:对当前稳定版本3.10不包括对外部工作簿链接的支持。 所以这个版本不可能直接评估这样的链接。 这就是为什么evaluateAll()将失败的工作簿与外部工作簿的链接。

使用3.11版本,可以这样做。 但是,即使所有的工作簿都打开了,所有工作簿的评估者也都出现了。 请参阅: http : //poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#setupReferencedWorkbooks%28java.util.Map%29

我们可以用稳定版本3.10来做什么,是评估所有包含没有链接到外部工作簿的公式的单元格。

例:

工作簿“workbook.xlsx”包含具有到A2中的外部工作簿的链接的公式: 在这里输入图像说明

 import org.apache.poi.xssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.*; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.FileInputStream; import java.io.InputStream; import java.util.Map; import java.util.HashMap; class ExternalReferenceTest { public static void main(String[] args) { try { InputStream inp = new FileInputStream("workbook.xlsx"); Workbook wb = WorkbookFactory.create(inp); Sheet sheet = wb.getSheetAt(0); Row row = sheet.getRow(0); if (row == null) row = sheet.createRow(0); Cell cell = row.getCell(0); if (cell == null) cell = row.createCell(0); cell.setCellValue(123.45); cell = row.getCell(1); if (cell == null) cell = row.createCell(1); cell.setCellValue(678.90); cell = row.getCell(2); if (cell == null) cell = row.createCell(2); cell.setCellFormula("A1+B1"); FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); //evaluator.evaluateAll(); //will not work because external workbook for formula in A2 is not accessable System.out.println(sheet.getRow(1).getCell(0)); //[1]Sheet1!$A$1 //but we surely can evaluate single cells: cell = wb.getSheetAt(0).getRow(0).getCell(2); System.out.println(evaluator.evaluate(cell).getNumberValue()); //802.35 FileOutputStream fileOut = new FileOutputStream("workbook.xlsx"); wb.write(fileOut); fileOut.flush(); fileOut.close(); } catch (InvalidFormatException ifex) { } catch (FileNotFoundException fnfex) { } catch (IOException ioex) { } } }