forked from extrame/xls
/
xls.go
80 lines (68 loc) · 1.47 KB
/
xls.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
package xls
import (
"bytes"
"errors"
"io"
"io/ioutil"
"os"
"github.com/extrame/ole2"
)
// Open open one xls file with some charset
func Open(file string, charset string) (*WorkBook, error) {
fi, err := os.Open(file)
if err != nil {
return nil, err
}
return OpenReader(fi, charset)
}
// OpenWithBuffer open one xls file with memory buffer
func OpenWithBuffer(file string, charset string) (*WorkBook, error) {
fi, err := ioutil.ReadFile(file)
if err != nil {
return nil, err
}
return OpenReader(bytes.NewReader(fi), charset)
}
// OpenWithCloser open one xls file and return the closer
func OpenWithCloser(file string, charset string) (*WorkBook, io.Closer, error) {
fi, err := os.Open(file)
if err != nil {
return nil, nil, err
}
wb, err := OpenReader(fi, charset)
if err != nil {
return nil, nil, err
}
return wb, fi, nil
}
// OpenReader open xls file from reader
func OpenReader(reader io.ReadSeeker, charset string) (wb *WorkBook, err error) {
ole, err := ole2.Open(reader, charset)
if err != nil {
return nil, err
}
dir, err := ole.ListDir()
if err != nil {
return nil, err
}
var book *ole2.File
var root *ole2.File
for _, file := range dir {
name := file.Name()
if name == "Workbook" {
book = file
// break
}
if name == "Book" {
book = file
// break
}
if name == "Root Entry" {
root = file
}
}
if book != nil {
return newWorkBookFromOle2(ole.OpenFile(book, root)), nil
}
return nil, errors.New("book not found")
}