export.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package excel
  2. import (
  3. "encoding/csv"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "os"
  9. "regexp"
  10. "rtzh_elec_temperature/tools"
  11. "strconv"
  12. "strings"
  13. "github.com/astaxie/beego/orm"
  14. "github.com/tealeg/xlsx"
  15. )
  16. var CacheFilePath = "tmp"
  17. var tmpFileName = ""
  18. func InitExcel(name string, p ...string) (result error) {
  19. if name == "" {
  20. fmt.Println(tools.NowTime() + "文件名不能为空")
  21. return errors.New("文件名不能为空")
  22. }
  23. tmpFileName = name
  24. if len(p) > 0 {
  25. path := p[0]
  26. if path == "" {
  27. fmt.Println(tools.NowTime() + "文件存储路径不能为空")
  28. return errors.New("文件存储路径不能为空")
  29. }
  30. CacheFilePath = path
  31. if _, err := os.Stat(CacheFilePath); os.IsNotExist(err) {
  32. // 必须分成两步:先创建文件夹、再修改权限
  33. os.MkdirAll(CacheFilePath, 0777) //0777也可以os.ModePerm
  34. os.Chmod(CacheFilePath, 0777)
  35. }
  36. }
  37. return nil
  38. }
  39. //导出数据
  40. func ExportExcel(caption string, cols []string, colnames []string, datalist []orm.Params, autoNoCol bool) (filename string, result error) {
  41. excelFileName := CacheFilePath + string(os.PathSeparator) + tmpFileName
  42. if excelFileName == "" {
  43. fmt.Println(tools.NowTime() + "导出的文件路径或文件名不能为空")
  44. return "", errors.New("导出的文件路径或文件名不能为空")
  45. }
  46. /*
  47. xlFile, err := xlsx.OpenFile(excelFileName)
  48. if err != nil {
  49. fmt.Println(tools.NowTime() + err.Error())
  50. return "", err
  51. }
  52. */
  53. var file *xlsx.File
  54. var sheet *xlsx.Sheet
  55. var row *xlsx.Row
  56. var cell *xlsx.Cell
  57. var err error
  58. file = xlsx.NewFile()
  59. if caption != "" {
  60. sheet, err = file.AddSheet(caption)
  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. if autoNoCol {
  106. cell = row.AddCell()
  107. cell.Value = strconv.Itoa(i + 1) // "序号"
  108. }
  109. for _, datacolitem := range cols {
  110. datavalue := dataRow[datacolitem]
  111. cell = row.AddCell()
  112. if datavalue == nil {
  113. cell.Value = ""
  114. } else {
  115. cell.Value = tools.IsEmpty(datavalue)
  116. }
  117. }
  118. }
  119. err = file.Save(excelFileName + ".xlsx")
  120. if err != nil {
  121. fmt.Printf(tools.NowTime() + err.Error())
  122. return "", err
  123. }
  124. return tmpFileName + ".xlsx", nil
  125. }
  126. func FileExist(filename string) bool {
  127. _, err := os.Lstat(filename)
  128. return !os.IsNotExist(err)
  129. }
  130. func ImportRecord(path string, title string, fieldMapping map[string]string) ([]map[string]string, error) {
  131. xlFile, err := xlsx.OpenFile(path)
  132. if err != nil {
  133. return nil, err
  134. }
  135. var sheet = xlFile.Sheets[0]
  136. var result = []map[string]string{}
  137. var fields = make(map[int]string)
  138. for i, row := range sheet.Rows {
  139. if i < 2 { //判断标题是否一致
  140. if i == 0 && title != "" {
  141. for index, cell := range row.Cells {
  142. if index == 0 && title != cell.String() {
  143. return nil, errors.New("导入文件的标题必须为[" + title + "]")
  144. }
  145. }
  146. } else if i == 1 {
  147. for index2, cell := range row.Cells {
  148. var field = strings.ReplaceAll(cell.Value, " ", "")
  149. field = strings.ReplaceAll(field, " ", "")
  150. fields[index2] = field
  151. }
  152. }
  153. continue
  154. }
  155. rowdata := map[string]string{}
  156. for j, cell := range row.Cells {
  157. var fieldName = fields[j]
  158. var val = cell.Value
  159. if val != "" {
  160. if name, ok2 := fieldMapping[fieldName]; ok2 && tools.IsEmpty(name) != "" {
  161. rowdata[name] = val
  162. }
  163. }
  164. }
  165. result = append(result, rowdata)
  166. }
  167. return result, nil
  168. }
  169. func ImpExcel(path string) (data []map[int]string, err error) {
  170. xlFile, err := xlsx.OpenFile(path)
  171. if err != nil {
  172. return nil, err
  173. }
  174. var sheet = xlFile.Sheets[0]
  175. var result = []map[int]string{}
  176. reg := regexp.MustCompile(`\r\n\t`)
  177. for i, row := range sheet.Rows {
  178. if i == 0 || i == 1 {
  179. continue
  180. }
  181. rowdata := map[int]string{}
  182. for j, cell := range row.Cells {
  183. rowdata[j] = reg.ReplaceAllString(strings.Trim(cell.String(), " "), "")
  184. }
  185. result = append(result, rowdata)
  186. }
  187. //tools.Log(result)
  188. return result, nil
  189. }
  190. func ImpCsv(path string, opts ...map[string]string) (data []map[int]string, err error) {
  191. fileHanlder, err := os.Open(path)
  192. if err != nil {
  193. return nil, err
  194. }
  195. defer fileHanlder.Close()
  196. reader := csv.NewReader(fileHanlder)
  197. if reader == nil {
  198. return nil, errors.New("文件读取失败!")
  199. }
  200. if opts != nil {
  201. p1 := opts[0]
  202. if separator, has := p1["separator"]; has {
  203. reader.Comma = []rune(separator)[0]
  204. }
  205. }
  206. reader.TrimLeadingSpace = true
  207. rowindex := 0
  208. var csvData = []map[int]string{}
  209. errList := []string{}
  210. for {
  211. txt, readerr := reader.Read()
  212. if readerr == io.EOF {
  213. break
  214. }
  215. if readerr != nil {
  216. rowindex++
  217. tools.Log(readerr)
  218. errList = append(errList, readerr.Error())
  219. continue
  220. }
  221. reg := regexp.MustCompile(`\r\n\t`)
  222. if rowindex == 0 {
  223. rowindex++
  224. continue
  225. }
  226. rowdata := map[int]string{}
  227. for j, cell := range txt {
  228. rowdata[j] = reg.ReplaceAllString(strings.Trim(cell, " "), "")
  229. }
  230. csvData = append(csvData, rowdata)
  231. rowindex++
  232. }
  233. if len(errList) > 0 {
  234. errstr, _ := json.Marshal(errList)
  235. return nil, errors.New(string(errstr))
  236. }
  237. return csvData, nil
  238. }
  239. //获取excel列头
  240. func ReadExcelHeader(path string) (data map[int]string, err error) {
  241. xlFile, err := xlsx.OpenFile(path)
  242. if err != nil {
  243. return nil, err
  244. }
  245. var sheet = xlFile.Sheets[0]
  246. var result = map[int]string{}
  247. reg := regexp.MustCompile(`\r\n\t`)
  248. for i, row := range sheet.Rows {
  249. if i == 0 {
  250. for j, cell := range row.Cells {
  251. result[j] = reg.ReplaceAllString(strings.Trim(cell.String(), " "), "")
  252. }
  253. break
  254. }
  255. }
  256. //tools.Log(result)
  257. return result, nil
  258. }
  259. //获取csv文件列头
  260. func ReadCsvHeader(path string, opts ...map[string]string) (data map[int]string, err error) {
  261. var result = map[int]string{}
  262. fileHanlder, err := os.Open(path)
  263. if err != nil {
  264. fileHanlder.Close()
  265. return nil, err
  266. }
  267. defer fileHanlder.Close()
  268. reader := csv.NewReader(fileHanlder)
  269. if reader == nil {
  270. return nil, errors.New("文件读取失败!")
  271. }
  272. if opts != nil {
  273. p1 := opts[0]
  274. if separator, has := p1["separator"]; has {
  275. reader.Comma = []rune(separator)[0]
  276. }
  277. }
  278. txt, readerr := reader.Read()
  279. if readerr != nil {
  280. return nil, readerr
  281. }
  282. reg := regexp.MustCompile(`\r\n\t`)
  283. for j, cell := range txt {
  284. result[j] = reg.ReplaceAllString(strings.Trim(cell, " "), "")
  285. }
  286. return result, nil
  287. }