package file import ( "errors" "fmt" "os" "reflect" "github.com/xuri/excelize/v2" ) // CreateEmptyFile 创建一个固定size大小的空文件 // 如果seek文件失败,则删除文件,并返回错误信息 func CreateEmptyFile(name string, size int64) (f *os.File, err error) { defer func() { if err != nil && f != nil { f.Close() os.Remove(name) } }() f, err = os.OpenFile(name, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666) if err != nil { return } if _, err = f.Seek(size-1, 0); err != nil { return } _, err = f.Write([]byte{0}) return } func MakeDir(name string) error { if err := os.MkdirAll(name, 0755); err != nil { return errors.New("make dir wrong") } return nil } func WriteFile(data []byte, filename string) (err error) { defer func() { if err != nil { _ = os.Remove(filename) } }() pi := GetPathInfo(filename) if pi.Dir != "" { if err = os.MkdirAll(pi.Dir, 0755); err != nil { return } } f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666) if err != nil { return } _, err = f.Write(data) _ = f.Close() return } // WriteStruct2Xlsx 将struct切片写入Excel sheet func WriteStruct2Xlsx(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 { panic("records must be slice") } s := reflect.ValueOf(records) for i := 0; i < s.Len(); i++ { elem := s.Index(i).Interface() elemType := reflect.TypeOf(elem) elemValue := reflect.ValueOf(elem) if elemType.Kind() == reflect.Ptr { elemType = elemType.Elem() elemValue = elemValue.Elem() } if elemType.Kind() != reflect.Struct { panic("record in slice must be a struct") } k := 0 for j := 0; j < elemType.NumField(); j++ { field := elemType.Field(j) tag := field.Tag.Get("xlsx") if tag == "-" { continue } if tag == "" { tag = field.Name } column, _ := excelize.ColumnNumberToName(k + 1) k++ name := tag // 设置表头 if i == 0 { _ = xlsx.SetCellValue(sheet, fmt.Sprintf("%s%d", column, i+1), name) } // 设置内容 _ = xlsx.SetCellValue(sheet, fmt.Sprintf("%s%d", column, i+2), elemValue.Field(j).Interface()) } } return xlsx }