writer.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package excelutil
  2. import (
  3. "context"
  4. "os"
  5. "path/filepath"
  6. "time"
  7. "gogs.baozhida.cn/Cold_Logistic_libs/pkg/contrib/errors"
  8. )
  9. type DynamicWriteSheet struct {
  10. File *excelize.File
  11. StreamWriter *excelize.StreamWriter
  12. Style *style
  13. DefaultTitleStyleId int
  14. DefaultValueStyleId int
  15. DefaultTimeStyleId int
  16. SaveFilePath string
  17. SheetName string
  18. }
  19. type (
  20. DynamicWriteSheetFun func(*DynamicWriteSheet) error
  21. DynamicPreWriteSheetFun func(*DynamicWriteSheet) error
  22. )
  23. func WithDynamicWriteSheetSaveFilePath(saveFilePath string) DynamicWriteSheetFun {
  24. return func(writer *DynamicWriteSheet) error {
  25. writer.SaveFilePath = saveFilePath
  26. return nil
  27. }
  28. }
  29. func WithDynamicWriteSheetName(sheetName string) DynamicWriteSheetFun {
  30. return func(writer *DynamicWriteSheet) error {
  31. writer.SheetName = sheetName
  32. return nil
  33. }
  34. }
  35. func NewDynamicWriteSheet(opts ...DynamicWriteSheetFun) (writer *DynamicWriteSheet, err error) {
  36. writer = &DynamicWriteSheet{
  37. File: excelize.NewFile(),
  38. SheetName: "Sheet1",
  39. }
  40. writer.Style = NewStyle(writer.File)
  41. writer.DefaultTitleStyleId, err = writer.Style.NewBoldTitleStyleId()
  42. if err != nil {
  43. return nil, err
  44. }
  45. writer.DefaultValueStyleId, err = writer.Style.NewDefaultValueStyleId()
  46. if err != nil {
  47. return nil, err
  48. }
  49. writer.DefaultTimeStyleId, err = writer.Style.NewDefaultTimeStyleId()
  50. if err != nil {
  51. return nil, err
  52. }
  53. for _, opt := range opts {
  54. if err = opt(writer); err != nil {
  55. return nil, err
  56. }
  57. }
  58. writer.StreamWriter, err = writer.File.NewStreamWriter(writer.SheetName)
  59. if err != nil {
  60. return nil, err
  61. }
  62. return writer, nil
  63. }
  64. func (w *DynamicWriteSheet) PreWrite(_ context.Context, opts ...DynamicPreWriteSheetFun) error {
  65. for _, opt := range opts {
  66. if err := opt(w); err != nil {
  67. return err
  68. }
  69. }
  70. return nil
  71. }
  72. // WriteToFile 将标题内容写入到文件
  73. func (w *DynamicWriteSheet) WriteToFile(ctx context.Context, titles, contents [][]interface{}) error {
  74. if len(w.SaveFilePath) == 0 {
  75. return errors.New("SaveFilePath is empty")
  76. }
  77. err := w.WriteTitle(ctx, 0, titles)
  78. if err != nil {
  79. return errors.WithStackOnce(err)
  80. }
  81. err = w.WriteContent(ctx, len(titles), contents)
  82. if err != nil {
  83. return errors.WithStackOnce(err)
  84. }
  85. return w.FlushToFile()
  86. }
  87. // WriteToBuff 将标题内容写入到 *excelize.File 缓存中
  88. func (w *DynamicWriteSheet) WriteToBuff(ctx context.Context, titles, contents [][]interface{}) error {
  89. err := w.WriteTitle(ctx, 0, titles)
  90. if err != nil {
  91. return errors.WithStackOnce(err)
  92. }
  93. err = w.WriteContent(ctx, len(titles), contents)
  94. if err != nil {
  95. return errors.WithStackOnce(err)
  96. }
  97. return w.Flush()
  98. }
  99. func (w *DynamicWriteSheet) WriteTitle(ctx context.Context, startRow int, titles [][]interface{}) error {
  100. return w.Write(ctx, startRow, titles, w.DefaultTitleStyleId)
  101. }
  102. func (w *DynamicWriteSheet) WriteContent(ctx context.Context, startRow int, contents [][]interface{}) error {
  103. return w.Write(ctx, startRow, contents, w.DefaultValueStyleId)
  104. }
  105. func (w *DynamicWriteSheet) Write(_ context.Context, startRow int, values [][]interface{}, styleId int) (err error) {
  106. for rowID := 0; rowID < len(values); rowID++ {
  107. row := values[rowID]
  108. for i, v := range row {
  109. cell := excelize.Cell{}
  110. if val, ok := v.(excelize.Cell); ok {
  111. cell = val
  112. } else if _, ok := v.(time.Time); ok {
  113. cell = excelize.Cell{StyleID: w.DefaultTimeStyleId, Value: v}
  114. } else {
  115. cell = excelize.Cell{StyleID: styleId, Value: v}
  116. }
  117. row[i] = cell
  118. }
  119. cell, _ := excelize.CoordinatesToCellName(1, rowID+startRow+1)
  120. if err := w.StreamWriter.SetRow(cell, row); err != nil {
  121. return errors.WithStack(err)
  122. }
  123. }
  124. return nil
  125. }
  126. func (w *DynamicWriteSheet) Flush() error {
  127. return w.StreamWriter.Flush()
  128. }
  129. func (w *DynamicWriteSheet) FlushToFile() error {
  130. if len(w.SaveFilePath) == 0 {
  131. return errors.New("SaveFilePath is empty")
  132. }
  133. err := w.StreamWriter.Flush()
  134. if err != nil {
  135. return err
  136. }
  137. err = os.MkdirAll(filepath.Dir(w.SaveFilePath), os.ModePerm)
  138. if err != nil {
  139. return err
  140. }
  141. return w.File.SaveAs(w.SaveFilePath)
  142. }
  143. func (w *DynamicWriteSheet) Close() error {
  144. if w.File != nil {
  145. return w.File.Close()
  146. }
  147. return nil
  148. }