Compare commits

..

No commits in common. "1b4f86d57e9c835fa2039cdc3492eaf147cc19ad" and "aede8cbe97afa86ff61782d60ddc8de9797eb2e1" have entirely different histories.

View File

@ -518,7 +518,6 @@ func BalanceMetricsExport(ctx *gin.Context) {
} }
func exportStructToExcel[T any](data []T, headers []string, filename string, fns ...func(data []T, headers []string, f *excelize.File)) error { func exportStructToExcel[T any](data []T, headers []string, filename string, fns ...func(data []T, headers []string, f *excelize.File)) error {
f := excelize.NewFile() f := excelize.NewFile()
sheet := f.GetSheetName(f.GetActiveSheetIndex()) sheet := f.GetSheetName(f.GetActiveSheetIndex())
@ -528,46 +527,44 @@ func exportStructToExcel[T any](data []T, headers []string, filename string, fns
f.SetCellValue(sheet, cell, h) f.SetCellValue(sheet, cell, h)
} }
if len(data) != 0 { // 获取结构体字段顺序
// 获取结构体字段顺序 v := reflect.ValueOf(data[0])
v := reflect.ValueOf(data[0]) if v.Kind() == reflect.Ptr {
if v.Kind() == reflect.Ptr { v = v.Elem()
v = v.Elem()
}
t := v.Type()
// 过滤出导出字段
exportedFields := make([]int, 0)
for i := 0; i < t.NumField(); i++ {
if t.Field(i).IsExported() { // Go 1.17+ 新增的方法
exportedFields = append(exportedFields, i)
}
}
// 写入数据
for rowIdx, item := range data {
val := reflect.ValueOf(item)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for colIdx, fieldIdx := range exportedFields {
field := val.Field(fieldIdx)
var cellValue any
switch field.Kind() {
case reflect.Float32, reflect.Float64:
cellValue = fmt.Sprintf("$%.2f", field.Float()) // 保留两位小数
default:
cellValue = field.Interface()
}
cell, _ := excelize.CoordinatesToCellName(colIdx+1, rowIdx+2)
f.SetCellValue(sheet, cell, cellValue)
}
}
} }
t := v.Type()
// 过滤出导出字段
exportedFields := make([]int, 0)
for i := 0; i < t.NumField(); i++ {
if t.Field(i).IsExported() { // Go 1.17+ 新增的方法
exportedFields = append(exportedFields, i)
}
}
// 写入数据
for rowIdx, item := range data {
val := reflect.ValueOf(item)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for colIdx, fieldIdx := range exportedFields {
field := val.Field(fieldIdx)
var cellValue any
switch field.Kind() {
case reflect.Float32, reflect.Float64:
cellValue = fmt.Sprintf("$%.2f", field.Float()) // 保留两位小数
default:
cellValue = field.Interface()
}
cell, _ := excelize.CoordinatesToCellName(colIdx+1, rowIdx+2)
f.SetCellValue(sheet, cell, cellValue)
}
}
for _, fn := range fns { for _, fn := range fns {
fn(data, headers, f) fn(data, headers, f)
} }