197 lines
5.0 KiB
Go
197 lines
5.0 KiB
Go
|
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) {
|
||
|
|
||
|
}
|