datavalidation.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package excelize
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type DataValidationType int
  7. // Data validation types
  8. const (
  9. _DataValidationType = iota
  10. typeNone //inline use
  11. DataValidationTypeCustom
  12. DataValidationTypeDate
  13. DataValidationTypeDecimal
  14. typeList //inline use
  15. DataValidationTypeTextLeng
  16. DataValidationTypeTime
  17. // DataValidationTypeWhole Integer
  18. DataValidationTypeWhole
  19. )
  20. const (
  21. // dataValidationFormulaStrLen 255 characters+ 2 quotes
  22. dataValidationFormulaStrLen = 257
  23. // dataValidationFormulaStrLenErr
  24. dataValidationFormulaStrLenErr = "data validation must be 0-255 characters"
  25. )
  26. type DataValidationErrorStyle int
  27. // Data validation error styles
  28. const (
  29. _ DataValidationErrorStyle = iota
  30. DataValidationErrorStyleStop
  31. DataValidationErrorStyleWarning
  32. DataValidationErrorStyleInformation
  33. )
  34. // Data validation error styles
  35. const (
  36. styleStop = "stop"
  37. styleWarning = "warning"
  38. styleInformation = "information"
  39. )
  40. // DataValidationOperator operator enum
  41. type DataValidationOperator int
  42. // Data validation operators
  43. const (
  44. _DataValidationOperator = iota
  45. DataValidationOperatorBetween
  46. DataValidationOperatorEqual
  47. DataValidationOperatorGreaterThan
  48. DataValidationOperatorGreaterThanOrEqual
  49. DataValidationOperatorLessThan
  50. DataValidationOperatorLessThanOrEqual
  51. DataValidationOperatorNotBetween
  52. DataValidationOperatorNotEqual
  53. )
  54. // NewDataValidation return data validation struct
  55. func NewDataValidation(allowBlank bool) *DataValidation {
  56. return &DataValidation{
  57. AllowBlank: convBoolToStr(allowBlank),
  58. ShowErrorMessage: convBoolToStr(false),
  59. ShowInputMessage: convBoolToStr(false),
  60. }
  61. }
  62. // SetError set error notice
  63. func (dd *DataValidation) SetError(style DataValidationErrorStyle, title, msg string) {
  64. dd.Error = &msg
  65. dd.ErrorTitle = &title
  66. strStyle := styleStop
  67. switch style {
  68. case DataValidationErrorStyleStop:
  69. strStyle = styleStop
  70. case DataValidationErrorStyleWarning:
  71. strStyle = styleWarning
  72. case DataValidationErrorStyleInformation:
  73. strStyle = styleInformation
  74. }
  75. dd.ShowErrorMessage = convBoolToStr(true)
  76. dd.ErrorStyle = &strStyle
  77. }
  78. // SetInput set prompt notice
  79. func (dd *DataValidation) SetInput(title, msg string) {
  80. dd.ShowInputMessage = convBoolToStr(true)
  81. dd.PromptTitle = &title
  82. dd.Prompt = &msg
  83. }
  84. // SetDropList data validation list
  85. func (dd *DataValidation) SetDropList(keys []string) error {
  86. dd.Formula1 = "\"" + strings.Join(keys, ",") + "\""
  87. dd.Type = convDataValidationType(typeList)
  88. return nil
  89. }
  90. // SetDropList data validation range
  91. func (dd *DataValidation) SetRange(f1, f2 int, t DataValidationType, o DataValidationOperator) error {
  92. formula1 := fmt.Sprintf("%d", f1)
  93. formula2 := fmt.Sprintf("%d", f2)
  94. if dataValidationFormulaStrLen < len(dd.Formula1) || dataValidationFormulaStrLen < len(dd.Formula2) {
  95. return fmt.Errorf(dataValidationFormulaStrLenErr)
  96. }
  97. /*switch o {
  98. case DataValidationOperatorBetween:
  99. if f1 > f2 {
  100. tmp := formula1
  101. formula1 = formula2
  102. formula2 = tmp
  103. }
  104. case DataValidationOperatorNotBetween:
  105. if f1 > f2 {
  106. tmp := formula1
  107. formula1 = formula2
  108. formula2 = tmp
  109. }
  110. }*/
  111. dd.Formula1 = formula1
  112. dd.Formula2 = formula2
  113. dd.Type = convDataValidationType(t)
  114. dd.Operator = convDataValidationOperatior(o)
  115. return nil
  116. }
  117. // SetDropList data validation range
  118. func (dd *DataValidation) SetSqref(sqref string) {
  119. if dd.Sqref == "" {
  120. dd.Sqref = sqref
  121. } else {
  122. dd.Sqref = fmt.Sprintf("%s %s", dd.Sqref, sqref)
  123. }
  124. }
  125. // convBoolToStr convert boolean to string , false to 0, true to 1
  126. func convBoolToStr(bl bool) string {
  127. if bl {
  128. return "1"
  129. }
  130. return "0"
  131. }
  132. // convDataValidationType get excel data validation type
  133. func convDataValidationType(t DataValidationType) string {
  134. typeMap := map[DataValidationType]string{
  135. typeNone: "none",
  136. DataValidationTypeCustom: "custom",
  137. DataValidationTypeDate: "date",
  138. DataValidationTypeDecimal: "decimal",
  139. typeList: "list",
  140. DataValidationTypeTextLeng: "textLength",
  141. DataValidationTypeTime: "time",
  142. DataValidationTypeWhole: "whole",
  143. }
  144. return typeMap[t]
  145. }
  146. // convDataValidationOperatior get excel data validation operator
  147. func convDataValidationOperatior(o DataValidationOperator) string {
  148. typeMap := map[DataValidationOperator]string{
  149. DataValidationOperatorBetween: "between",
  150. DataValidationOperatorEqual: "equal",
  151. DataValidationOperatorGreaterThan: "greaterThan",
  152. DataValidationOperatorGreaterThanOrEqual: "greaterThanOrEqual",
  153. DataValidationOperatorLessThan: "lessThan",
  154. DataValidationOperatorLessThanOrEqual: "lessThanOrEqual",
  155. DataValidationOperatorNotBetween: "notBetween",
  156. DataValidationOperatorNotEqual: "notEqual",
  157. }
  158. return typeMap[o]
  159. }
  160. func (f *File) AddDataValidation(sheet string, dv *DataValidation) {
  161. xlsx := f.workSheetReader(sheet)
  162. if nil == xlsx.DataValidations {
  163. xlsx.DataValidations = new(xlsxDataValidations)
  164. }
  165. xlsx.DataValidations.DataValidation = append(xlsx.DataValidations.DataValidation, dv)
  166. xlsx.DataValidations.Count = len(xlsx.DataValidations.DataValidation)
  167. }