datavalidation.go 6.2 KB

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