package iot_excelize import ( "github.com/xuri/excelize/v2" ) type BatchResultRow struct { RowNo int ItemID string Status string ErrorReason string } type BatchInfoItem struct { Field string Value string } func BuildBatchResultExcel(rows []BatchResultRow, infos []BatchInfoItem) (*excelize.File, error) { f := excelize.NewFile() leftStyleID, err := f.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{ Horizontal: "left", Vertical: "center", }, }) if err != nil { return nil, err } resultSheet := "导入结果" if err := f.SetSheetName("Sheet1", resultSheet); err != nil { return nil, err } headers := []string{"源文件行号", "item_id", "处理状态", "异常原因"} if err := f.SetSheetRow(resultSheet, "A1", &headers); err != nil { return nil, err } for i, item := range rows { values := []interface{}{item.RowNo, item.ItemID, item.Status, item.ErrorReason} cell, err := excelize.CoordinatesToCellName(1, i+2) if err != nil { return nil, err } if err = f.SetSheetRow(resultSheet, cell, &values); err != nil { return nil, err } } resultEndCell, err := excelize.CoordinatesToCellName(4, len(rows)+1) if err != nil { return nil, err } if err := f.SetCellStyle(resultSheet, "A1", resultEndCell, leftStyleID); err != nil { return nil, err } infoSheet := "批次信息" if _, err := f.NewSheet(infoSheet); err != nil { return nil, err } infoHeaders := []string{"字段", "值"} if err := f.SetSheetRow(infoSheet, "A1", &infoHeaders); err != nil { return nil, err } for i, item := range infos { values := []interface{}{item.Field, item.Value} cell, err := excelize.CoordinatesToCellName(1, i+2) if err != nil { return nil, err } if err = f.SetSheetRow(infoSheet, cell, &values); err != nil { return nil, err } } infoEndCell, err := excelize.CoordinatesToCellName(2, len(infos)+1) if err != nil { return nil, err } if err := f.SetCellStyle(infoSheet, "A1", infoEndCell, leftStyleID); err != nil { return nil, err } _ = f.SetColWidth(resultSheet, "A", "A", 14) _ = f.SetColWidth(resultSheet, "B", "B", 24) _ = f.SetColWidth(resultSheet, "C", "C", 12) _ = f.SetColWidth(resultSheet, "D", "D", 40) _ = f.SetColWidth(infoSheet, "A", "B", 24) f.SetActiveSheet(0) return f, nil }