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
This commit is contained in:
parent
69ded5b7b0
commit
ed3364b6d2
@ -469,16 +469,28 @@ public final class XSSFCell implements Cell {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getCellFormula() {
|
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();
|
int cellType = getCellType();
|
||||||
if(cellType != CELL_TYPE_FORMULA) throw typeMismatch(CELL_TYPE_FORMULA, cellType, false);
|
if(cellType != CELL_TYPE_FORMULA) throw typeMismatch(CELL_TYPE_FORMULA, cellType, false);
|
||||||
|
|
||||||
CTCellFormula f = _cell.getF();
|
CTCellFormula f = _cell.getF();
|
||||||
if (isPartOfArrayFormulaGroup() && f == null) {
|
if (isPartOfArrayFormulaGroup() && f == null) {
|
||||||
XSSFCell cell = getSheet().getFirstCellInArrayFormula(this);
|
XSSFCell cell = getSheet().getFirstCellInArrayFormula(this);
|
||||||
return cell.getCellFormula();
|
return cell.getCellFormula(fpb);
|
||||||
}
|
}
|
||||||
if (f.getT() == STCellFormulaType.SHARED) {
|
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();
|
return f.getStringValue();
|
||||||
}
|
}
|
||||||
@ -489,7 +501,7 @@ public final class XSSFCell implements Cell {
|
|||||||
* @param si Shared Group Index
|
* @param si Shared Group Index
|
||||||
* @return non shared formula created for the given shared formula and this cell
|
* @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();
|
XSSFSheet sheet = getSheet();
|
||||||
|
|
||||||
CTCellFormula f = sheet.getSharedFormula(si);
|
CTCellFormula f = sheet.getSharedFormula(si);
|
||||||
@ -503,7 +515,6 @@ public final class XSSFCell implements Cell {
|
|||||||
CellRangeAddress ref = CellRangeAddress.valueOf(sharedFormulaRange);
|
CellRangeAddress ref = CellRangeAddress.valueOf(sharedFormulaRange);
|
||||||
|
|
||||||
int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet);
|
int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet);
|
||||||
XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(sheet.getWorkbook());
|
|
||||||
SharedFormula sf = new SharedFormula(SpreadsheetVersion.EXCEL2007);
|
SharedFormula sf = new SharedFormula(SpreadsheetVersion.EXCEL2007);
|
||||||
|
|
||||||
Ptg[] ptgs = FormulaParser.parse(sharedFormula, fpb, FormulaType.CELL, sheetIndex, getRowIndex());
|
Ptg[] ptgs = FormulaParser.parse(sharedFormula, fpb, FormulaType.CELL, sheetIndex, getRowIndex());
|
||||||
|
@ -67,7 +67,9 @@ public final class XSSFEvaluationWorkbook extends BaseXSSFEvaluationWorkbook {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
|
public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
|
||||||
XSSFCell cell = ((XSSFEvaluationCell)evalCell).getXSSFCell();
|
final XSSFCell cell = ((XSSFEvaluationCell)evalCell).getXSSFCell();
|
||||||
return FormulaParser.parse(cell.getCellFormula(), this, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()), cell.getRowIndex());
|
final int sheetIndex = _uBook.getSheetIndex(cell.getSheet());
|
||||||
|
final int rowIndex = cell.getRowIndex();
|
||||||
|
return FormulaParser.parse(cell.getCellFormula(this), this, FormulaType.CELL, sheetIndex, rowIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user