Files
2026-06-24 09:45:35 +08:00

157 lines
4.4 KiB
Go

package main
import (
"archive/zip"
"database/sql"
"flag"
"fmt"
"os"
"path/filepath"
_ "modernc.org/sqlite"
"github.com/xuri/excelize/v2"
)
func main() {
base := flag.String("base", "", "examples base directory")
flag.Parse()
if *base == "" {
fmt.Fprintln(os.Stderr, "missing --base")
os.Exit(2)
}
if err := writeExcelToWord(filepath.Join(*base, "excel-to-word")); err != nil {
fmt.Fprintf(os.Stderr, "write excel-to-word fixtures: %v\n", err)
os.Exit(1)
}
if err := writeExcelFilterToWord(filepath.Join(*base, "excel-filter-to-word")); err != nil {
fmt.Fprintf(os.Stderr, "write excel-filter-to-word fixtures: %v\n", err)
os.Exit(1)
}
if err := writeSQLiteToExcel(filepath.Join(*base, "sqlite-to-excel")); err != nil {
fmt.Fprintf(os.Stderr, "write sqlite-to-excel fixtures: %v\n", err)
os.Exit(1)
}
}
func writeExcelToWord(dir string) error {
if err := os.MkdirAll(dir, 0o755); err != nil {
return err
}
if err := writeWorkbook(filepath.Join(dir, "data.xlsx"), "Daily", [][]string{
{"name", "date", "done", "plan"},
{"张三", "2026-06-18", "完成接口数据核对", "继续处理异常数据"},
{"李四", "2026-06-18", "完成日报提交", "补充系统截图"},
}); err != nil {
return err
}
return writeDocx(filepath.Join(dir, "template.docx"), `<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:p><w:r><w:t>员工:{{na</w:t></w:r><w:r><w:t>me}}</w:t></w:r></w:p><w:p><w:r><w:t>日期:{{date}}</w:t></w:r></w:p><w:p><w:r><w:t>完成:{{done}}</w:t></w:r></w:p><w:p><w:r><w:t>计划:{{plan}}</w:t></w:r></w:p></w:body></w:document>`)
}
func writeExcelFilterToWord(dir string) error {
if err := os.MkdirAll(dir, 0o755); err != nil {
return err
}
if err := writeWorkbook(filepath.Join(dir, "data.xlsx"), "Tickets", [][]string{
{"date", "ticket_no", "customer", "result"},
{"2026-06-18", "GD-001", "A 公司", "已派单"},
{"2026-06-18", "GD-002", "B 公司", "已完成"},
{"2026-06-19", "GD-001", "C 公司", "待复核"},
}); err != nil {
return err
}
return writeDocx(filepath.Join(dir, "template.docx"), `<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:p><w:r><w:t>工单:{{ticket_no}}</w:t></w:r></w:p><w:p><w:r><w:t>日期:{{date}}</w:t></w:r></w:p><w:p><w:r><w:t>客户:{{customer}}</w:t></w:r></w:p><w:p><w:r><w:t>结果:{{result}}</w:t></w:r></w:p></w:body></w:document>`)
}
func writeSQLiteToExcel(dir string) error {
if err := os.MkdirAll(dir, 0o755); err != nil {
return err
}
if err := writeSQLite(filepath.Join(dir, "data.db")); err != nil {
return err
}
return writeWorkbook(filepath.Join(dir, "template.xlsx"), "Summary", [][]string{
{"部门", "{{department}}"},
{"日期", "{{report_date}}"},
{"总数", "{{total_count}}"},
{"异常数", "{{abnormal_count}}"},
})
}
func writeWorkbook(path, sheet string, rows [][]string) error {
f := excelize.NewFile()
defer f.Close()
defaultSheet := f.GetSheetName(0)
if defaultSheet != sheet {
if err := f.SetSheetName(defaultSheet, sheet); err != nil {
return err
}
}
for r, row := range rows {
for c, value := range row {
cell, err := excelize.CoordinatesToCellName(c+1, r+1)
if err != nil {
return err
}
if err := f.SetCellValue(sheet, cell, value); err != nil {
return err
}
}
}
return f.SaveAs(path)
}
func writeDocx(path, body string) error {
file, err := os.Create(path)
if err != nil {
return err
}
defer file.Close()
zw := zip.NewWriter(file)
if err := writeZipEntry(zw, "[Content_Types].xml", `<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"/>`); err != nil {
return err
}
if err := writeZipEntry(zw, "word/document.xml", body); err != nil {
return err
}
return zw.Close()
}
func writeZipEntry(zw *zip.Writer, name, body string) error {
w, err := zw.Create(name)
if err != nil {
return err
}
_, err = w.Write([]byte(body))
return err
}
func writeSQLite(path string) error {
if err := os.Remove(path); err != nil && !os.IsNotExist(err) {
return err
}
db, err := sql.Open("sqlite", path)
if err != nil {
return err
}
defer db.Close()
_, err = db.Exec(`
create table department_summary (
department text,
report_date text,
total_count integer,
abnormal_count integer
);
insert into department_summary values
('营销部', '2026-06-18', 128, 3),
('客服部', '2026-06-18', 76, 0),
('客服部', '2026-06-17', 68, 1);
`)
return err
}