datavalidation.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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: allowBlank,
  58. ShowErrorMessage: showErrorMessage,
  59. ShowInputMessage: 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. // convDataValidationType get excel data validation type
  117. func convDataValidationType(t DataValidationType) string {
  118. typeMap := map[DataValidationType]string{
  119. typeNone: "none",
  120. DataValidationTypeCustom: "custom",
  121. DataValidationTypeDate: "date",
  122. DataValidationTypeDecimal: "decimal",
  123. typeList: "list",
  124. DataValidationTypeTextLeng: "textLength",
  125. DataValidationTypeTime: "time",
  126. DataValidationTypeWhole: "whole",
  127. }
  128. return typeMap[t]
  129. }
  130. // convDataValidationOperatior get excel data validation operator
  131. func convDataValidationOperatior(o DataValidationOperator) string {
  132. typeMap := map[DataValidationOperator]string{
  133. DataValidationOperatorBetween: "between",
  134. DataValidationOperatorEqual: "equal",
  135. DataValidationOperatorGreaterThan: "greaterThan",
  136. DataValidationOperatorGreaterThanOrEqual: "greaterThanOrEqual",
  137. DataValidationOperatorLessThan: "lessThan",
  138. DataValidationOperatorLessThanOrEqual: "lessThanOrEqual",
  139. DataValidationOperatorNotBetween: "notBetween",
  140. DataValidationOperatorNotEqual: "notEqual",
  141. }
  142. return typeMap[o]
  143. }