export.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package excel
  2. import (
  3. "scd_check_tools/tools"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "github.com/astaxie/beego/orm"
  10. "github.com/tealeg/xlsx"
  11. )
  12. var CacheFilePath = "tmp"
  13. var tmpFileName = ""
  14. func InitExcel(name string, p ...string) (result error) {
  15. if name == "" {
  16. fmt.Println(tools.NowTime() + "文件名不能为空")
  17. return errors.New("文件名不能为空")
  18. }
  19. tmpFileName = name
  20. if len(p) > 0 {
  21. path := p[0]
  22. if path == "" {
  23. fmt.Println(tools.NowTime() + "文件存储路径不能为空")
  24. return errors.New("文件存储路径不能为空")
  25. }
  26. CacheFilePath = path
  27. if _, err := os.Stat(CacheFilePath); os.IsNotExist(err) {
  28. // 必须分成两步:先创建文件夹、再修改权限
  29. os.MkdirAll(CacheFilePath, 0777) //0777也可以os.ModePerm
  30. os.Chmod(CacheFilePath, 0777)
  31. }
  32. }
  33. return nil
  34. }
  35. //导出数据
  36. func ExportExcel(caption string, cols []string, colnames []string, datalist []orm.Params, autoNoCol bool) (filename string, result error) {
  37. excelFileName := CacheFilePath + string(os.PathSeparator) + tmpFileName
  38. if excelFileName == "" {
  39. fmt.Println(tools.NowTime() + "导出的文件路径或文件名不能为空")
  40. return "", errors.New("导出的文件路径或文件名不能为空")
  41. }
  42. /*
  43. xlFile, err := xlsx.OpenFile(excelFileName)
  44. if err != nil {
  45. fmt.Println(tools.NowTime() + err.Error())
  46. return "", err
  47. }
  48. */
  49. var file *xlsx.File
  50. var sheet *xlsx.Sheet
  51. var row *xlsx.Row
  52. var cell *xlsx.Cell
  53. var err error
  54. file = xlsx.NewFile()
  55. if caption != "" {
  56. if len(caption) > 31 {
  57. sheet, err = file.AddSheet(caption[0:31])
  58. } else {
  59. sheet, err = file.AddSheet(caption)
  60. }
  61. } else {
  62. sheet, err = file.AddSheet("Sheet1")
  63. }
  64. if err != nil {
  65. fmt.Printf(tools.NowTime() + err.Error())
  66. return "", err
  67. }
  68. if len(cols) == 0 {
  69. //未指定导出列时,导出所有列且中文名与列表相同
  70. if len(datalist) == 0 {
  71. return "", errors.New("没有数据可导出")
  72. }
  73. for k, _ := range datalist[0] {
  74. cols = append(cols, k)
  75. colnames = append(colnames, k)
  76. }
  77. }
  78. if caption != "" {
  79. //添加标题行
  80. row = sheet.AddRow()
  81. cell = row.AddCell()
  82. if autoNoCol {
  83. cell.HMerge = len(colnames) //合并单元格数
  84. } else {
  85. cell.HMerge = len(colnames) - 1 //合并单元格数
  86. }
  87. cell.Value = caption
  88. style := xlsx.NewStyle()
  89. style.Alignment.Horizontal = "center"
  90. cell.SetStyle(style)
  91. }
  92. //添加列头行
  93. row = sheet.AddRow()
  94. if autoNoCol {
  95. cell = row.AddCell()
  96. cell.Value = "序号"
  97. }
  98. for _, colname := range colnames {
  99. cell = row.AddCell()
  100. cell.Value = colname
  101. }
  102. //添加数据行
  103. for i, dataRow := range datalist {
  104. row = sheet.AddRow()
  105. cell = row.AddCell()
  106. cell.Value = strconv.Itoa(i + 1) // "序号"
  107. for _, datacolitem := range cols {
  108. datavalue := dataRow[datacolitem]
  109. cell = row.AddCell()
  110. if datavalue == nil {
  111. cell.Value = ""
  112. } else {
  113. cell.Value = datavalue.(string)
  114. }
  115. }
  116. }
  117. err = file.Save(excelFileName + ".xlsx")
  118. if err != nil {
  119. fmt.Printf(tools.NowTime() + err.Error())
  120. return "", err
  121. }
  122. return tmpFileName + ".xlsx", nil
  123. }
  124. func FileExist(filename string) bool {
  125. _, err := os.Lstat(filename)
  126. return !os.IsNotExist(err)
  127. }
  128. func ImportRecord(path string, title string, fieldMapping map[string]string) ([]map[string]string, error) {
  129. xlFile, err := xlsx.OpenFile(path)
  130. if err != nil {
  131. return nil, err
  132. }
  133. var sheet = xlFile.Sheets[0]
  134. var result = []map[string]string{}
  135. var fields = make(map[int]string)
  136. for i, row := range sheet.Rows {
  137. if i < 2 { //判断标题是否一致
  138. if i == 0 && title != "" {
  139. for index, cell := range row.Cells {
  140. if index == 0 && title != cell.String() {
  141. return nil, errors.New("导入文件的标题必须为[" + title + "]")
  142. }
  143. }
  144. } else if i == 1 {
  145. for index2, cell := range row.Cells {
  146. var field = strings.ReplaceAll(cell.Value, " ", "")
  147. field = strings.ReplaceAll(field, " ", "")
  148. fields[index2] = field
  149. }
  150. }
  151. continue
  152. }
  153. rowdata := map[string]string{}
  154. for j, cell := range row.Cells {
  155. var fieldName = fields[j]
  156. var val = cell.Value
  157. if val != "" {
  158. if name, ok2 := fieldMapping[fieldName]; ok2 && tools.IsEmpty(name) != "" {
  159. rowdata[name] = val
  160. }
  161. }
  162. }
  163. result = append(result, rowdata)
  164. }
  165. return result, nil
  166. }