*/
@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();
}
* @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);
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());
@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);
}
}