]> source.dussan.org Git - poi.git/commitdiff
bug 57840: re-use XSSFEvaluationWorkbook when expanding a shared formula; patch from...
authorJaven O'Neal <onealj@apache.org>
Sat, 11 Jun 2016 02:28:21 +0000 (02:28 +0000)
committerJaven O'Neal <onealj@apache.org>
Sat, 11 Jun 2016 02:28:21 +0000 (02:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1747840 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java

index ef2a7d94e5b143f03fbc66b8454fe040ccae0468..dd2417630c47f357a7ded0b1e701936078a081bc 100644 (file)
@@ -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());
index 413a1fab2b1d36401728e61ca145809a1684def4..d97119cdb7e400f99253e2bc28dd281158822d8f 100644 (file)
@@ -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);
     }
 }