You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

XSSFDataValidationConstraint.java 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. *
  3. */
  4. package org.apache.poi.xssf.usermodel;
  5. import java.util.Arrays;
  6. import org.apache.poi.ss.usermodel.DataValidationConstraint;
  7. import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationType;
  8. import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationOperator.Enum;
  9. /**
  10. * @author <a href="rjankiraman@emptoris.com">Radhakrishnan J</a>
  11. *
  12. */
  13. public class XSSFDataValidationConstraint implements DataValidationConstraint {
  14. private String formula1;
  15. private String formula2;
  16. private int validationType = -1;
  17. private int operator = -1;
  18. private String[] explicitListOfValues;
  19. public XSSFDataValidationConstraint(String[] explicitListOfValues) {
  20. if( explicitListOfValues==null || explicitListOfValues.length==0) {
  21. throw new IllegalArgumentException("List validation with explicit values must specify at least one value");
  22. }
  23. this.validationType = ValidationType.LIST;
  24. setExplicitListValues(explicitListOfValues);
  25. validate();
  26. }
  27. public XSSFDataValidationConstraint(int validationType,String formula1) {
  28. super();
  29. setFormula1(formula1);
  30. this.validationType = validationType;
  31. validate();
  32. }
  33. public XSSFDataValidationConstraint(int validationType, int operator,String formula1) {
  34. super();
  35. setFormula1(formula1);
  36. this.validationType = validationType;
  37. this.operator = operator;
  38. validate();
  39. }
  40. public XSSFDataValidationConstraint(int validationType, int operator,String formula1, String formula2) {
  41. super();
  42. setFormula1(formula1);
  43. setFormula2(formula2);
  44. this.validationType = validationType;
  45. this.operator = operator;
  46. validate();
  47. //FIXME: Need to confirm if this is not a formula.
  48. if( ValidationType.LIST==validationType) {
  49. explicitListOfValues = formula1.split(",");
  50. }
  51. }
  52. /* (non-Javadoc)
  53. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#getExplicitListValues()
  54. */
  55. public String[] getExplicitListValues() {
  56. return explicitListOfValues;
  57. }
  58. /* (non-Javadoc)
  59. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#getFormula1()
  60. */
  61. public String getFormula1() {
  62. return formula1;
  63. }
  64. /* (non-Javadoc)
  65. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#getFormula2()
  66. */
  67. public String getFormula2() {
  68. return formula2;
  69. }
  70. /* (non-Javadoc)
  71. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#getOperator()
  72. */
  73. public int getOperator() {
  74. return operator;
  75. }
  76. /* (non-Javadoc)
  77. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#getValidationType()
  78. */
  79. public int getValidationType() {
  80. return validationType;
  81. }
  82. /* (non-Javadoc)
  83. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#setExplicitListValues(java.lang.String[])
  84. */
  85. public void setExplicitListValues(String[] explicitListValues) {
  86. this.explicitListOfValues = explicitListValues;
  87. if( explicitListOfValues!=null && explicitListOfValues.length > 0 ) {
  88. StringBuilder builder = new StringBuilder("\"");
  89. for (int i = 0; i < explicitListValues.length; i++) {
  90. String string = explicitListValues[i];
  91. if( builder.length() > 1) {
  92. builder.append(",");
  93. }
  94. builder.append(string);
  95. }
  96. builder.append("\"");
  97. setFormula1(builder.toString());
  98. }
  99. }
  100. /* (non-Javadoc)
  101. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#setFormula1(java.lang.String)
  102. */
  103. public void setFormula1(String formula1) {
  104. this.formula1 = removeLeadingEquals(formula1);
  105. }
  106. protected String removeLeadingEquals(String formula1) {
  107. return isFormulaEmpty(formula1) ? formula1 : formula1.charAt(0)=='=' ? formula1.substring(1) : formula1;
  108. }
  109. /* (non-Javadoc)
  110. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#setFormula2(java.lang.String)
  111. */
  112. public void setFormula2(String formula2) {
  113. this.formula2 = removeLeadingEquals(formula2);
  114. }
  115. /* (non-Javadoc)
  116. * @see org.apache.poi.ss.usermodel.DataValidationConstraint#setOperator(int)
  117. */
  118. public void setOperator(int operator) {
  119. this.operator = operator;
  120. }
  121. public void validate() {
  122. if (validationType==ValidationType.ANY) {
  123. return;
  124. }
  125. if (validationType==ValidationType.LIST ) {
  126. if (isFormulaEmpty(formula1)) {
  127. throw new IllegalArgumentException("A valid formula or a list of values must be specified for list validation.");
  128. }
  129. } else {
  130. if( isFormulaEmpty(formula1) ) {
  131. throw new IllegalArgumentException("Formula is not specified. Formula is required for all validation types except explicit list validation.");
  132. }
  133. if( validationType!= ValidationType.FORMULA ) {
  134. if (operator==-1) {
  135. throw new IllegalArgumentException("This validation type requires an operator to be specified.");
  136. } else if (( operator==OperatorType.BETWEEN || operator==OperatorType.NOT_BETWEEN) && isFormulaEmpty(formula2)) {
  137. throw new IllegalArgumentException("Between and not between comparisons require two formulae to be specified.");
  138. }
  139. }
  140. }
  141. }
  142. protected boolean isFormulaEmpty(String formula1) {
  143. return formula1 == null || formula1.trim().length()==0;
  144. }
  145. public String prettyPrint() {
  146. StringBuilder builder = new StringBuilder();
  147. STDataValidationType.Enum vt = XSSFDataValidation.validationTypeMappings.get(validationType);
  148. Enum ot = XSSFDataValidation.operatorTypeMappings.get(operator);
  149. builder.append(vt);
  150. builder.append(' ');
  151. if (validationType!=ValidationType.ANY) {
  152. if (validationType != ValidationType.LIST && validationType != ValidationType.ANY && validationType != ValidationType.FORMULA) {
  153. builder.append(",").append(ot).append(", ");
  154. }
  155. final String QUOTE = "";
  156. if (validationType == ValidationType.LIST && explicitListOfValues != null) {
  157. builder.append(QUOTE).append(Arrays.asList(explicitListOfValues)).append(QUOTE).append(' ');
  158. } else {
  159. builder.append(QUOTE).append(formula1).append(QUOTE).append(' ');
  160. }
  161. if (formula2 != null) {
  162. builder.append(QUOTE).append(formula2).append(QUOTE).append(' ');
  163. }
  164. }
  165. return builder.toString();
  166. }
  167. }