157 lines
4.4 KiB
Go
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
|
|
}
|