Skip to content

Commit 54ef0d5

Browse files
authored
Merge pull request #4 from alicebob/reallynodep
really no deps
2 parents 065f48d + 30ed7af commit 54ef0d5

File tree

6 files changed

+217
-102
lines changed

6 files changed

+217
-102
lines changed

bench_test.go renamed to bench_test.nogo

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// file has a weird filename to avoid dragging in a go.mod dependency
12
package streamxlsx_test
23

34
import (

go.mod

-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
11
module github.com/alicebob/streamxlsx
22

33
go 1.14
4-
5-
require (
6-
github.com/stretchr/testify v1.5.1
7-
github.com/tealeg/xlsx/v2 v2.0.1
8-
)

go.sum

-23
Original file line numberDiff line numberDiff line change
@@ -1,23 +0,0 @@
1-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
2-
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3-
github.com/frankban/quicktest v1.5.0 h1:Tb4jWdSpdjKzTUicPnY61PZxKbDoGa7ABbrReT3gQVY=
4-
github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o=
5-
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
6-
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7-
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
8-
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
9-
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
10-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
11-
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
12-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
13-
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
14-
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
15-
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
16-
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
17-
github.com/tealeg/xlsx/v2 v2.0.1 h1:RP+VEscpPFjH2FnpKh1p9HVLAk1htqb9Urcxi2AU1ns=
18-
github.com/tealeg/xlsx/v2 v2.0.1/go.mod h1:l9GvhCCjdaIGkAyZcFedDALcYcXUOei55f6umRMOz9c=
19-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
20-
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
21-
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
22-
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
23-
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

readxlsx.go

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package streamxlsx
2+
3+
import (
4+
"archive/zip"
5+
"bytes"
6+
"encoding/xml"
7+
"errors"
8+
"fmt"
9+
)
10+
11+
// TestFile is used to test the package.
12+
// It doesn't implement a full reader.
13+
type TestFile struct {
14+
Sheets []TestSheet
15+
}
16+
17+
type TestSheet struct {
18+
Name string
19+
Cells []TestCell
20+
}
21+
22+
type TestCell struct {
23+
Ref string
24+
Type string
25+
Value string
26+
Style int
27+
}
28+
29+
func TestParse(b []byte) (*TestFile, error) {
30+
z, err := zip.NewReader(bytes.NewReader(b), int64(len(b)))
31+
if err != nil {
32+
return nil, err
33+
}
34+
35+
file := TestFile{}
36+
37+
var rels relationshipsXML
38+
if err := readXML(z, "xl/_rels/workbook.xml.rels", &rels); err != nil {
39+
return nil, err
40+
}
41+
var workbook workbookXML
42+
if err := readXML(z, "xl/workbook.xml", &workbook); err != nil {
43+
return nil, err
44+
}
45+
46+
for i, sheet := range workbook.Sheets {
47+
s, err := readSheet(z, i+1, sheet.Name)
48+
if err != nil {
49+
return nil, err
50+
}
51+
file.Sheets = append(file.Sheets, *s)
52+
}
53+
54+
return &file, nil
55+
}
56+
57+
func readSheet(z *zip.Reader, id int, name string) (*TestSheet, error) {
58+
var s worksheetXML
59+
if err := readXML(z, fmt.Sprintf("xl/worksheets/sheet%d.xml", id), &s); err != nil {
60+
return nil, err
61+
}
62+
var cells []TestCell
63+
for _, row := range s.Rows {
64+
for _, cell := range row.Cells {
65+
v := cell.Value
66+
if cell.InlineString != nil {
67+
v = *cell.InlineString
68+
}
69+
style := 0
70+
if cell.Style != nil {
71+
style = *cell.Style
72+
}
73+
cells = append(cells, TestCell{
74+
Ref: cell.Ref,
75+
Type: cell.Type,
76+
Value: v,
77+
Style: style,
78+
})
79+
}
80+
}
81+
return &TestSheet{
82+
Name: name,
83+
Cells: cells,
84+
}, nil
85+
}
86+
87+
func readXML(z *zip.Reader, filename string, dest interface{}) error {
88+
for _, f := range z.File {
89+
if f.Name == filename {
90+
fh, err := f.Open()
91+
if err != nil {
92+
return err
93+
}
94+
return xml.NewDecoder(fh).Decode(dest)
95+
}
96+
}
97+
return errors.New("file not found")
98+
}

sheet_test.go

+26-21
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,35 @@ package streamxlsx
22

33
import (
44
"testing"
5-
6-
"github.com/stretchr/testify/assert"
75
)
86

97
func TestAsRef(t *testing.T) {
10-
assert.Equal(t, "A1", AsRef(0, 0))
11-
assert.Equal(t, "B1", AsRef(1, 0))
12-
assert.Equal(t, "C1", AsRef(2, 0))
13-
assert.Equal(t, "A2", AsRef(0, 1))
14-
assert.Equal(t, "B2", AsRef(1, 1))
15-
assert.Equal(t, "C2", AsRef(2, 1))
16-
assert.Equal(t, "Z1", AsRef(25, 0))
17-
assert.Equal(t, "AA1", AsRef(1*26, 0))
18-
assert.Equal(t, "AZ1", AsRef(1*26+25, 0))
19-
assert.Equal(t, "BA1", AsRef(2*26, 0))
20-
assert.Equal(t, "ZA1", AsRef(26*26, 0))
21-
assert.Equal(t, "ZZ1", AsRef(26*26+25, 0))
8+
mustEq(t, "A1", AsRef(0, 0))
9+
mustEq(t, "B1", AsRef(1, 0))
10+
mustEq(t, "C1", AsRef(2, 0))
11+
mustEq(t, "A2", AsRef(0, 1))
12+
mustEq(t, "B2", AsRef(1, 1))
13+
mustEq(t, "C2", AsRef(2, 1))
14+
mustEq(t, "Z1", AsRef(25, 0))
15+
mustEq(t, "AA1", AsRef(1*26, 0))
16+
mustEq(t, "AZ1", AsRef(1*26+25, 0))
17+
mustEq(t, "BA1", AsRef(2*26, 0))
18+
mustEq(t, "ZA1", AsRef(26*26, 0))
19+
mustEq(t, "ZZ1", AsRef(26*26+25, 0))
20+
21+
mustEq(t, "A9", AsRef(0, 8))
22+
mustEq(t, "A10", AsRef(0, 9))
23+
mustEq(t, "AA10", AsRef(26, 9))
2224

23-
assert.Equal(t, "A9", AsRef(0, 8))
24-
assert.Equal(t, "A10", AsRef(0, 9))
25-
assert.Equal(t, "AA10", AsRef(26, 9))
25+
mustEq(t, "AAA1", AsRef(27*26, 0))
26+
mustEq(t, "AAB1", AsRef(27*26+1, 0))
27+
mustEq(t, "AAZ1", AsRef(27*26+25, 0))
28+
mustEq(t, "ABA1", AsRef(27*26+26, 0))
29+
}
2630

27-
assert.Equal(t, "AAA1", AsRef(27*26, 0))
28-
assert.Equal(t, "AAB1", AsRef(27*26+1, 0))
29-
assert.Equal(t, "AAZ1", AsRef(27*26+25, 0))
30-
assert.Equal(t, "ABA1", AsRef(27*26+26, 0))
31+
func mustEq(t *testing.T, want, have string) {
32+
t.Helper()
33+
if have != want {
34+
t.Fatalf("have %q, want %q", have, want)
35+
}
3136
}

0 commit comments

Comments
 (0)