From 181de5f6e51a121db2bce1e2d09b6662199885d5 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 22 Dec 2014 10:03:32 +0000 Subject: [PATCH] Bug 56888: XSSFDataValidation ignores "allow blank" read from sheet, assumes true Add TestSXSSFDataValidation to verify some parts for SXSSF as well git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1647276 13f79535-47bb-0310-9956-ffa450edef68 --- .../xssf/usermodel/XSSFDataValidation.java | 11 +-- .../usermodel/XSSFDataValidationHelper.java | 3 + .../streaming/TestSXSSFDataValidation.java | 42 ++++++++ .../usermodel/TestXSSFDataValidation.java | 98 ++++++++++++++++--- 4 files changed, 131 insertions(+), 23 deletions(-) create mode 100644 src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFDataValidation.java diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java index c776c8781..c204e86a8 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java @@ -83,12 +83,7 @@ public class XSSFDataValidation implements DataValidation { XSSFDataValidation(CellRangeAddressList regions,CTDataValidation ctDataValidation) { - super(); - this.validationConstraint = getConstraint(ctDataValidation); - this.ctDdataValidation = ctDataValidation; - this.regions = regions; - this.ctDdataValidation.setErrorStyle(STDataValidationErrorStyle.STOP); - this.ctDdataValidation.setAllowBlank(true); + this(getConstraint(ctDataValidation), regions, ctDataValidation); } public XSSFDataValidation(XSSFDataValidationConstraint constraint,CellRangeAddressList regions,CTDataValidation ctDataValidation) { @@ -96,8 +91,6 @@ public class XSSFDataValidation implements DataValidation { this.validationConstraint = constraint; this.ctDdataValidation = ctDataValidation; this.regions = regions; - this.ctDdataValidation.setErrorStyle(STDataValidationErrorStyle.STOP); - this.ctDdataValidation.setAllowBlank(true); } CTDataValidation getCtDdataValidation() { @@ -243,7 +236,7 @@ public class XSSFDataValidation implements DataValidation { return builder.toString(); } - private XSSFDataValidationConstraint getConstraint(CTDataValidation ctDataValidation) { + private static XSSFDataValidationConstraint getConstraint(CTDataValidation ctDataValidation) { XSSFDataValidationConstraint constraint = null; String formula1 = ctDataValidation.getFormula1(); String formula2 = ctDataValidation.getFormula2(); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationHelper.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationHelper.java index b0bd4e783..d86911035 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationHelper.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationHelper.java @@ -26,6 +26,7 @@ import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidation; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationErrorStyle; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationOperator; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationType; @@ -166,6 +167,8 @@ public class XSSFDataValidationHelper implements DataValidationHelper { sqref.add(cellRangeAddress.formatAsString()); } newDataValidation.setSqref(sqref); + newDataValidation.setAllowBlank(true); + newDataValidation.setErrorStyle(STDataValidationErrorStyle.STOP); return new XSSFDataValidation(dataValidationConstraint,cellRangeAddressList,newDataValidation); } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFDataValidation.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFDataValidation.java new file mode 100644 index 000000000..a377d5958 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFDataValidation.java @@ -0,0 +1,42 @@ +package org.apache.poi.xssf.streaming; + +import java.util.List; + +import org.apache.poi.ss.usermodel.BaseTestDataValidation; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.SXSSFITestDataProvider; + +public class TestSXSSFDataValidation extends BaseTestDataValidation { + + public TestSXSSFDataValidation(){ + super(SXSSFITestDataProvider.instance); + } + + public void test53965() throws Exception { + SXSSFWorkbook wb = new SXSSFWorkbook(); + try { + Sheet sheet = wb.createSheet(); + List lst = sheet.getDataValidations(); //<-- works + assertEquals(0, lst.size()); + + //create the cell that will have the validation applied + sheet.createRow(0).createCell(0); + + DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = dataValidationHelper.createCustomConstraint("SUM($A$1:$A$1) <= 3500"); + CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0); + DataValidation validation = dataValidationHelper.createValidation(constraint, addressList); + sheet.addValidationData(validation); + + // this line caused XmlValueOutOfRangeException , see Bugzilla 3965 + lst = sheet.getDataValidations(); + assertEquals(1, lst.size()); + } finally { + wb.close(); + } + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidation.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidation.java index 35110797d..25474605a 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidation.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidation.java @@ -16,13 +16,19 @@ ==================================================================== */ package org.apache.poi.xssf.usermodel; -import java.io.FileOutputStream; +import java.io.IOException; import java.math.BigDecimal; import java.util.List; -import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.BaseTestDataValidation; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; import org.apache.poi.ss.usermodel.DataValidationConstraint.OperatorType; import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.ss.util.CellReference; @@ -242,23 +248,87 @@ public class TestXSSFDataValidation extends BaseTestDataValidation { } public void test53965() throws Exception { - XSSFWorkbook wb = new XSSFWorkbook(); - XSSFSheet sheet = wb.createSheet(); - List lst = sheet.getDataValidations(); //<-- works - assertEquals(0, lst.size()); + try { + XSSFSheet sheet = wb.createSheet(); + List lst = sheet.getDataValidations(); //<-- works + assertEquals(0, lst.size()); + + //create the cell that will have the validation applied + sheet.createRow(0).createCell(0); + + DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = dataValidationHelper.createCustomConstraint("SUM($A$1:$A$1) <= 3500"); + CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0); + DataValidation validation = dataValidationHelper.createValidation(constraint, addressList); + sheet.addValidationData(validation); + + // this line caused XmlValueOutOfRangeException , see Bugzilla 3965 + lst = sheet.getDataValidations(); + assertEquals(1, lst.size()); + } finally { + wb.close(); + } + } + public void testDefaultAllowBlank() throws IOException { + XSSFWorkbook wb = new XSSFWorkbook(); + try { + XSSFSheet sheet = wb.createSheet(); + + final XSSFDataValidation validation = createValidation(sheet); + sheet.addValidationData(validation); + + final List dataValidations = sheet.getDataValidations(); + assertEquals(true, dataValidations.get(0).getCtDdataValidation().getAllowBlank()); + } finally { + wb.close(); + } + } + + public void testSetAllowBlankToFalse() throws IOException { + XSSFWorkbook wb = new XSSFWorkbook(); + try { + XSSFSheet sheet = wb.createSheet(); + + final XSSFDataValidation validation = createValidation(sheet); + validation.getCtDdataValidation().setAllowBlank(false); + + sheet.addValidationData(validation); + + final List dataValidations = sheet.getDataValidations(); + assertEquals(false, dataValidations.get(0).getCtDdataValidation().getAllowBlank()); + } finally { + wb.close(); + } + } + + public void testSetAllowBlankToTrue() throws IOException { + XSSFWorkbook wb = new XSSFWorkbook(); + try { + XSSFSheet sheet = wb.createSheet(); + + final XSSFDataValidation validation = createValidation(sheet); + validation.getCtDdataValidation().setAllowBlank(true); + + sheet.addValidationData(validation); + + final List dataValidations = sheet.getDataValidations(); + assertEquals(true, dataValidations.get(0).getCtDdataValidation().getAllowBlank()); + } finally { + wb.close(); + } + } + + private XSSFDataValidation createValidation(XSSFSheet sheet) { //create the cell that will have the validation applied - sheet.createRow(0).createCell(0); + final Row row = sheet.createRow(0); + row.createCell(0); DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper(); - DataValidationConstraint constraint = dataValidationHelper.createCustomConstraint("SUM($A$1:$A$1) <= 3500"); - CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0); - DataValidation validation = dataValidationHelper.createValidation(constraint, addressList); - sheet.addValidationData(validation); - // this line caused XmlValueOutOfRangeException , see Bugzilla 3965 - lst = sheet.getDataValidations(); - assertEquals(1, lst.size()); + DataValidationConstraint constraint = dataValidationHelper.createCustomConstraint("true"); + final XSSFDataValidation validation = (XSSFDataValidation) dataValidationHelper.createValidation(constraint, new CellRangeAddressList(0, 0, 0, 0)); + return validation; } }