|
5 | 5 | "encoding/xml"
|
6 | 6 | "fmt"
|
7 | 7 | "path/filepath"
|
| 8 | + "strconv" |
8 | 9 | "testing"
|
9 | 10 |
|
10 | 11 | "github.com/stretchr/testify/assert"
|
@@ -1157,6 +1158,66 @@ func TestNumberFormats(t *testing.T) {
|
1157 | 1158 | assert.Equal(t, "2019/3/19", result, "A1")
|
1158 | 1159 | }
|
1159 | 1160 |
|
| 1161 | +func TestCellXMLHandler(t *testing.T) { |
| 1162 | + var ( |
| 1163 | + content = []byte(fmt.Sprintf(`<worksheet xmlns="%s"><sheetData><row r="1"><c r="A1" t="s"><v>10</v></c><c r="B1"><is><t>String</t></is></c></row><row r="2"><c r="A2" s="4" t="str"><f>2*A1</f><v>0</v></c><c r="C2" s="1"><f>A3</f><v>2422.3000000000002</v></c><c r="D2" t="d"><v>2022-10-22T15:05:29Z</v></c><c r="F2"></c><c r="G2"></c></row></sheetData></worksheet>`, NameSpaceSpreadSheet.Value)) |
| 1164 | + expected, ws xlsxWorksheet |
| 1165 | + row *xlsxRow |
| 1166 | + ) |
| 1167 | + assert.NoError(t, xml.Unmarshal(content, &expected)) |
| 1168 | + decoder := xml.NewDecoder(bytes.NewReader(content)) |
| 1169 | + rows := Rows{decoder: decoder} |
| 1170 | + for { |
| 1171 | + token, _ := decoder.Token() |
| 1172 | + if token == nil { |
| 1173 | + break |
| 1174 | + } |
| 1175 | + switch element := token.(type) { |
| 1176 | + case xml.StartElement: |
| 1177 | + if element.Name.Local == "row" { |
| 1178 | + r, err := strconv.Atoi(element.Attr[0].Value) |
| 1179 | + assert.NoError(t, err) |
| 1180 | + ws.SheetData.Row = append(ws.SheetData.Row, xlsxRow{R: r}) |
| 1181 | + row = &ws.SheetData.Row[len(ws.SheetData.Row)-1] |
| 1182 | + } |
| 1183 | + if element.Name.Local == "c" { |
| 1184 | + colCell := xlsxC{} |
| 1185 | + assert.NoError(t, colCell.cellXMLHandler(rows.decoder, &element)) |
| 1186 | + row.C = append(row.C, colCell) |
| 1187 | + } |
| 1188 | + } |
| 1189 | + } |
| 1190 | + assert.Equal(t, expected.SheetData.Row, ws.SheetData.Row) |
| 1191 | + |
| 1192 | + for _, rowXML := range []string{ |
| 1193 | + `<row spans="1:17" r="1"><c r="A1" t="s" s="A"><v>10</v></c></row></sheetData></worksheet>`, // s need number |
| 1194 | + `<row spans="1:17" r="1"><c r="A1"><v>10</v> </row></sheetData></worksheet>`, // missing </c> |
| 1195 | + `<row spans="1:17" r="1"><c r="B1"><is><t>`, // incorrect data |
| 1196 | + } { |
| 1197 | + ws := xlsxWorksheet{} |
| 1198 | + content := []byte(fmt.Sprintf(`<worksheet xmlns="%s"><sheetData>%s</sheetData></worksheet>`, NameSpaceSpreadSheet.Value, rowXML)) |
| 1199 | + expected := xml.Unmarshal(content, &ws) |
| 1200 | + assert.Error(t, expected) |
| 1201 | + decoder := xml.NewDecoder(bytes.NewReader(content)) |
| 1202 | + rows := Rows{decoder: decoder} |
| 1203 | + for { |
| 1204 | + token, _ := decoder.Token() |
| 1205 | + if token == nil { |
| 1206 | + break |
| 1207 | + } |
| 1208 | + switch element := token.(type) { |
| 1209 | + case xml.StartElement: |
| 1210 | + if element.Name.Local == "c" { |
| 1211 | + colCell := xlsxC{} |
| 1212 | + err := colCell.cellXMLHandler(rows.decoder, &element) |
| 1213 | + assert.Error(t, err) |
| 1214 | + assert.Equal(t, expected, err) |
| 1215 | + } |
| 1216 | + } |
| 1217 | + } |
| 1218 | + } |
| 1219 | +} |
| 1220 | + |
1160 | 1221 | func BenchmarkRows(b *testing.B) {
|
1161 | 1222 | f, _ := OpenFile(filepath.Join("test", "Book1.xlsx"))
|
1162 | 1223 | for i := 0; i < b.N; i++ {
|
|
0 commit comments