forked from shakinm/xlsReader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
xls.go
107 lines (76 loc) · 1.68 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
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
package xls
import (
"encoding/binary"
"github.com/stevenlawton/xlsReader/cfb"
"io"
)
// OpenFile - Open document from the file
func OpenFile(fileName string) (workbook Workbook, err error) {
adaptor, err := cfb.OpenFile(fileName)
defer adaptor.CloseFile()
if err != nil {
return workbook, err
}
return openCfb(adaptor)
}
// OpenReader - Open document from the file reader
func OpenReader(fileReader io.ReadSeeker) (workbook Workbook, err error) {
adaptor, err := cfb.OpenReader(fileReader)
if err != nil {
return workbook, err
}
return openCfb(adaptor)
}
// OpenFile - Open document from the file
func openCfb(adaptor cfb.Cfb) (workbook Workbook, err error) {
var book *cfb.Directory
var root *cfb.Directory
for _, dir := range adaptor.GetDirs() {
fn := dir.Name()
if fn == "Workbook" {
if book == nil {
book = dir
}
}
if fn == "Book" {
book = dir
}
if fn == "Root Entry" {
root = dir
}
}
if book != nil {
size := binary.LittleEndian.Uint32(book.StreamSize[:])
reader, err := adaptor.OpenObject(book, root)
if err != nil {
return workbook, err
}
return readStream(reader, size)
}
return workbook, err
}
func readStream(reader io.ReadSeeker, streamSize uint32) (workbook Workbook, err error) {
stream := make([]byte, streamSize)
_, err = reader.Read(stream)
if err != nil {
return workbook, nil
}
if err != nil {
return workbook, nil
}
err = workbook.read(stream)
if err != nil {
return workbook, nil
}
for k := range workbook.sheets {
sheet, err := workbook.GetSheet(k)
if err != nil {
return workbook, nil
}
err = sheet.read(stream)
if err != nil {
return workbook, nil
}
}
return
}