Переглянути джерело

excel data validation range issue #380

rentiansheng 7 роки тому
батько
коміт
e31f381011
4 змінених файлів з 174 додано та 51 видалено
  1. 1 0
      cell.go
  2. 83 46
      datavalidation.go
  3. 85 0
      datavalidation_test.go
  4. 5 5
      xmlWorksheet.go

+ 1 - 0
cell.go

@@ -378,6 +378,7 @@ func (c *Cell) FormattedValue() (string, error) {
 	return returnVal, err
 }
 
+// SetDataValidation set data validation
 func (c *Cell) SetDataValidation(dd *xlsxCellDataValidation) {
 	c.DataValidation = dd
 }

+ 83 - 46
datavalidation.go

@@ -1,34 +1,24 @@
 package xlsx
 
 import (
+	"fmt"
 	"strings"
 )
 
 type DataValidationType int
 
-// Data validation types
-/*const (
-	_ DataValidationType = iota
-	TypeNone
-	TypeCustom
-	TypeDate
-	TypeDecimal
-	TypeList
-	TypeTextLeng
-	TypeTime
-	TypeWhole
-)*/
-
 // Data validation types
 const (
-	typeNone     = "none"
-	typeCustom   = "custom"
-	typeDate     = "date"
-	typeDecimal  = "decimal"
-	typeList     = "list"
-	typeTextLeng = "textLength"
-	typeTime     = "time"
-	typeWhole    = "whole"
+	_DataValidationType = iota
+	typeNone            //inline use
+	DataValidationTypeCustom
+	DataValidationTypeDate
+	DataValidationTypeDecimal
+	typeList //inline use
+	DataValidationTypeTextLeng
+	DataValidationTypeTime
+	// DataValidationTypeWhole Integer
+	DataValidationTypeWhole
 )
 
 type DataValidationErrorStyle int
@@ -48,36 +38,23 @@ const (
 	styleInformation = "information"
 )
 
-/*
+// DataValidationOperator operator enum
 type DataValidationOperator int
 
 // Data validation operators
 const (
-	_DataValidationOperator     = iota
-	OperatorBetween             = "between"
-	OperatorEqual               = "equal"
-	OperatorGreaterThan         = "greaterThan"
-	OperatorGgreaterThanOrEqual = "greaterThanOrEqual"
-	OperatorLessThan            = "lessThan"
-	OperatorLessThanOrEqual     = "lessThanOrEqual"
-	OperatorNotBetween          = "notBetween"
-	OperatorNotEqual            = "notEqual"
-)
-
-// Data validation operators
-const (
-	operatorBetween            = "between"
-	operatorEQUAL              = "equal"
-	operatorGREATERTHAN        = "greaterThan"
-	operatorGREATERTHANOREQUAL = "greaterThanOrEqual"
-	operatorLESSTHAN           = "lessThan"
-	operatorLESSTHANOREQUAL    = "lessThanOrEqual"
-	operatorNOTBETWEEN         = "notBetween"
-	operatorNOTEQUAL           = "notEqual"
+	_DataValidationOperator = iota
+	DataValidationOperatorBetween
+	DataValidationOperatorEqual
+	DataValidationOperatorGreaterThan
+	DataValidationOperatorGreaterThanOrEqual
+	DataValidationOperatorLessThan
+	DataValidationOperatorLessThanOrEqual
+	DataValidationOperatorNotBetween
+	DataValidationOperatorNotEqual
 )
-*/
 
-// NewDataValidation return data validation struct
+// NewXlsxCellDataValidation return data validation struct
 func NewXlsxCellDataValidation(allowBlank, ShowInputMessage, showErrorMessage bool) *xlsxCellDataValidation {
 	return &xlsxCellDataValidation{
 		AllowBlank:       convBoolToStr(allowBlank),
@@ -109,9 +86,35 @@ func (dd *xlsxCellDataValidation) SetInput(title, msg *string) {
 	dd.Prompt = msg
 }
 
+// SetDropList data validation list
 func (dd *xlsxCellDataValidation) SetDropList(keys []string) {
 	dd.Formula1 = "\"" + strings.Join(keys, ",") + "\""
-	dd.Type = typeList
+	dd.Type = convDataValidationType(typeList)
+}
+
+// SetDropList data validation range
+func (dd *xlsxCellDataValidation) SetRange(f1, f2 int, t DataValidationType, o DataValidationOperator) {
+	formula1 := fmt.Sprintf("%d", f1)
+	formula2 := fmt.Sprintf("%d", f2)
+	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)
 }
 
 // convBoolToStr  convert boolean to string , false to 0, true to 1
@@ -121,3 +124,37 @@ func convBoolToStr(bl bool) string {
 	}
 	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]
+
+}

+ 85 - 0
datavalidation_test.go

@@ -47,6 +47,91 @@ func TestDataValidation(t *testing.T) {
 	dd.SetInput(&title, &msg)
 	sheet.Col(4).SetDataValidationWithStart(dd, 1)
 
+	index := 5
+	rowIndex := 1
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(15, 4, DataValidationTypeTextLeng, DataValidationOperatorBetween)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorGreaterThanOrEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorGreaterThan)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorLessThan)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorLessThanOrEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorNotEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeTextLeng, DataValidationOperatorNotBetween)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	rowIndex++
+	index = 5
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(4, 15, DataValidationTypeWhole, DataValidationOperatorBetween)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeWhole, DataValidationOperatorEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeWhole, DataValidationOperatorGreaterThanOrEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeWhole, DataValidationOperatorGreaterThan)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeWhole, DataValidationOperatorLessThan)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeWhole, DataValidationOperatorLessThanOrEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 1, DataValidationTypeWhole, DataValidationOperatorNotEqual)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
+	dd = NewXlsxCellDataValidation(true, true, true)
+	dd.SetRange(10, 50, DataValidationTypeWhole, DataValidationOperatorNotBetween)
+	sheet.Cell(rowIndex, index).SetDataValidation(dd)
+	index++
+
 	if err != nil {
 		fmt.Printf(err.Error())
 	}

+ 5 - 5
xmlWorksheet.go

@@ -235,12 +235,12 @@ type xlsxCellDataValidation struct {
 	AllowBlank       string  `xml:"allowBlank,attr"`       // allow empty
 	ShowInputMessage string  `xml:"showInputMessage,attr"` // 1, true,0,false,  select cell,  Whether the input message is displayed
 	ShowErrorMessage string  `xml:"showErrorMessage,attr"` // 1, true,0,false,  input error value, Whether the error message is displayed
-	ErrorStyle       *string `xml:"errorStyle"`            //error icon style, warning, infomation,stop
-	ErrorTitle       *string `xml:"errorTitle"`            // error title
-	Operator         *string `xml:"operator"`              //
-	Error            *string `xml:"error"`                 // input error value,  notice message
+	ErrorStyle       *string `xml:"errorStyle,attr"`       //error icon style, warning, infomation,stop
+	ErrorTitle       *string `xml:"errorTitle,attr"`       // error title
+	Operator         string  `xml:"operator,attr"`         //
+	Error            *string `xml:"error,attr"`            // input error value,  notice message
 	PromptTitle      *string `xml:"promptTitle"`
-	Prompt           *string `xml:"prompt"`
+	Prompt           *string `xml:"prompt,attr"`
 	Type             string  `xml:"type,attr"`  //data type, none,custom,date,decimal,list, textLength,time,whole
 	Sqref            string  `xml:"sqref,attr"` //Validity of data validation rules, cell and range, eg: A1 OR A1:A20
 	Formula1         string  `xml:"formula1"`   // data validation role