dataExportExcel.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package util
  2. //数据导出excel
  3. import (
  4. "config"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "os"
  9. qutil "qfw/util"
  10. "strings"
  11. "time"
  12. "github.com/tealeg/xlsx"
  13. )
  14. var (
  15. defaultExcelBorder = xlsx.Border{ //边框样式
  16. Left: "thin",
  17. LeftColor: "00A6A6A6",
  18. Right: "thin",
  19. RightColor: "00A6A6A6",
  20. Top: "thin",
  21. TopColor: "00A6A6A6",
  22. Bottom: "thin",
  23. BottomColor: "00A6A6A6",
  24. }
  25. defaultExcelAlignment = xlsx.Alignment{ //对其方式
  26. Horizontal: "center",
  27. Vertical: "center",
  28. WrapText: true,
  29. }
  30. defaultCellStyle = &xlsx.Style{ //默认样式
  31. Border: defaultExcelBorder,
  32. Alignment: defaultExcelAlignment,
  33. }
  34. )
  35. //获取
  36. func GetExcelFilePath(orderCode string) string {
  37. now := time.Now()
  38. filename := fmt.Sprintf("%s.xlsx", fmt.Sprintf("%s_%s_%s", now.Format("20060102150405"), orderCode, qutil.GetLetterRandom(5)))
  39. return fmt.Sprintf("/dataexport/%s/%s/%s", now.Format("2006"), now.Format("01"), filename)
  40. }
  41. //获取excel导出数据长度
  42. func GetDataExportFileDataLen(path string) (int, error) {
  43. xFile, err := xlsx.OpenFile(path)
  44. if err != nil {
  45. return -1, err
  46. }
  47. sheet1, ok := xFile.Sheet["Sheet1"]
  48. if !ok {
  49. return -1, fmt.Errorf("not find sheet1")
  50. }
  51. if len(sheet1.Rows) == 0 {
  52. return -1, fmt.Errorf("sheet1 hasn't Rows data ")
  53. }
  54. return sheet1.Rows[len(sheet1.Rows)-1].Cells[0].Int()
  55. }
  56. //生成数据导出excel
  57. func CreateDataExportExcelFile(list *[]map[string]interface{}, isSenior bool, filePath string) error {
  58. if list == nil || len(*list) == 0 {
  59. return errors.New("未查询到数据")
  60. }
  61. //创建excel文件
  62. file := xlsx.NewFile()
  63. sheet, err := file.AddSheet("Sheet1")
  64. if err != nil {
  65. return errors.New("创建Sheet1失败")
  66. }
  67. var row *xlsx.Row
  68. var cell *xlsx.Cell
  69. var excelHead []*config.ExeclCell
  70. //添加头部标题
  71. if !isSenior {
  72. row = sheet.AddRow()
  73. row.SetHeight(20)
  74. excelHead = config.ExConf.Standard_Fields
  75. for index, excel := range excelHead {
  76. cell = row.AddCell()
  77. cell.SetString(excel.Name)
  78. cell.SetStyle(&xlsx.Style{
  79. Fill: *xlsx.NewFill("solid", excel.Color, excel.Color),
  80. Border: defaultExcelBorder,
  81. Alignment: defaultExcelAlignment,
  82. })
  83. sheet.Col(index).Width = excel.Width
  84. }
  85. } else {
  86. excelHead = config.ExConf.Senior_Fields
  87. //铺设第一层title
  88. row = sheet.AddRow()
  89. row.SetHeight(12)
  90. lastF := false //合并行时标识
  91. for _, excel := range excelHead {
  92. if excel.VMerge != 1 && excel.HMerge == 0 {
  93. if lastF { //不可读取内容
  94. lastF = false
  95. continue
  96. }
  97. cell = row.AddCell()
  98. } else {
  99. lastF = true
  100. cell = row.AddCell()
  101. cell.SetString(excel.Name)
  102. cell.VMerge = excel.VMerge
  103. cell.HMerge = excel.HMerge
  104. }
  105. if excel.HMerge != 0 {
  106. lastF = true
  107. }
  108. cell.SetStyle(&xlsx.Style{
  109. Fill: *xlsx.NewFill("solid", excel.Color, excel.Color),
  110. Border: defaultExcelBorder,
  111. Alignment: defaultExcelAlignment,
  112. })
  113. }
  114. //铺设第二层title并设置宽度
  115. row = sheet.AddRow()
  116. row.SetHeight(12)
  117. cNum := 0
  118. for _, excel := range excelHead {
  119. if excel.HMerge != 0 {
  120. continue
  121. }
  122. cell = row.AddCell()
  123. if excel.VMerge != 1 {
  124. cell.SetString(excel.Name)
  125. }
  126. sheet.Col(cNum).Width = excel.Width
  127. cNum++
  128. cell.SetStyle(&xlsx.Style{
  129. Fill: *xlsx.NewFill("solid", excel.Color, excel.Color),
  130. Border: defaultExcelBorder,
  131. Alignment: defaultExcelAlignment,
  132. })
  133. }
  134. }
  135. //填充数据
  136. for k, data := range *list {
  137. row = sheet.AddRow()
  138. row.SetHeight(50)
  139. data["index"] = k + 1
  140. for _, v := range excelHead {
  141. if v.Filed == "" {
  142. continue
  143. }
  144. cell = row.AddCell()
  145. if v.Filed == "title" || v.Filed == "url" {
  146. cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["url_jump"], data[v.Filed]))
  147. } else {
  148. cell.SetValue(data[v.Filed])
  149. }
  150. cell.SetStyle(&xlsx.Style{
  151. Border: defaultExcelBorder,
  152. Alignment: defaultExcelAlignment,
  153. })
  154. }
  155. }
  156. if err := FolderCheck(filePath); err != nil {
  157. return err
  158. }
  159. return file.Save(filePath)
  160. }
  161. //校验文件夹是否存在;
  162. //若不存在则创建;
  163. func FolderCheck(path string) error {
  164. pathCheck := path[:strings.LastIndex(path, "/")]
  165. //校验文件夹是否存在
  166. _, pathError := os.Stat(pathCheck)
  167. if pathError != nil && os.IsNotExist(pathError) {
  168. // 创建文件夹
  169. return os.MkdirAll(pathCheck, os.ModePerm)
  170. }
  171. return nil
  172. }
  173. //移动文件至指定目录
  174. func MoveFile(src, dst string) (int64, error) {
  175. srcFile, err := os.Open(src)
  176. if err != nil {
  177. return 0, err
  178. }
  179. defer srcFile.Close()
  180. //文件夹
  181. err = FolderCheck(dst)
  182. if err != nil {
  183. return 0, err
  184. }
  185. dstFile, err := os.Create(dst)
  186. if err != nil {
  187. return 0, err
  188. }
  189. defer dstFile.Close()
  190. return io.Copy(dstFile, srcFile)
  191. }