package org.apache.poi.xssf.usermodel;
import java.util.ArrayList;
import java.util.List;
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.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;
public class XSSFDataValidationHelper implements DataValidationHelper {
public XSSFDataValidationHelper(XSSFSheet xssfSheet) {
super();
}
public DataValidationConstraint createDateConstraint(int operatorType, String formula1, String formula2, String dateFormat) {
return new XSSFDataValidationConstraint(ValidationType.DATE, operatorType,formula1, formula2);
}
public DataValidationConstraint createDecimalConstraint(int operatorType, String formula1, String formula2) {
return new XSSFDataValidationConstraint(ValidationType.DECIMAL, operatorType,formula1, formula2);
}
public DataValidationConstraint createExplicitListConstraint(String[] listOfValues) {
return new XSSFDataValidationConstraint(listOfValues);
}
public DataValidationConstraint createFormulaListConstraint(String listFormula) {
return new XSSFDataValidationConstraint(ValidationType.LIST, listFormula);
}
public DataValidationConstraint createNumericConstraint(int validationType, int operatorType, String formula1, String formula2) {
if( validationType==ValidationType.INTEGER) {
return createIntegerConstraint(operatorType, formula1, formula2);
} else if ( validationType==ValidationType.DECIMAL) {
return createDecimalConstraint(operatorType, formula1, formula2);
} else if ( validationType==ValidationType.TEXT_LENGTH) {
return createTextLengthConstraint(operatorType, formula1, formula2);
}
return null;
}
public DataValidationConstraint createIntegerConstraint(int operatorType, String formula1, String formula2) {
return new XSSFDataValidationConstraint(ValidationType.INTEGER, operatorType,formula1,formula2);
}
public DataValidationConstraint createTextLengthConstraint(int operatorType, String formula1, String formula2) {
return new XSSFDataValidationConstraint(ValidationType.TEXT_LENGTH, operatorType,formula1,formula2);
}
public DataValidationConstraint createTimeConstraint(int operatorType, String formula1, String formula2) {
return new XSSFDataValidationConstraint(ValidationType.TIME, operatorType,formula1,formula2);
}
public DataValidationConstraint createCustomConstraint(String formula) {
return new XSSFDataValidationConstraint(ValidationType.FORMULA, formula);
}
public DataValidation createValidation(DataValidationConstraint constraint, CellRangeAddressList cellRangeAddressList) {
XSSFDataValidationConstraint dataValidationConstraint = (XSSFDataValidationConstraint)constraint;
CTDataValidation newDataValidation = CTDataValidation.Factory.newInstance();
int validationType = constraint.getValidationType();
switch(validationType) {
case DataValidationConstraint.ValidationType.LIST:
newDataValidation.setType(STDataValidationType.LIST);
newDataValidation.setFormula1(constraint.getFormula1());
break;
case DataValidationConstraint.ValidationType.ANY:
newDataValidation.setType(STDataValidationType.NONE);
break;
case DataValidationConstraint.ValidationType.TEXT_LENGTH:
newDataValidation.setType(STDataValidationType.TEXT_LENGTH);
break;
case DataValidationConstraint.ValidationType.DATE:
newDataValidation.setType(STDataValidationType.DATE);
break;
case DataValidationConstraint.ValidationType.INTEGER:
newDataValidation.setType(STDataValidationType.WHOLE);
break;
case DataValidationConstraint.ValidationType.DECIMAL:
newDataValidation.setType(STDataValidationType.DECIMAL);
break;
case DataValidationConstraint.ValidationType.TIME:
newDataValidation.setType(STDataValidationType.TIME);
break;
case DataValidationConstraint.ValidationType.FORMULA:
newDataValidation.setType(STDataValidationType.CUSTOM);
break;
default:
newDataValidation.setType(STDataValidationType.NONE);
}
if (validationType!=ValidationType.ANY && validationType!=ValidationType.LIST) {
STDataValidationOperator.Enum op = XSSFDataValidation.operatorTypeMappings.get(constraint.getOperator());
if(op != null) {
newDataValidation.setOperator(op);
}
if (constraint.getFormula1() != null) {
newDataValidation.setFormula1(constraint.getFormula1());
}
if (constraint.getFormula2() != null) {
newDataValidation.setFormula2(constraint.getFormula2());
}
}
CellRangeAddress[] cellRangeAddresses = cellRangeAddressList.getCellRangeAddresses();
List<String> sqref = new ArrayList<>();
for (int i = 0; i < cellRangeAddresses.length; i++) {
CellRangeAddress cellRangeAddress = cellRangeAddresses[i];
sqref.add(cellRangeAddress.formatAsString());
}
newDataValidation.setSqref(sqref);
newDataValidation.setAllowBlank(true);
newDataValidation.setErrorStyle(STDataValidationErrorStyle.STOP);
return new XSSFDataValidation(dataValidationConstraint,cellRangeAddressList,newDataValidation);
}
}