diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index b13359ba0..b6abbaf3c 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -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); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index b7d27bfa8..9e0f6013f 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -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; + } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java index de571d4a1..a214abdae 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java @@ -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(); }