合并csv
This commit is contained in:
parent
d7ffa97576
commit
e43f4cb3fa
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
Loading…
Reference in New Issue