Compare commits

...

2 Commits

3 changed files with 67 additions and 3 deletions

View File

@ -561,9 +561,11 @@ public final class XSSFCell implements Cell {
return; return;
} }
XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb); if(wb.getCellFormulaValidation()) {
//validate through the FormulaParser XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex()); //validate through the FormulaParser
FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex());
}
CTCellFormula f = CTCellFormula.Factory.newInstance(); CTCellFormula f = CTCellFormula.Factory.newInstance();
f.setStringValue(formula); f.setStringValue(formula);

View File

@ -208,6 +208,11 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
*/ */
private MissingCellPolicy _missingCellPolicy = MissingCellPolicy.RETURN_NULL_AND_BLANK; 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 * array of pictures for this workbook
*/ */
@ -2470,4 +2475,23 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
return oleId; 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;
}
} }

View File

@ -23,6 +23,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@ -30,6 +31,7 @@ import java.util.List;
import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.hssf.HSSFITestDataProvider; import org.apache.poi.hssf.HSSFITestDataProvider;
import org.apache.poi.ss.SpreadsheetVersion; 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.BaseTestXCell;
import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
@ -179,6 +181,42 @@ public final class TestXSSFCell extends BaseTestXCell {
assertEquals(CellType.BLANK, cell.getCellTypeEnum()); assertEquals(CellType.BLANK, cell.getCellTypeEnum());
assertEquals(STCellType.N, ctCell.getT()); assertEquals(STCellType.N, ctCell.getT());
assertEquals("", cell.getStringCellValue()); 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 { } finally {
wb.close(); wb.close();
} }