修复导出 excel 错乱

This commit is contained in:
haomingming
2026-09-15 14:03:54 +08:00
parent da13b9dfaf
commit 3f5807aad2
2 changed files with 52 additions and 20 deletions
+43 -15
View File
@@ -199,9 +199,11 @@ func fillDataWithMerge(f *excelize.File, sheetName string, header []HeaderCellDa
}
// 设置单元格样式
err = setCellStyle(f, sheetName, axis, header[i], alignment)
if err != nil {
return 0, err
if colOffset < len(header) {
err = setCellStyle(f, sheetName, axis, header[colOffset], alignment)
if err != nil {
return 0, err
}
}
// 设置行高 35-第一行
@@ -214,23 +216,33 @@ func fillDataWithMerge(f *excelize.File, sheetName string, header []HeaderCellDa
mergeNum = mergeNum + 1
mergeNumSlice = append(mergeNumSlice, colName)
} else {
var sliceFieldNum int // 切片字段数量
// 最大切片数量,此数量为其余需合并的数量
if filedNumSlice < field.Len() {
filedNumSlice = field.Len()
}
elemType := field.Type().Elem()
if elemType.Kind() == reflect.Ptr {
elemType = elemType.Elem()
}
numSliceFields := 0
if elemType.Kind() == reflect.Struct {
numSliceFields = elemType.NumField()
}
for j := 0; j < field.Len(); j++ {
item := field.Index(j).Interface()
v1 := reflect.ValueOf(item)
if v1.Kind() == reflect.Ptr {
v1 = v1.Elem()
}
for i2 := 0; i2 < field.Index(j).NumField(); i2++ {
for i2 := 0; i2 < v1.NumField(); i2++ {
// 获取字段值
cellValue := v1.Field(i2).Interface()
// 获取列名
colName, err := excelize.ColumnNumberToName(i + i2 + 1)
colName, err := excelize.ColumnNumberToName(colOffset + i2 + 1)
if err != nil {
return 0, err
}
@@ -245,9 +257,11 @@ func fillDataWithMerge(f *excelize.File, sheetName string, header []HeaderCellDa
}
// 设置单元格样式
err = setCellStyle(f, sheetName, axis, header[i+i2], alignment)
if err != nil {
return row, err
if colOffset+i2 < len(header) {
err = setCellStyle(f, sheetName, axis, header[colOffset+i2], alignment)
if err != nil {
return row, err
}
}
// 设置行高 35-第一行
@@ -255,14 +269,28 @@ func fillDataWithMerge(f *excelize.File, sheetName string, header []HeaderCellDa
if err != nil {
return row, err
}
sliceFieldNum = i2
}
}
// 列偏移量需增加上切片字段数量
colOffset = colOffset + sliceFieldNum
if field.Len() == 0 {
for i2 := 0; i2 < numSliceFields; i2++ {
colName, err := excelize.ColumnNumberToName(colOffset + i2 + 1)
if err != nil {
return 0, err
}
axis = colName + fmt.Sprintf("%d", row+1)
if colOffset+i2 < len(header) {
_ = setCellStyle(f, sheetName, axis, header[colOffset+i2], alignment)
}
_ = f.SetRowHeight(sheetName, row+1, 35)
}
}
// 列偏移量需增加上切片字段数量(减1是因为循环末尾有colOffset++)
if numSliceFields > 0 {
colOffset = colOffset + numSliceFields - 1
}
}
colOffset++
@@ -325,7 +353,7 @@ func setCellStyle(f *excelize.File, sheetName, axis string, header HeaderCellDat
}
}
if header.CellType == "float" {
if header.CellType == "float" || header.CellType == "float64" {
style.NumFmt = 2
customNumFmt := "0.000"
style.CustomNumFmt = &customNumFmt