]> source.dussan.org Git - poi.git/commitdiff
Apply patch from bug 61033 to add a XSSFWorkbook.setCellFormulaValidation(false)...
authorDominik Stadler <centic@apache.org>
Wed, 20 Sep 2017 19:08:57 +0000 (19:08 +0000)
committerDominik Stadler <centic@apache.org>
Wed, 20 Sep 2017 19:08:57 +0000 (19:08 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1809071 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java

index b13359ba0ef10315d5f59a98ec24e69481713dfd..b6abbaf3cc2326c380b9375472adc7c181a3d952 100644 (file)
@@ -564,9 +564,11 @@ public final class XSSFCell implements Cell {
             return;
         }
 
-        XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
-        //validate through the FormulaParser
-        FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex());
+        if(wb.getCellFormulaValidation()) {
+            XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
+            //validate through the FormulaParser
+            FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex());
+        }
 
         CTCellFormula f = CTCellFormula.Factory.newInstance();
         f.setStringValue(formula);
index b7d27bfa824438751d3f825f09540136e4c05d04..9e0f6013f21462a075ad35d4a96641ddebac42ee 100644 (file)
@@ -212,6 +212,11 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
      */
     private MissingCellPolicy _missingCellPolicy = MissingCellPolicy.RETURN_NULL_AND_BLANK;
 
+    /**
+     * Whether a call to {@link XSSFCell#setCellFormula(String)} will validate the formula or not.
+     */
+    private boolean cellFormulaValidation = true;
+
     /**
      * array of pictures for this workbook
      */
@@ -2390,4 +2395,23 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
 
         return oleId;
     }
+
+    /**
+     * Whether a call to {@link XSSFCell#setCellFormula(String)} will validate the formula or not.
+     *
+     * @param value true if the application will validate the formula is correct
+     * @since 3.17
+     */
+    public void setCellFormulaValidation(final boolean value) {
+        this.cellFormulaValidation = value;
+    }
+
+    /**
+     * Whether a call to {@link XSSFCell#setCellFormula(String)} will validate the formula or not.
+     *
+     * @since 3.17
+     */
+    public boolean getCellFormulaValidation() {
+        return this.cellFormulaValidation;
+    }
 }
index de571d4a1f64f146115dda06389a33140de02305..a214abdaeb64e75caec6fa060367ccf0625abddf 100644 (file)
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 
 import java.io.IOException;
 import java.util.List;
@@ -30,6 +31,7 @@ import java.util.List;
 import org.apache.poi.common.usermodel.HyperlinkType;
 import org.apache.poi.hssf.HSSFITestDataProvider;
 import org.apache.poi.ss.SpreadsheetVersion;
+import org.apache.poi.ss.formula.FormulaParseException;
 import org.apache.poi.ss.usermodel.BaseTestXCell;
 import org.apache.poi.ss.usermodel.BorderStyle;
 import org.apache.poi.ss.usermodel.Cell;
@@ -179,6 +181,42 @@ public final class TestXSSFCell extends BaseTestXCell {
             assertEquals(CellType.BLANK, cell.getCellType());
             assertEquals(STCellType.N, ctCell.getT());
             assertEquals("", cell.getStringCellValue());
+
+            // check behavior with setCellFormulaValidation
+            final String invalidFormula = "A", validFormula = "A2";
+            FormulaParseException fpe = null;
+            // check that default is true
+            assertTrue(wb.getCellFormulaValidation());
+
+            // check that valid formula does not throw exception
+            try {
+                cell.setCellFormula(validFormula);
+            } catch(FormulaParseException e) {
+                fpe = e;
+            }
+            assertNull(fpe);
+
+            // check that invalid formula does throw exception
+            try {
+                cell.setCellFormula(invalidFormula);
+            } catch(FormulaParseException e) {
+                fpe = e;
+            }
+            assertNotNull(fpe);
+            fpe = null;
+
+            // set cell formula validation to false
+            wb.setCellFormulaValidation(false);
+            assertFalse(wb.getCellFormulaValidation());
+
+            // check that neither valid nor invalid formula throw an exception
+            try {
+                cell.setCellFormula(validFormula);
+                cell.setCellFormula(invalidFormula);
+            } catch(FormulaParseException e) {
+                fpe = e;
+            }
+            assertNull(fpe);
         } finally {
             wb.close();
         }