-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexcel_builder.go
51 lines (45 loc) · 1.21 KB
/
excel_builder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package peanut
import (
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
// TODO(js) Excel has a limit on number of rows. Perhaps write should return an error when/after we reach capacity?
type excelBuilder struct {
xlsx *excelize.File
sw *excelize.StreamWriter
row int // TODO Expose this? we can report number of rows written (to be wary of Excel's row-limit)
filename string
}
func newExcelBuilder(filename string) (*excelBuilder, error) {
xlsx := excelize.NewFile()
xlsx.SetPanes("Sheet1", `{"freeze":true,"split":false,"x_split":0,"y_split":1,"top_left_cell":"A2","active_pane":"bottomLeft","panes":[{"sqref":"A2","active_cell":"A2","pane":"bottomLeft"}]}`)
sw, err := xlsx.NewStreamWriter("Sheet1")
if err != nil {
return nil, err
}
e := excelBuilder{
xlsx: xlsx,
sw: sw,
row: 1,
filename: filename,
}
return &e, nil
}
func (e *excelBuilder) AddRow(data ...interface{}) error {
c, err := excelize.CoordinatesToCellName(1, e.row)
if err != nil {
return err
}
err = e.sw.SetRow(c, data)
if err != nil {
return err
}
e.row++
return nil
}
func (e *excelBuilder) Save() error {
err := e.sw.Flush()
if err != nil {
return err
}
return e.xlsx.SaveAs(e.filename)
}