123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==================================================================== */
- package org.apache.poi.xssf.usermodel;
-
- import java.math.BigDecimal;
- import java.util.List;
-
- import org.apache.poi.ss.usermodel.*;
- import org.apache.poi.ss.usermodel.DataValidationConstraint.OperatorType;
- import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType;
- import org.apache.poi.ss.util.CellRangeAddress;
- import org.apache.poi.ss.util.CellRangeAddressList;
- import org.apache.poi.ss.util.CellReference;
- import org.apache.poi.xssf.XSSFITestDataProvider;
- import org.apache.poi.xssf.XSSFTestDataSamples;
-
- public class TestXSSFDataValidation extends BaseTestDataValidation {
-
- public TestXSSFDataValidation(){
- super(XSSFITestDataProvider.instance);
- }
-
- public void testAddValidations() throws Exception {
- XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("DataValidations-49244.xlsx");
- Sheet sheet = workbook.getSheetAt(0);
- List<XSSFDataValidation> dataValidations = ((XSSFSheet)sheet).getDataValidations();
-
- /**
- * For each validation type, there are two cells with the same validation. This tests
- * application of a single validation definition to multiple cells.
- *
- * For list ( 3 validations for explicit and 3 for formula )
- * - one validation that allows blank.
- * - one that does not allow blank.
- * - one that does not show the drop down arrow.
- * = 2
- *
- * For number validations ( integer/decimal and text length ) with 8 different types of operators.
- * = 50
- *
- * = 52 ( Total )
- */
- assertEquals(52,dataValidations.size());
-
- DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
- int[] validationTypes = new int[]{ValidationType.INTEGER,ValidationType.DECIMAL,ValidationType.TEXT_LENGTH};
-
- int[] singleOperandOperatorTypes = new int[]{
- OperatorType.LESS_THAN,OperatorType.LESS_OR_EQUAL,
- OperatorType.GREATER_THAN,OperatorType.GREATER_OR_EQUAL,
- OperatorType.EQUAL,OperatorType.NOT_EQUAL
- } ;
- int[] doubleOperandOperatorTypes = new int[]{
- OperatorType.BETWEEN,OperatorType.NOT_BETWEEN
- };
-
- BigDecimal value = new BigDecimal("10"),value2 = new BigDecimal("20");
- BigDecimal dvalue = new BigDecimal("10.001"),dvalue2 = new BigDecimal("19.999");
- final int lastRow = sheet.getLastRowNum();
- int offset = lastRow + 3;
-
- int lastKnownNumValidations = dataValidations.size();
-
- Row row = sheet.createRow(offset++);
- Cell cell = row.createCell(0);
- DataValidationConstraint explicitListValidation = dataValidationHelper.createExplicitListConstraint(new String[]{"MA","MI","CA"});
- CellRangeAddressList cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(cell.getRowIndex(), cell.getColumnIndex(), cell.getRowIndex(), cell.getColumnIndex());
- DataValidation dataValidation = dataValidationHelper.createValidation(explicitListValidation, cellRangeAddressList);
- setOtherValidationParameters(dataValidation);
- sheet.addValidationData(dataValidation);
- lastKnownNumValidations++;
-
- row = sheet.createRow(offset++);
- cell = row.createCell(0);
-
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(cell.getRowIndex(), cell.getColumnIndex(), cell.getRowIndex(), cell.getColumnIndex());
-
- Cell firstCell = row.createCell(1);firstCell.setCellValue("UT");
- Cell secondCell = row.createCell(2);secondCell.setCellValue("MN");
- Cell thirdCell = row.createCell(3);thirdCell.setCellValue("IL");
-
- int rowNum = row.getRowNum() + 1;
- String listFormula = new StringBuilder("$B$").append(rowNum).append(":").append("$D$").append(rowNum).toString();
- DataValidationConstraint formulaListValidation = dataValidationHelper.createFormulaListConstraint(listFormula);
-
- dataValidation = dataValidationHelper.createValidation(formulaListValidation, cellRangeAddressList);
- setOtherValidationParameters(dataValidation);
- sheet.addValidationData(dataValidation);
- lastKnownNumValidations++;
-
- offset++;
- offset++;
-
- for (int i = 0; i < validationTypes.length; i++) {
- int validationType = validationTypes[i];
- offset = offset + 2;
- final Row row0 = sheet.createRow(offset++);
- Cell cell_10 = row0.createCell(0);
- cell_10.setCellValue(validationType==ValidationType.DECIMAL ? "Decimal " : validationType==ValidationType.INTEGER ? "Integer" : "Text Length");
- offset++;
- for (int j = 0; j < singleOperandOperatorTypes.length; j++) {
- int operatorType = singleOperandOperatorTypes[j];
- final Row row1 = sheet.createRow(offset++);
-
- //For Integer (> and >=) we add 1 extra cell for validations whose formulae reference other cells.
- final Row row2 = i==0 && j < 2 ? sheet.createRow(offset++) : null;
-
- cell_10 = row1.createCell(0);
- cell_10.setCellValue(XSSFDataValidation.operatorTypeMappings.get(operatorType).toString());
- Cell cell_11 = row1.createCell(1);
- Cell cell_21 = row1.createCell(2);
- Cell cell_22 = i==0 && j < 2 ? row2.createCell(2) : null;
-
- Cell cell_13 = row1.createCell(3);
-
-
- cell_13.setCellType(Cell.CELL_TYPE_NUMERIC);
- cell_13.setCellValue(validationType==ValidationType.DECIMAL ? dvalue.doubleValue() : value.intValue());
-
-
- //First create value based validation;
- DataValidationConstraint constraint = dataValidationHelper.createNumericConstraint(validationType,operatorType, value.toString(), null);
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_11.getRowIndex(),cell_11.getRowIndex(),cell_11.getColumnIndex(),cell_11.getColumnIndex()));
- DataValidation validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
- setOtherValidationParameters(validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations,((XSSFSheet)sheet).getDataValidations().size());
-
- //Now create real formula based validation.
- String formula1 = new CellReference(cell_13.getRowIndex(),cell_13.getColumnIndex()).formatAsString();
- constraint = dataValidationHelper.createNumericConstraint(validationType,operatorType, formula1, null);
- if (i==0 && j==0) {
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_21.getRowIndex(), cell_21.getRowIndex(), cell_21.getColumnIndex(), cell_21.getColumnIndex()));
- validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
- setOtherValidationParameters(validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations, ((XSSFSheet) sheet).getDataValidations().size());
-
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_22.getRowIndex(), cell_22.getRowIndex(), cell_22.getColumnIndex(), cell_22.getColumnIndex()));
- validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
- setOtherValidationParameters( validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations, ((XSSFSheet) sheet).getDataValidations().size());
- } else if(i==0 && j==1 ){
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_21.getRowIndex(), cell_21.getRowIndex(), cell_21.getColumnIndex(), cell_21.getColumnIndex()));
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_22.getRowIndex(), cell_22.getRowIndex(), cell_22.getColumnIndex(), cell_22.getColumnIndex()));
- validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
- setOtherValidationParameters( validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations, ((XSSFSheet) sheet).getDataValidations().size());
- } else {
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_21.getRowIndex(), cell_21.getRowIndex(), cell_21.getColumnIndex(), cell_21.getColumnIndex()));
- validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
- setOtherValidationParameters(validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations, ((XSSFSheet) sheet).getDataValidations().size());
- }
- }
-
- for (int j = 0; j < doubleOperandOperatorTypes.length; j++) {
- int operatorType = doubleOperandOperatorTypes[j];
- final Row row1 = sheet.createRow(offset++);
-
- cell_10 = row1.createCell(0);
- cell_10.setCellValue(XSSFDataValidation.operatorTypeMappings.get(operatorType).toString());
-
- Cell cell_11 = row1.createCell(1);
- Cell cell_21 = row1.createCell(2);
-
- Cell cell_13 = row1.createCell(3);
- Cell cell_14 = row1.createCell(4);
-
-
- String value1String = validationType==ValidationType.DECIMAL ? dvalue.toString() : value.toString();
- cell_13.setCellType(Cell.CELL_TYPE_NUMERIC);
- cell_13.setCellValue(validationType==ValidationType.DECIMAL ? dvalue.doubleValue() : value.intValue());
-
- String value2String = validationType==ValidationType.DECIMAL ? dvalue2.toString() : value2.toString();
- cell_14.setCellType(Cell.CELL_TYPE_NUMERIC);
- cell_14.setCellValue(validationType==ValidationType.DECIMAL ? dvalue2.doubleValue() : value2.intValue());
-
-
- //First create value based validation;
- DataValidationConstraint constraint = dataValidationHelper.createNumericConstraint(validationType,operatorType, value1String, value2String);
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_11.getRowIndex(),cell_11.getRowIndex(),cell_11.getColumnIndex(),cell_11.getColumnIndex()));
- DataValidation validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
- setOtherValidationParameters(validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations,((XSSFSheet)sheet).getDataValidations().size());
-
-
- //Now create real formula based validation.
- String formula1 = new CellReference(cell_13.getRowIndex(),cell_13.getColumnIndex()).formatAsString();
- String formula2 = new CellReference(cell_14.getRowIndex(),cell_14.getColumnIndex()).formatAsString();
- constraint = dataValidationHelper.createNumericConstraint(validationType,operatorType, formula1, formula2);
- cellRangeAddressList = new CellRangeAddressList();
- cellRangeAddressList.addCellRangeAddress(new CellRangeAddress(cell_21.getRowIndex(),cell_21.getRowIndex(),cell_21.getColumnIndex(),cell_21.getColumnIndex()));
- validation = dataValidationHelper.createValidation(constraint, cellRangeAddressList);
-
- setOtherValidationParameters(validation);
- sheet.addValidationData(validation);
- assertEquals(++lastKnownNumValidations,((XSSFSheet)sheet).getDataValidations().size());
- }
- }
-
- workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
- Sheet sheetAt = workbook.getSheetAt(0);
- assertEquals(lastKnownNumValidations,((XSSFSheet)sheetAt).getDataValidations().size());
- }
-
- protected void setOtherValidationParameters(DataValidation validation) {
- boolean yesNo = true;
- validation.setEmptyCellAllowed(yesNo);
- validation.setShowErrorBox(yesNo);
- validation.setShowPromptBox(yesNo);
- validation.createErrorBox("Error Message Title", "Error Message");
- validation.createPromptBox("Prompt", "Enter some value");
- validation.setSuppressDropDownArrow(yesNo);
- }
- }
|