合并csv

This commit is contained in:
Mr.Li 2023-04-21 13:38:17 +08:00
parent d7ffa97576
commit e43f4cb3fa
3 changed files with 119 additions and 1 deletions

View File

@ -162,7 +162,7 @@ func (e *Csv) mergeCsvToExcel(path string, max int) error {
begin := time.Now() begin := time.Now()
f := excelize.NewFile() f := excelize.NewFile()
defer func() { 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 { if err := f.Close(); err != nil {
log.Println(err) log.Println(err)
} }

103
cmd/cmd/merge.go Normal file
View File

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

15
cmd/cmd/merge_test.go Normal file
View File

@ -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()
}