From: Javen O'Neal Date: Sat, 11 Jun 2016 02:28:21 +0000 (+0000) Subject: bug 57840: re-use XSSFEvaluationWorkbook when expanding a shared formula; patch from... X-Git-Tag: REL_3_15_BETA2~154 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f9409282d9c665c13b5d72afa86cd6baef3c8642;p=poi.git bug 57840: re-use XSSFEvaluationWorkbook when expanding a shared formula; patch from Greg Woolsey git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1747840 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index ef2a7d94e5..dd2417630c 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -469,16 +469,28 @@ public final class XSSFCell implements Cell { */ @Override public String getCellFormula() { + // existing behavior - create a new XSSFEvaluationWorkbook for every call + return getCellFormula(null); + } + + /** + * package/hierarchy use only - reuse an existing evaluation workbook if available for caching + * + * @param fpb evaluation workbook for reuse, if available, or null to create a new one as needed + * @return a formula for the cell + * @throws IllegalStateException if the cell type returned by {@link #getCellType()} is not CELL_TYPE_FORMULA + */ + protected String getCellFormula(XSSFEvaluationWorkbook fpb) { int cellType = getCellType(); if(cellType != CELL_TYPE_FORMULA) throw typeMismatch(CELL_TYPE_FORMULA, cellType, false); CTCellFormula f = _cell.getF(); if (isPartOfArrayFormulaGroup() && f == null) { XSSFCell cell = getSheet().getFirstCellInArrayFormula(this); - return cell.getCellFormula(); + return cell.getCellFormula(fpb); } if (f.getT() == STCellFormulaType.SHARED) { - return convertSharedFormula((int)f.getSi()); + return convertSharedFormula((int)f.getSi(), fpb == null ? XSSFEvaluationWorkbook.create(getSheet().getWorkbook()) : fpb); } return f.getStringValue(); } @@ -489,7 +501,7 @@ public final class XSSFCell implements Cell { * @param si Shared Group Index * @return non shared formula created for the given shared formula and this cell */ - private String convertSharedFormula(int si){ + private String convertSharedFormula(int si, XSSFEvaluationWorkbook fpb){ XSSFSheet sheet = getSheet(); CTCellFormula f = sheet.getSharedFormula(si); @@ -503,7 +515,6 @@ public final class XSSFCell implements Cell { CellRangeAddress ref = CellRangeAddress.valueOf(sharedFormulaRange); int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet); - XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(sheet.getWorkbook()); SharedFormula sf = new SharedFormula(SpreadsheetVersion.EXCEL2007); Ptg[] ptgs = FormulaParser.parse(sharedFormula, fpb, FormulaType.CELL, sheetIndex, getRowIndex()); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java index 413a1fab2b..d97119cdb7 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java @@ -67,7 +67,9 @@ public final class XSSFEvaluationWorkbook extends BaseXSSFEvaluationWorkbook { @Override public Ptg[] getFormulaTokens(EvaluationCell evalCell) { - XSSFCell cell = ((XSSFEvaluationCell)evalCell).getXSSFCell(); - return FormulaParser.parse(cell.getCellFormula(), this, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()), cell.getRowIndex()); + final XSSFCell cell = ((XSSFEvaluationCell)evalCell).getXSSFCell(); + final int sheetIndex = _uBook.getSheetIndex(cell.getSheet()); + final int rowIndex = cell.getRowIndex(); + return FormulaParser.parse(cell.getCellFormula(this), this, FormulaType.CELL, sheetIndex, rowIndex); } }