You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2021/05/13 12:11:27 UTC

svn commit: r1889837 - in /poi/trunk/poi-ooxml/src: main/java/org/apache/poi/xssf/usermodel/XSSFCell.java test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

Author: centic
Date: Thu May 13 12:11:26 2021
New Revision: 1889837

URL: http://svn.apache.org/viewvc?rev=1889837&view=rev
Log:
Bug 63339: Use removeFormulaImpl() where possible and add a test which verifies that setting a string-value on a formula cell is performed

Modified:
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java
    poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java?rev=1889837&r1=1889836&r2=1889837&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java Thu May 13 12:11:26 2021
@@ -138,9 +138,9 @@ public final class XSSFCell extends Cell
     /**
      * Copy cell value, formula and style, from srcCell per cell copy policy
      * If srcCell is null, clears the cell value and cell style per cell copy policy
-     * 
+     *
      * This does not shift references in formulas. Use {@link org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter} to shift references in formulas.
-     * 
+     *
      * @param srcCell The cell to take value, formula and style from
      * @param policy The policy for copying the information, see {@link CellCopyPolicy}
      * @throws IllegalArgumentException if copy cell style and srcCell is from a different workbook
@@ -190,12 +190,12 @@ public final class XSSFCell extends Cell
                 setBlank();
             }
         }
-        
+
         // Copy CellStyle
         if (policy.isCopyCellStyle()) {
             setCellStyle(srcCell == null ? null : srcCell.getCellStyle());
         }
-        
+
         final Hyperlink srcHyperlink = (srcCell == null) ? null : srcCell.getHyperlink();
 
         if (policy.isMergeHyperlink()) {
@@ -444,7 +444,7 @@ public final class XSSFCell extends Cell
         // 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
      *
@@ -513,7 +513,7 @@ public final class XSSFCell extends Cell
      * To set the precalculated value use {@link #setCellValue(double)} or {@link #setCellValue(String)}
      * </p>
      * <p>
-     * Note, if there are any shared formulas, his will invalidate any 
+     * Note, if there are any shared formulas, his will invalidate any
      * {@link FormulaEvaluator} instances based on this workbook.
      * </p>
      *
@@ -539,11 +539,7 @@ public final class XSSFCell extends Cell
     private void setFormula(String formula, FormulaType formulaType) {
         XSSFWorkbook wb = _row.getSheet().getWorkbook();
         if (formulaType == FormulaType.ARRAY && formula == null) {
-            wb.onDeleteFormula(this);
-            if (_cell.isSetF()) {
-                _row.getSheet().onDeleteFormula(this, null);
-                _cell.unsetF();
-            }
+            removeFormulaImpl();
             return;
         }
 
@@ -630,7 +626,7 @@ public final class XSSFCell extends Cell
      *
      * <p>To change the style of a cell without affecting other cells that use the same style,
      * use {@link org.apache.poi.ss.util.CellUtil#setCellStyleProperties(Cell, java.util.Map)}</p>
-     * 
+     *
      * @param style  reference contained in the workbook.
      * If the value is null then the style information is removed causing the cell to used the default workbook style.
      * @throws IllegalArgumentException if style belongs to a different styles source (most likely because style is from a different Workbook)
@@ -649,7 +645,7 @@ public final class XSSFCell extends Cell
             _cell.setS(idx);
         }
     }
-    
+
     /**
      * POI currently supports these formula types:
      * <ul>
@@ -666,7 +662,7 @@ public final class XSSFCell extends Cell
         }
         return false;
     }
-    
+
     /**
      * Return the cell type.  Tables in an array formula return
      * {@link CellType#FORMULA} for all cells, even though the formula is only defined
@@ -902,7 +898,7 @@ public final class XSSFCell extends Cell
     protected void setCellTypeImpl(CellType cellType) {
         setCellType(cellType, null);
     }
-    
+
     /**
      * Needed by bug #62834, which points out getCellFormula() expects an evaluation context or creates a new one,
      * so if there is one in use, it needs to be carried on through.
@@ -1125,10 +1121,10 @@ public final class XSSFCell extends Cell
     public CTCell getCTCell(){
         return _cell;
     }
-    
+
     /**
      * Set a new internal xml bean. This is only for internal use, do not call this from outside!
-     * 
+     *
      * This is necessary in some rare cases to work around XMLBeans specialties.
      */
     @Internal
@@ -1168,7 +1164,7 @@ public final class XSSFCell extends Cell
                 // fall-through
             case BLANK:
                 return false;
-                
+
             default:
                 throw new IllegalStateException("Unexpected cell type (" + cellType + ")");
         }
@@ -1212,18 +1208,18 @@ public final class XSSFCell extends Cell
                 }
                 throw new IllegalStateException("Unexpected boolean cached formula value '"
                     + textValue + "'.");
-                
+
             case STRING:
                 // fall-through
             case NUMERIC:
                 // fall-through
             case ERROR:
                 return textValue;
-                
+
             default:
                 throw new IllegalStateException("Unexpected formula result type (" + cellType + ")");
         }
-        
+
     }
 
     @Override
@@ -1250,14 +1246,14 @@ public final class XSSFCell extends Cell
 
         CalculationChain calcChain = getSheet().getWorkbook().getCalculationChain();
         int sheetId = Math.toIntExact(getSheet().sheet.getSheetId());
-    
+
         //remove the reference in the calculation chain
         if(calcChain != null) calcChain.removeItem(sheetId, getReference());
-    
+
         CTCell ctCell = getCTCell();
         String r = new CellReference(getRowIndex(), getColumnIndex()).formatAsString();
         ctCell.setR(r);
     }
-        
+
 }
 

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1889837&r1=1889836&r2=1889837&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Thu May 13 12:11:26 2021
@@ -3499,6 +3499,39 @@ public final class TestXSSFBugs extends
     }
 
     @Test
+    public void testBug63339() throws IOException {
+        try (Workbook wb = new XSSFWorkbook()) {
+            Sheet sheet = wb.createSheet();
+            Row row = sheet.createRow(0);
+
+            Cell cell = row.createCell(0, CellType.FORMULA);
+            cell.setCellFormula("SUM(B1:E1)");
+
+            assertNotNull(((XSSFCell) cell).getCTCell().getF(),
+                    "Element 'f' should contain the formula now");
+
+            // this will actually set the "cached" value of the Formula
+            // you will need to use setCellType() to change the cell to
+            // a different type of value
+            cell.setCellValue(34.5);
+
+            assertNotNull(((XSSFCell) cell).getCTCell().getF(),
+                    "Element 'f' should not be set now");
+            assertEquals("34.5", ((XSSFCell) cell).getCTCell().getV(),
+                    "Element 'v' should contain the string now");
+
+            try (Workbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb)) {
+                Cell cellBack = wbBack.getSheetAt(0).getRow(0).getCell(0);
+
+                assertNotNull(((XSSFCell) cellBack).getCTCell().getF(),
+                        "Element 'f' should not be set now");
+                assertEquals("34.5", ((XSSFCell) cellBack).getCTCell().getV(),
+                        "Element 'v' should contain the string now");
+            }
+        }
+    }
+
+    @Test
     void testBug64508() throws IOException {
         try (Workbook wb = XSSFTestDataSamples.openSampleWorkbook("64508.xlsx")) {
             int activeSheet = wb.getActiveSheetIndex();



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org