Skip to content

Commit 023dba7

Browse files
committed
Fix qax-os#576, serialize by fields order on stream flush
1 parent e51aff2 commit 023dba7

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

CODE_OF_CONDUCT.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
4040

4141
## Attribution
4242

43-
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
43+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at [https://www.contributor-covenant.org/version/2/0/code_of_conduct][version]
4444

45-
[homepage]: http://contributor-covenant.org
46-
[version]: http://contributor-covenant.org/version/1/4/
45+
[homepage]: https://www.contributor-covenant.org
46+
[version]: https://www.contributor-covenant.org/version/2/0/code_of_conduct

stream.go

+12-17
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type StreamWriter struct {
2727
File *File
2828
Sheet string
2929
SheetID int
30+
worksheet *xlsxWorksheet
3031
rawData bufferedWriter
3132
tableParts string
3233
}
@@ -77,15 +78,15 @@ func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error) {
7778
Sheet: sheet,
7879
SheetID: sheetID,
7980
}
80-
81-
ws, err := f.workSheetReader(sheet)
81+
var err error
82+
sw.worksheet, err = f.workSheetReader(sheet)
8283
if err != nil {
8384
return nil, err
8485
}
8586
sw.rawData.WriteString(XMLHeader + `<worksheet` + templateNamespaceIDMap)
86-
bulkAppendOtherFields(&sw.rawData, ws, "XMLName", "SheetData", "TableParts")
87+
bulkAppendFields(&sw.rawData, sw.worksheet, 1, 5)
8788
sw.rawData.WriteString(`<sheetData>`)
88-
return sw, nil
89+
return sw, err
8990
}
9091

9192
// AddTable creates an Excel table for the StreamWriter using the given
@@ -373,7 +374,9 @@ func writeCell(buf *bufferedWriter, c xlsxC) {
373374
// Flush ending the streaming writing process.
374375
func (sw *StreamWriter) Flush() error {
375376
sw.rawData.WriteString(`</sheetData>`)
377+
bulkAppendFields(&sw.rawData, sw.worksheet, 7, 37)
376378
sw.rawData.WriteString(sw.tableParts)
379+
bulkAppendFields(&sw.rawData, sw.worksheet, 39, 39)
377380
sw.rawData.WriteString(`</worksheet>`)
378381
if err := sw.rawData.Flush(); err != nil {
379382
return err
@@ -392,23 +395,15 @@ func (sw *StreamWriter) Flush() error {
392395
return nil
393396
}
394397

395-
// bulkAppendOtherFields bulk-appends fields in a worksheet, skipping the
396-
// specified field names.
397-
func bulkAppendOtherFields(w io.Writer, ws *xlsxWorksheet, skip ...string) {
398-
skipMap := make(map[string]struct{})
399-
for _, name := range skip {
400-
skipMap[name] = struct{}{}
401-
}
402-
398+
// bulkAppendFields bulk-appends fields in a worksheet by specified field
399+
// names order range.
400+
func bulkAppendFields(w io.Writer, ws *xlsxWorksheet, from, to int) {
403401
s := reflect.ValueOf(ws).Elem()
404-
typeOfT := s.Type()
405402
enc := xml.NewEncoder(w)
406403
for i := 0; i < s.NumField(); i++ {
407-
f := s.Field(i)
408-
if _, ok := skipMap[typeOfT.Field(i).Name]; ok {
409-
continue
404+
if from <= i && i <= to {
405+
enc.Encode(s.Field(i).Interface())
410406
}
411-
enc.Encode(f.Interface())
412407
}
413408
}
414409

stream_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ func TestStreamWriter(t *testing.T) {
9292
_, err = streamWriter.rawData.Reader()
9393
assert.NoError(t, err)
9494
assert.NoError(t, os.Remove(streamWriter.rawData.tmp.Name()))
95+
96+
// Test unsupport charset
97+
file = NewFile()
98+
delete(file.Sheet, "xl/worksheets/sheet1.xml")
99+
file.XLSX["xl/worksheets/sheet1.xml"] = MacintoshCyrillicCharset
100+
streamWriter, err = file.NewStreamWriter("Sheet1")
101+
assert.EqualError(t, err, "xml decode error: XML syntax error on line 1: invalid UTF-8")
95102
}
96103

97104
func TestStreamTable(t *testing.T) {

0 commit comments

Comments
 (0)