datavalidation.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package xlsx
  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. StyleStop
  31. StyleWarning
  32. StyleInformation
  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. // NewXlsxCellDataValidation return data validation struct
  55. func NewXlsxCellDataValidation(allowBlank, ShowInputMessage, showErrorMessage bool) *xlsxCellDataValidation {
  56. return &xlsxCellDataValidation{
  57. AllowBlank: convBoolToStr(allowBlank),
  58. ShowErrorMessage: convBoolToStr(showErrorMessage),
  59. ShowInputMessage: convBoolToStr(ShowInputMessage),
  60. }
  61. }
  62. // SetError set error notice
  63. func (dd *xlsxCellDataValidation) SetError(style DataValidationErrorStyle, title, msg *string) {
  64. dd.Error = msg
  65. dd.ErrorTitle = title
  66. strStyle := styleStop
  67. switch style {
  68. case StyleStop:
  69. strStyle = styleStop
  70. case StyleWarning:
  71. strStyle = styleWarning
  72. case StyleInformation:
  73. strStyle = styleInformation
  74. }
  75. dd.ErrorStyle = &strStyle
  76. }
  77. // SetInput set prompt notice
  78. func (dd *xlsxCellDataValidation) SetInput(title, msg *string) {
  79. dd.PromptTitle = title
  80. dd.Prompt = msg
  81. }
  82. // SetDropList data validation list
  83. func (dd *xlsxCellDataValidation) SetDropList(keys []string) error {
  84. formula := "\"" + strings.Join(keys, ",") + "\""
  85. if dataValidationFormulaStrLen < len(formula) {
  86. return fmt.Errorf(dataValidationFormulaStrLenErr)
  87. }
  88. dd.Formula1 = formula
  89. dd.Type = convDataValidationType(typeList)
  90. return nil
  91. }
  92. // SetDropList data validation range
  93. func (dd *xlsxCellDataValidation) SetRange(f1, f2 int, t DataValidationType, o DataValidationOperator) error {
  94. formula1 := fmt.Sprintf("%d", f1)
  95. formula2 := fmt.Sprintf("%d", f2)
  96. switch o {
  97. case DataValidationOperatorBetween:
  98. if f1 > f2 {
  99. tmp := formula1
  100. formula1 = formula2
  101. formula2 = tmp
  102. }
  103. case DataValidationOperatorNotBetween:
  104. if f1 > f2 {
  105. tmp := formula1
  106. formula1 = formula2
  107. formula2 = tmp
  108. }
  109. }
  110. dd.Formula1 = formula1
  111. dd.Formula2 = formula2
  112. dd.Type = convDataValidationType(t)
  113. dd.Operator = convDataValidationOperatior(o)
  114. return nil
  115. }
  116. // convBoolToStr convert boolean to string , false to 0, true to 1
  117. func convBoolToStr(bl bool) string {
  118. if bl {
  119. return "1"
  120. }
  121. return "0"
  122. }
  123. // convDataValidationType get excel data validation type
  124. func convDataValidationType(t DataValidationType) string {
  125. typeMap := map[DataValidationType]string{
  126. typeNone: "none",
  127. DataValidationTypeCustom: "custom",
  128. DataValidationTypeDate: "date",
  129. DataValidationTypeDecimal: "decimal",
  130. typeList: "list",
  131. DataValidationTypeTextLeng: "textLength",
  132. DataValidationTypeTime: "time",
  133. DataValidationTypeWhole: "whole",
  134. }
  135. return typeMap[t]
  136. }
  137. // convDataValidationOperatior get excel data validation operator
  138. func convDataValidationOperatior(o DataValidationOperator) string {
  139. typeMap := map[DataValidationOperator]string{
  140. DataValidationOperatorBetween: "between",
  141. DataValidationOperatorEqual: "equal",
  142. DataValidationOperatorGreaterThan: "greaterThan",
  143. DataValidationOperatorGreaterThanOrEqual: "greaterThanOrEqual",
  144. DataValidationOperatorLessThan: "lessThan",
  145. DataValidationOperatorLessThanOrEqual: "lessThanOrEqual",
  146. DataValidationOperatorNotBetween: "notBetween",
  147. DataValidationOperatorNotEqual: "notEqual",
  148. }
  149. return typeMap[o]
  150. }