83 lines
1.7 KiB
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"))
|
|
}
|
|
|