package org.apache.poi.xssf.usermodel;
import java.util.Arrays;
+import java.util.regex.Pattern;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationType;
*
*/
public class XSSFDataValidationConstraint implements DataValidationConstraint {
+ /**
+ * Excel validation constraints with static lists are delimited with optional whitespace and the Windows List Separator,
+ * which is typically comma, but can be changed by users. POI will just assume comma.
+ */
+ private static final String LIST_SEPARATOR = ",";
+ private static final Pattern LIST_SPLIT_REGEX = Pattern.compile("\\s*" + LIST_SEPARATOR + "\\s*");
+ private static final String QUOTE = "\"";
+
private String formula1;
private String formula2;
private int validationType = -1;
validate();
//FIXME: Need to confirm if this is not a formula.
- if( ValidationType.LIST==validationType) {
- explicitListOfValues = formula1.split(",");
+ // empirical testing shows Excel saves explicit lists surrounded by double quotes,
+ // range formula expressions can't start with quotes (I think - anyone have a creative counter example?)
+ if( ValidationType.LIST==validationType
+ && formula1 != null
+ && formula1.startsWith(QUOTE)
+ && formula1.endsWith(QUOTE) ) {
+ final String formulaWithoutQuotes = formula1.substring(1, formula1.length()-1);
+ explicitListOfValues = LIST_SPLIT_REGEX.split(formulaWithoutQuotes);
}
}
for (int i = 0; i < explicitListValues.length; i++) {
String string = explicitListValues[i];
if( builder.length() > 1) {
- builder.append(",");
+ builder.append(LIST_SEPARATOR);
}
builder.append(string);
}
this.formula1 = removeLeadingEquals(formula1);
}
- protected String removeLeadingEquals(String formula1) {
+ protected static String removeLeadingEquals(String formula1) {
return isFormulaEmpty(formula1) ? formula1 : formula1.charAt(0)=='=' ? formula1.substring(1) : formula1;
}
}
}
- protected boolean isFormulaEmpty(String formula1) {
+ protected static boolean isFormulaEmpty(String formula1) {
return formula1 == null || formula1.trim().length()==0;
}
builder.append(vt);
builder.append(' ');
if (validationType!=ValidationType.ANY) {
- if (validationType != ValidationType.LIST && validationType != ValidationType.ANY && validationType != ValidationType.FORMULA) {
- builder.append(",").append(ot).append(", ");
+ if (validationType != ValidationType.LIST
+ && validationType != ValidationType.ANY
+ && validationType != ValidationType.FORMULA) {
+ builder.append(LIST_SEPARATOR).append(ot).append(", ");
}
- final String QUOTE = "";
+
if (validationType == ValidationType.LIST && explicitListOfValues != null) {
builder.append(QUOTE).append(Arrays.asList(explicitListOfValues)).append(QUOTE).append(' ');
} else {