added HSSFSheet.getDataValidations #11

Closed
wants to merge 1 commit into
from
@@ -18,9 +18,9 @@ Licensed to the Apache Software Foundation (ASF) under one or more
package org.apache.poi.hssf.record;
import org.apache.poi.hssf.record.common.UnicodeString;
-import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.ss.formula.Formula;
+import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.util.BitField;
@@ -196,8 +196,29 @@ public int getConditionOperator() {
}
// <-- end option flags
+ public String getPromptTitle() {
+ return resolveTitleString(_promptTitle);
+ }
+
+ public String getErrorTitle() {
+ return resolveTitleString(_errorTitle);
+ }
+
+ public String getPromptText() {
+ return resolveTitleString(_promptText);
+ }
+ public String getErrorText() {
+ return resolveTitleString(_errorText);
+ }
+ public Ptg[] getFormula1() {
+ return Formula.getTokens(_formula1);
+ }
+
+ public Ptg[] getFormula2() {
+ return Formula.getTokens(_formula2);
+ }
public CellRangeAddressList getCellRangeAddress() {
return this._regions;
@@ -284,7 +305,14 @@ private static UnicodeString resolveTitleText(String str) {
}
return new UnicodeString(str);
}
-
+
+ private static String resolveTitleString(UnicodeString us) {
+ if (us == null || us.equals(NULL_TEXT_STRING)) {
+ return null;
+ }
+ return us.getString();
+ }
+
private static UnicodeString readUnicodeString(RecordInputStream in) {
return new UnicodeString(in);
}
@@ -17,15 +17,20 @@ Licensed to the Apache Software Foundation (ASF) under one or more
package org.apache.poi.hssf.usermodel;
+import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.regex.Pattern;
import org.apache.poi.hssf.model.HSSFFormulaParser;
+import org.apache.poi.hssf.record.DVRecord;
+import org.apache.poi.ss.formula.FormulaRenderer;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
+import org.apache.poi.ss.formula.FormulaType;
import org.apache.poi.ss.formula.ptg.NumberPtg;
import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.formula.ptg.StringPtg;
-import org.apache.poi.ss.formula.FormulaType;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
/**
@@ -429,4 +434,78 @@ public void setValue2(double value2) {
HSSFWorkbook wb = sheet.getWorkbook();
return HSSFFormulaParser.parse(formula, wb, FormulaType.CELL, wb.getSheetIndex(sheet));
}
+
+ static DVConstraint createDVConstraint(DVRecord dvRecord, FormulaRenderingWorkbook book) {
+ switch (dvRecord.getDataType()) {
+ case ValidationType.ANY:
+ return new DVConstraint(ValidationType.ANY, dvRecord.getConditionOperator(), null, null, null, null, null);
+ case ValidationType.INTEGER:
+ case ValidationType.DECIMAL:
+ case ValidationType.DATE:
+ case ValidationType.TIME:
+ case ValidationType.TEXT_LENGTH:
+ FormulaValuePair pair1 = toFormulaString(dvRecord.getFormula1(), book);
+ FormulaValuePair pair2 = toFormulaString(dvRecord.getFormula2(), book);
+ return new DVConstraint(dvRecord.getDataType(), dvRecord.getConditionOperator(), pair1.formula(),
+ pair2.formula(), pair1.value(), pair2.value(), null);
+ case ValidationType.LIST:
+ if (dvRecord.getListExplicitFormula()) {
+ String values = toFormulaString(dvRecord.getFormula1(), book).string();
+ if (values.startsWith("\"")) {
+ values = values.substring(1);
+ }
+ if (values.endsWith("\"")) {
+ values = values.substring(0, values.length() - 1);
+ }
+ String[] explicitListValues = values.split(Pattern.quote("\0"));
+ return createExplicitListConstraint(explicitListValues);
+ } else {
+ String listFormula = toFormulaString(dvRecord.getFormula1(), book).string();
+ return createFormulaListConstraint(listFormula);
+ }
+ case ValidationType.FORMULA:
+ return createCustomFormulaConstraint(toFormulaString(dvRecord.getFormula1(), book).string());
+ default:
+ throw new UnsupportedOperationException(MessageFormat.format("validationType={0}", dvRecord.getDataType()));
+ }
+ }
+
+ private static class FormulaValuePair {
+ private String _formula;
+ private String _value;
+
+ public String formula() {
+ return _formula;
+ }
+
+ public Double value() {
+ if (_value == null) {
+ return null;
+ }
+ return new Double(_value);
+ }
+
+ public String string() {
+ if (_formula != null) {
+ return _formula;
+ }
+ if (_value != null) {
+ return _value;
+ }
+ return null;
+ }
+ }
+
+ private static FormulaValuePair toFormulaString(Ptg[] ptgs, FormulaRenderingWorkbook book) {
+ FormulaValuePair pair = new FormulaValuePair();
+ if (ptgs != null && ptgs.length > 0) {
+ String string = FormulaRenderer.toFormulaString(book, ptgs);
+ if (ptgs.length == 1 && ptgs[0].getClass() == NumberPtg.class) {
+ pair._value = string;
+ } else {
+ pair._formula = string;
+ }
+ }
+ return pair;
+ }
}
@@ -44,6 +44,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
import org.apache.poi.hssf.record.WindowTwoRecord;
import org.apache.poi.hssf.record.aggregates.DataValidityTable;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
+import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
import org.apache.poi.hssf.record.aggregates.WorksheetProtectionBlock;
import org.apache.poi.hssf.util.PaneInformation;
import org.apache.poi.ss.SpreadsheetVersion;
@@ -60,6 +61,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Row;
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.ss.util.SSCellRange;
import org.apache.poi.ss.util.SheetUtil;
@@ -394,6 +396,35 @@ public int getLastRowNum() {
return _lastrow;
}
+ public List<HSSFDataValidation> getDataValidations() {
+ DataValidityTable dvt = _sheet.getOrCreateDataValidityTable();
+ final List<HSSFDataValidation> hssfValidations = new ArrayList<HSSFDataValidation>();
+ RecordVisitor visitor = new RecordVisitor() {
+ private HSSFEvaluationWorkbook book = HSSFEvaluationWorkbook.create(getWorkbook());
+
+ @Override
+ public void visitRecord(Record r) {
+ if (!(r instanceof DVRecord)) {
+ return;
+ }
+ DVRecord dvRecord = (DVRecord) r;
+ CellRangeAddressList regions = dvRecord.getCellRangeAddress().copy();
+ DVConstraint constraint = DVConstraint.createDVConstraint(dvRecord, book);
+ HSSFDataValidation hssfDataValidation = new HSSFDataValidation(regions, constraint);
+ hssfDataValidation.setErrorStyle(dvRecord.getErrorStyle());
+ hssfDataValidation.setEmptyCellAllowed(dvRecord.getEmptyCellAllowed());
+ hssfDataValidation.setSuppressDropDownArrow(dvRecord.getSuppressDropdownArrow());
+ hssfDataValidation.createPromptBox(dvRecord.getPromptTitle(), dvRecord.getPromptText());
+ hssfDataValidation.setShowPromptBox(dvRecord.getShowPromptOnCellSelected());
+ hssfDataValidation.createErrorBox(dvRecord.getErrorTitle(), dvRecord.getErrorText());
+ hssfDataValidation.setShowErrorBox(dvRecord.getShowErrorOnInvalidValue());
+ hssfValidations.add(hssfDataValidation);
+ }
+ };
+ dvt.visitContainedRecords(visitor);
+ return hssfValidations;
+ }
+
/**
* Creates a data validation object
*
@@ -18,6 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
package org.apache.poi.ss.usermodel;
import java.util.Iterator;
+import java.util.List;
import org.apache.poi.hssf.util.PaneInformation;
import org.apache.poi.ss.util.CellRangeAddress;
@@ -921,6 +922,12 @@ Licensed to the Apache Software Foundation (ASF) under one or more
public DataValidationHelper getDataValidationHelper();
+ /**
+ * Returns the list of DataValidation in the sheet.
+ * @return list of DataValidation in the sheet
+ */
+ public List<? extends DataValidation> getDataValidations();
+
/**
* Creates a data validation object
* @param dataValidation The Data validation object settings
@@ -20,6 +20,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@@ -42,6 +43,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.SheetUtil;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
@@ -1339,6 +1341,11 @@ public DataValidationHelper getDataValidationHelper()
return _sh.getDataValidationHelper();
}
+ public List<XSSFDataValidation> getDataValidations()
+ {
+ return _sh.getDataValidations();
+ }
+
/**
* Creates a data validation object
* @param dataValidation The Data validation object settings
Oops, something went wrong.