datavalidation.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. dd.Formula1 = "\"" + strings.Join(keys, ",") + "\""
  85. /*if dataValidationFormulaStrLen < len(dd.Formula1) {
  86. return fmt.Errorf(dataValidationFormulaStrLenErr)
  87. }*/
  88. dd.Type = convDataValidationType(typeList)
  89. return nil
  90. }
  91. // SetDropList data validation range
  92. func (dd *xlsxCellDataValidation) SetRange(f1, f2 int, t DataValidationType, o DataValidationOperator) error {
  93. formula1 := fmt.Sprintf("%d", f1)
  94. formula2 := fmt.Sprintf("%d", f2)
  95. if dataValidationFormulaStrLen < len(dd.Formula1) || dataValidationFormulaStrLen < len(dd.Formula2) {
  96. return fmt.Errorf(dataValidationFormulaStrLenErr)
  97. }
  98. switch o {
  99. case DataValidationOperatorBetween:
  100. if f1 > f2 {
  101. tmp := formula1
  102. formula1 = formula2
  103. formula2 = tmp
  104. }
  105. case DataValidationOperatorNotBetween:
  106. if f1 > f2 {
  107. tmp := formula1
  108. formula1 = formula2
  109. formula2 = tmp
  110. }
  111. }
  112. dd.Formula1 = formula1
  113. dd.Formula2 = formula2
  114. dd.Type = convDataValidationType(t)
  115. dd.Operator = convDataValidationOperatior(o)
  116. return nil
  117. }
  118. // convBoolToStr convert boolean to string , false to 0, true to 1
  119. func convBoolToStr(bl bool) string {
  120. if bl {
  121. return "1"
  122. }
  123. return "0"
  124. }
  125. // convDataValidationType get excel data validation type
  126. func convDataValidationType(t DataValidationType) string {
  127. typeMap := map[DataValidationType]string{
  128. typeNone: "none",
  129. DataValidationTypeCustom: "custom",
  130. DataValidationTypeDate: "date",
  131. DataValidationTypeDecimal: "decimal",
  132. typeList: "list",
  133. DataValidationTypeTextLeng: "textLength",
  134. DataValidationTypeTime: "time",
  135. DataValidationTypeWhole: "whole",
  136. }
  137. return typeMap[t]
  138. }
  139. // convDataValidationOperatior get excel data validation operator
  140. func convDataValidationOperatior(o DataValidationOperator) string {
  141. typeMap := map[DataValidationOperator]string{
  142. DataValidationOperatorBetween: "between",
  143. DataValidationOperatorEqual: "equal",
  144. DataValidationOperatorGreaterThan: "greaterThan",
  145. DataValidationOperatorGreaterThanOrEqual: "greaterThanOrEqual",
  146. DataValidationOperatorLessThan: "lessThan",
  147. DataValidationOperatorLessThanOrEqual: "lessThanOrEqual",
  148. DataValidationOperatorNotBetween: "notBetween",
  149. DataValidationOperatorNotEqual: "notEqual",
  150. }
  151. return typeMap[o]
  152. }