package services import ( "fmt" "path/filepath" "sort" "strings" "time" "github.com/xuri/excelize/v2" "qr-scanner/models" ) type Exporter struct{} func NewExporter() *Exporter { return &Exporter{} } func (e *Exporter) Export(results map[int]models.ScanResult, outputPath string) error { f := excelize.NewFile() sheet := "Sheet1" headers := []string{"序号", "图片路径", "识别内容", "处理状态", "错误信息", "处理时间"} for i, header := range headers { cell, _ := excelize.CoordinatesToCellName(i+1, 1) _ = f.SetCellValue(sheet, cell, header) } indexes := make([]int, 0, len(results)) for i := range results { indexes = append(indexes, i) } sort.Ints(indexes) row := 2 for _, i := range indexes { r := results[i] status := "成功" if !r.Success { status = "失败" } content := strings.Join(r.Contents, "\n") values := []any{ r.Index, r.FilePath, content, status, r.ErrorMessage, r.ProcessedAt.Format("2006-01-02 15:04:05"), } for col, v := range values { cell, _ := excelize.CoordinatesToCellName(col+1, row) _ = f.SetCellValue(sheet, cell, v) } row++ } if err := f.SetColWidth(sheet, "A", "A", 8); err != nil { return err } if err := f.SetColWidth(sheet, "B", "B", 50); err != nil { return err } if err := f.SetColWidth(sheet, "C", "C", 60); err != nil { return err } if err := f.SetColWidth(sheet, "D", "F", 18); err != nil { return err } if err := ensureDir(filepath.Dir(outputPath)); err != nil { return err } return f.SaveAs(outputPath) } func ExportFilename(now time.Time) string { return fmt.Sprintf("二维码识别结果_%s.xlsx", now.Format("20060102_150405")) }