From e43f4cb3fa003155ff672cb1c087e96bec7887e1 Mon Sep 17 00:00:00 2001 From: "Mr.Li" Date: Fri, 21 Apr 2023 13:38:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/cmd/csv.go | 2 +- cmd/cmd/merge.go | 103 ++++++++++++++++++++++++++++++++++++++++++ cmd/cmd/merge_test.go | 15 ++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 cmd/cmd/merge.go create mode 100644 cmd/cmd/merge_test.go diff --git a/cmd/cmd/csv.go b/cmd/cmd/csv.go index 3ad49fa..c802cb0 100644 --- a/cmd/cmd/csv.go +++ b/cmd/cmd/csv.go @@ -162,7 +162,7 @@ func (e *Csv) mergeCsvToExcel(path string, max int) error { begin := time.Now() f := excelize.NewFile() defer func() { - log.Println("mergeCsvToExcel:耗时 %s", time.Now().Sub(begin).String()) + log.Printf("mergeCsvToExcel:耗时 %s\n", time.Now().Sub(begin).String()) if err := f.Close(); err != nil { log.Println(err) } diff --git a/cmd/cmd/merge.go b/cmd/cmd/merge.go new file mode 100644 index 0000000..d3817fd --- /dev/null +++ b/cmd/cmd/merge.go @@ -0,0 +1,103 @@ +package cmd + +import ( + "github.com/xuri/excelize/v2" + "regexp" + "strconv" +) + +type Merge struct { + fileName string + limit int + file *excelize.File + sw *excelize.StreamWriter + + titles []interface{} + fileIndex int + total int + rowIndex int +} + +func NewMerge(filename string, limit int) *Merge { + m := &Merge{ + fileName: filename, + limit: limit, + } + m.open() + return m +} +func (m *Merge) WriteTitle(titles []interface{}) error { + if titles != nil { + m.titles = titles + } + if m.titles != nil { + return m.Write(m.titles) + } + return nil +} + +func (m *Merge) Write(values []interface{}) error { + + cell, err := excelize.CoordinatesToCellName(1, m.rowIndex+1) + if err != nil { + return err + } + err = m.sw.SetRow(cell, values) + if err != nil { + return err + } + + m.count() + return nil +} + +func (m *Merge) reset() (err error) { + if m.file != nil { + if err := m.Save(); err != nil { + return err + } + } + m.fileIndex++ + m.rowIndex = 0 + return m.open() +} + +func (m *Merge) count() { + m.total++ + m.rowIndex++ + if m.rowIndex > m.limit { + m.reset() + } +} + +func (m *Merge) open() (err error) { + m.file = excelize.NewFile() + m.sw, err = m.file.NewStreamWriter("Sheet1") + m.WriteTitle(nil) + return err +} + +func (m *Merge) Save() error { + //忽略只有标题的文件 + if m.titles != nil && m.rowIndex == 1 { + return nil + } + + if err := m.sw.Flush(); err != nil { + return err + } + + return m.file.SaveAs(m.getFileName()) +} + +func (m *Merge) getFileName() string { + ex := regexp.MustCompile("(\\..*)") + name := ex.ReplaceAllFunc([]byte(m.fileName), func(b []byte) []byte { + i := []byte("_" + strconv.Itoa(m.fileIndex)) + ret := make([]byte, len(b)+len(i)) + copy(ret, i) + copy(ret[len(i):], b) + return ret + }) + return string(name) +} diff --git a/cmd/cmd/merge_test.go b/cmd/cmd/merge_test.go new file mode 100644 index 0000000..87af7e6 --- /dev/null +++ b/cmd/cmd/merge_test.go @@ -0,0 +1,15 @@ +package cmd + +import "testing" + +func TestMerge_Write(t *testing.T) { + m := NewMerge("xx.xlsx", 2) + m.WriteTitle([]interface{}{"姓名", "年龄"}) + + m.Write([]interface{}{"张三", 12}) + m.Write([]interface{}{"李四", 14}) + m.Write([]interface{}{"王五", 15}) + m.Write([]interface{}{"王五", 15}) + + m.Save() +}