| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package utils
- import (
- "fmt"
- "reflect"
- "github.com/xuri/excelize/v2"
- )
- var Cols = []string{"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
- // WriteXlsx 填充excel
- func WriteXlsx(sheet string, records interface{}) *excelize.File {
- xlsx := excelize.NewFile() // new file
- index, _ := xlsx.NewSheet(sheet) // new sheet
- xlsx.SetActiveSheet(index) // set active (default) sheet
- t := reflect.TypeOf(records)
- if t.Kind() != reflect.Slice {
- return xlsx
- }
- s := reflect.ValueOf(records)
- for i := 0; i < s.Len(); i++ {
- elem := s.Index(i).Interface()
- elemType := reflect.TypeOf(elem)
- elemValue := reflect.ValueOf(elem)
- index := -1
- for j := 0; j < elemType.NumField(); j++ {
- field := elemType.Field(j)
- tag := field.Tag.Get("xlsx")
- name := tag
- if tag == "" || tag == "-" {
- continue
- }
- index++
- if index == -1 {
- continue
- }
- column, _ := ConvertNumToChars(index)
- // 设置表头
- if i == 0 {
- err := xlsx.SetCellValue(sheet, fmt.Sprintf("%s%d", column, i+1), name)
- if err != nil {
- return nil
- }
- }
- // 设置内容
- err := xlsx.SetCellValue(sheet, fmt.Sprintf("%s%d", column, i+2), elemValue.Field(j).Interface())
- if err != nil {
- return nil
- }
- }
- }
- return xlsx
- }
- func ConvertNumToChars(num int) (string, error) {
- var cols string
- v := num + 1
- for v > 0 {
- k := v % 26
- if k == 0 {
- k = 26
- }
- v = (v - k) / 26
- cols = Cols[k] + cols
- }
- return cols, nil
- }
|