|
|
@@ -0,0 +1,196 @@
|
|
|
+package excelize
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+type DataValidationType int
|
|
|
+
|
|
|
+// Data validation types
|
|
|
+const (
|
|
|
+ _DataValidationType = iota
|
|
|
+ typeNone //inline use
|
|
|
+ DataValidationTypeCustom
|
|
|
+ DataValidationTypeDate
|
|
|
+ DataValidationTypeDecimal
|
|
|
+ typeList //inline use
|
|
|
+ DataValidationTypeTextLeng
|
|
|
+ DataValidationTypeTime
|
|
|
+ // DataValidationTypeWhole Integer
|
|
|
+ DataValidationTypeWhole
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ // dataValidationFormulaStrLen 255 characters+ 2 quotes
|
|
|
+ dataValidationFormulaStrLen = 257
|
|
|
+ // dataValidationFormulaStrLenErr
|
|
|
+ dataValidationFormulaStrLenErr = "data validation must be 0-255 characters"
|
|
|
+)
|
|
|
+
|
|
|
+type DataValidationErrorStyle int
|
|
|
+
|
|
|
+// Data validation error styles
|
|
|
+const (
|
|
|
+ _ DataValidationErrorStyle = iota
|
|
|
+ DataValidationStyleStop
|
|
|
+ DataValidationStyleWarning
|
|
|
+ DataValidationStyleInformation
|
|
|
+)
|
|
|
+
|
|
|
+// Data validation error styles
|
|
|
+const (
|
|
|
+ styleStop = "stop"
|
|
|
+ styleWarning = "warning"
|
|
|
+ styleInformation = "information"
|
|
|
+)
|
|
|
+
|
|
|
+// DataValidationOperator operator enum
|
|
|
+type DataValidationOperator int
|
|
|
+
|
|
|
+// Data validation operators
|
|
|
+const (
|
|
|
+ _DataValidationOperator = iota
|
|
|
+ DataValidationOperatorBetween
|
|
|
+ DataValidationOperatorEqual
|
|
|
+ DataValidationOperatorGreaterThan
|
|
|
+ DataValidationOperatorGreaterThanOrEqual
|
|
|
+ DataValidationOperatorLessThan
|
|
|
+ DataValidationOperatorLessThanOrEqual
|
|
|
+ DataValidationOperatorNotBetween
|
|
|
+ DataValidationOperatorNotEqual
|
|
|
+)
|
|
|
+
|
|
|
+// NewDataValidation return data validation struct
|
|
|
+func NewDataValidation(allowBlank bool) *DataValidation {
|
|
|
+ return &DataValidation{
|
|
|
+ AllowBlank: convBoolToStr(allowBlank),
|
|
|
+ ShowErrorMessage: convBoolToStr(false),
|
|
|
+ ShowInputMessage: convBoolToStr(false),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// SetError set error notice
|
|
|
+func (dd *DataValidation) SetError(style DataValidationErrorStyle, title, msg *string) {
|
|
|
+ dd.Error = msg
|
|
|
+ dd.ErrorTitle = title
|
|
|
+ strStyle := styleStop
|
|
|
+ switch style {
|
|
|
+ case DataValidationStyleStop:
|
|
|
+ strStyle = styleStop
|
|
|
+ case DataValidationStyleWarning:
|
|
|
+ strStyle = styleWarning
|
|
|
+ case DataValidationStyleInformation:
|
|
|
+ strStyle = styleInformation
|
|
|
+
|
|
|
+ }
|
|
|
+ dd.ShowErrorMessage = convBoolToStr(true)
|
|
|
+ dd.ErrorStyle = &strStyle
|
|
|
+}
|
|
|
+
|
|
|
+// SetInput set prompt notice
|
|
|
+func (dd *DataValidation) SetInput(title, msg *string) {
|
|
|
+ dd.ShowInputMessage = convBoolToStr(true)
|
|
|
+ dd.PromptTitle = title
|
|
|
+ dd.Prompt = msg
|
|
|
+}
|
|
|
+
|
|
|
+// SetDropList data validation list
|
|
|
+func (dd *DataValidation) SetDropList(keys []string) error {
|
|
|
+ dd.Formula1 = "\"" + strings.Join(keys, ",") + "\""
|
|
|
+ dd.Type = convDataValidationType(typeList)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// SetDropList data validation range
|
|
|
+func (dd *DataValidation) SetRange(f1, f2 int, t DataValidationType, o DataValidationOperator) error {
|
|
|
+ formula1 := fmt.Sprintf("%d", f1)
|
|
|
+ formula2 := fmt.Sprintf("%d", f2)
|
|
|
+ if dataValidationFormulaStrLen < len(dd.Formula1) || dataValidationFormulaStrLen < len(dd.Formula2) {
|
|
|
+ return fmt.Errorf(dataValidationFormulaStrLenErr)
|
|
|
+ }
|
|
|
+ switch o {
|
|
|
+ case DataValidationOperatorBetween:
|
|
|
+ if f1 > f2 {
|
|
|
+ tmp := formula1
|
|
|
+ formula1 = formula2
|
|
|
+ formula2 = tmp
|
|
|
+ }
|
|
|
+ case DataValidationOperatorNotBetween:
|
|
|
+ if f1 > f2 {
|
|
|
+ tmp := formula1
|
|
|
+ formula1 = formula2
|
|
|
+ formula2 = tmp
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dd.Formula1 = formula1
|
|
|
+ dd.Formula2 = formula2
|
|
|
+ dd.Type = convDataValidationType(t)
|
|
|
+ dd.Operator = convDataValidationOperatior(o)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// SetDropList data validation range
|
|
|
+func (dd *DataValidation) SetSqref(sqref string) {
|
|
|
+ if dd.Sqref == "" {
|
|
|
+ dd.Sqref = sqref
|
|
|
+ } else {
|
|
|
+ dd.Sqref = fmt.Sprintf("%s %s", dd.Sqref, sqref)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// convBoolToStr convert boolean to string , false to 0, true to 1
|
|
|
+func convBoolToStr(bl bool) string {
|
|
|
+ if bl {
|
|
|
+ return "1"
|
|
|
+ }
|
|
|
+ return "0"
|
|
|
+}
|
|
|
+
|
|
|
+// convDataValidationType get excel data validation type
|
|
|
+func convDataValidationType(t DataValidationType) string {
|
|
|
+ typeMap := map[DataValidationType]string{
|
|
|
+ typeNone: "none",
|
|
|
+ DataValidationTypeCustom: "custom",
|
|
|
+ DataValidationTypeDate: "date",
|
|
|
+ DataValidationTypeDecimal: "decimal",
|
|
|
+ typeList: "list",
|
|
|
+ DataValidationTypeTextLeng: "textLength",
|
|
|
+ DataValidationTypeTime: "time",
|
|
|
+ DataValidationTypeWhole: "whole",
|
|
|
+ }
|
|
|
+
|
|
|
+ return typeMap[t]
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// convDataValidationOperatior get excel data validation operator
|
|
|
+func convDataValidationOperatior(o DataValidationOperator) string {
|
|
|
+ typeMap := map[DataValidationOperator]string{
|
|
|
+ DataValidationOperatorBetween: "between",
|
|
|
+ DataValidationOperatorEqual: "equal",
|
|
|
+ DataValidationOperatorGreaterThan: "greaterThan",
|
|
|
+ DataValidationOperatorGreaterThanOrEqual: "greaterThanOrEqual",
|
|
|
+ DataValidationOperatorLessThan: "lessThan",
|
|
|
+ DataValidationOperatorLessThanOrEqual: "lessThanOrEqual",
|
|
|
+ DataValidationOperatorNotBetween: "notBetween",
|
|
|
+ DataValidationOperatorNotEqual: "notEqual",
|
|
|
+ }
|
|
|
+
|
|
|
+ return typeMap[o]
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func (f *File) AddDataValidation(sheet string, dv *DataValidation) {
|
|
|
+ xlsx := f.workSheetReader(sheet)
|
|
|
+ if nil == xlsx.DataValidations {
|
|
|
+ xlsx.DataValidations = new(xlsxDataValidations)
|
|
|
+ }
|
|
|
+ xlsx.DataValidations.DataValidation = append(xlsx.DataValidations.DataValidation, dv)
|
|
|
+ xlsx.DataValidations.Count = len(xlsx.DataValidations.DataValidation)
|
|
|
+}
|
|
|
+
|
|
|
+func (f *File) GetDataValidation(sheet, sqref string) {
|
|
|
+
|
|
|
+}
|