forked from davyxu/tabtoy
/
tab_xlsx.go
132 lines (97 loc) · 2.09 KB
/
tab_xlsx.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package helper
import (
"github.com/davyxu/tabtoy/util"
"github.com/tealeg/xlsx"
"strings"
)
type XlsxFile struct {
file *xlsx.File
sheets []TableSheet
cacheDir string
}
func (self *XlsxFile) Sheets() (ret []TableSheet) {
return self.sheets
}
func (self *XlsxFile) Save(filename string) error {
return self.file.Save(filename)
}
func (self *XlsxFile) Load(filename string) (err error) {
var file *xlsx.File
if self.cacheDir == "" {
file, err = xlsx.OpenFile(filename)
if err != nil {
return err
}
} else {
cache := util.NewTableCache(filename, self.cacheDir)
if err = cache.Open(); err != nil {
return err
}
if file, err = cache.Load(); err != nil {
return err
} else {
if !cache.UseCache() {
cache.Save()
}
}
}
self.FromXFile(file)
return nil
}
func (self *XlsxFile) FromXFile(file *xlsx.File) {
self.file = file
for _, sheet := range file.Sheets {
self.sheets = append(self.sheets, newXlsxSheet(sheet))
}
}
func NewXlsxFile(cacheDir string) TableFile {
self := &XlsxFile{
cacheDir: cacheDir,
}
return self
}
type XlsxSheet struct {
*xlsx.Sheet
}
func (self *XlsxSheet) Name() string {
return self.Sheet.Name
}
func (self *XlsxSheet) MaxColumn() int {
return self.Sheet.MaxCol
}
func (self *XlsxSheet) IsRowEmpty(row, maxCol int) bool {
if maxCol == -1 {
maxCol = self.Sheet.MaxCol
}
for col := 0; col < maxCol; col++ {
data := self.GetValue(row, col, nil)
if data != "" {
return false
}
}
return true
}
func (self *XlsxSheet) GetValue(row, col int, opt *ValueOption) (ret string) {
c := self.Sheet.Cell(row, col)
// 浮点数单元格按原样输出
if opt != nil && opt.ValueAsFloat {
ret, _ = c.GeneralNumeric()
ret = strings.TrimSpace(ret)
} else {
// 取列头所在列和当前行交叉的单元格
ret = strings.TrimSpace(c.Value)
}
return
}
func (self *XlsxSheet) WriteRow(valueList ...string) {
row := self.Sheet.AddRow()
for _, value := range valueList {
cell := row.AddCell()
cell.SetValue(value)
}
}
func newXlsxSheet(sheet *xlsx.Sheet) TableSheet {
return &XlsxSheet{
Sheet: sheet,
}
}