qr-scanner/services/exporter.go

83 lines
1.7 KiB
Go

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"))
}