Skip to content

Commit 0b5dc32

Browse files
authored
This closes qax-os#2212, add new function SetColOutlineLevel for streaming writer to support group columns (qax-os#2181)
- Breaking changes: remove 4 exported error variables ErrStreamSetColVisible, ErrStreamSetColStyle, ErrStreamSetColWidth and ErrStreamSetPanes - Update unit tests
1 parent 04f6d6c commit 0b5dc32

4 files changed

Lines changed: 67 additions & 26 deletions

File tree

col.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -390,21 +390,28 @@ func (f *File) SetColOutlineLevel(sheet, col string, level uint8) error {
390390
if err != nil {
391391
return err
392392
}
393+
ws, err := f.workSheetReader(sheet)
394+
if err != nil {
395+
return err
396+
}
397+
ws.setColOutlineLevel(colNum, level)
398+
return err
399+
}
400+
401+
// setColOutlineLevel provides a function to set the outline level of a single
402+
// column by given column number.
403+
func (ws *xlsxWorksheet) setColOutlineLevel(colNum int, level uint8) {
393404
colData := xlsxCol{
394405
Min: colNum,
395406
Max: colNum,
396407
OutlineLevel: level,
397408
CustomWidth: true,
398409
}
399-
ws, err := f.workSheetReader(sheet)
400-
if err != nil {
401-
return err
402-
}
403410
if ws.Cols == nil {
404411
cols := xlsxCols{}
405412
cols.Col = append(cols.Col, colData)
406413
ws.Cols = &cols
407-
return err
414+
return
408415
}
409416
ws.Cols.Col = flatCols(colData, ws.Cols.Col, func(fc, c xlsxCol) xlsxCol {
410417
fc.BestFit = c.BestFit
@@ -416,7 +423,6 @@ func (f *File) SetColOutlineLevel(sheet, col string, level uint8) error {
416423
fc.Width = c.Width
417424
return fc
418425
})
419-
return err
420426
}
421427

422428
// SetColStyle provides a function to set style of columns by given worksheet

errors.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,6 @@ var (
136136
// ErrSparklineType defined the error message on receive the invalid
137137
// sparkline Type parameters.
138138
ErrSparklineType = errors.New("parameter 'Type' value must be one of 'line', 'column' or 'win_loss'")
139-
// ErrStreamSetColVisible defined the error message on set columns
140-
// visibility in stream writing mode.
141-
ErrStreamSetColVisible = errors.New("must call the SetColVisible function before the SetRow function")
142-
// ErrStreamSetColStyle defined the error message on set column style in
143-
// stream writing mode.
144-
ErrStreamSetColStyle = errors.New("must call the SetColStyle function before the SetRow function")
145-
// ErrStreamSetColWidth defined the error message on set column width in
146-
// stream writing mode.
147-
ErrStreamSetColWidth = errors.New("must call the SetColWidth function before the SetRow function")
148-
// ErrStreamSetPanes defined the error message on set panes in stream
149-
// writing mode.
150-
ErrStreamSetPanes = errors.New("must call the SetPanes function before the SetRow function")
151139
// ErrTotalSheetHyperlinks defined the error message on hyperlinks count
152140
// overflow.
153141
ErrTotalSheetHyperlinks = errors.New("over maximum limit hyperlinks in a worksheet")
@@ -328,6 +316,12 @@ func newStreamSetRowError(row int) error {
328316
return fmt.Errorf("row %d has already been written", row)
329317
}
330318

319+
// newStreamSetRowOrderError defined the error message on calling the SetRow
320+
// function before the order function.
321+
func newStreamSetRowOrderError(name string) error {
322+
return fmt.Errorf("must call the %s function before the SetRow function", name)
323+
}
324+
331325
// newUnknownFilterTokenError defined the error message on receiving a unknown
332326
// filter operator token.
333327
func newUnknownFilterTokenError(token string) error {

stream.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ func (sw *StreamWriter) SetRow(cell string, values []interface{}, opts ...RowOpt
448448
// err := sw.SetColVisible(4, 6, false)
449449
func (sw *StreamWriter) SetColVisible(minVal, maxVal int, visible bool) error {
450450
if sw.sheetWritten {
451-
return ErrStreamSetColVisible
451+
return newStreamSetRowOrderError("SetColVisible")
452452
}
453453
if minVal < MinColumns || minVal > MaxColumns || maxVal < MinColumns || maxVal > MaxColumns {
454454
return ErrColumnNumber
@@ -460,6 +460,25 @@ func (sw *StreamWriter) SetColVisible(minVal, maxVal int, visible bool) error {
460460
return nil
461461
}
462462

463+
// SetColOutlineLevel provides a function to set outline level of a single
464+
// column for the StreamWriter. The value of parameter 'level' is 1-7. For
465+
// example, set outline level of column D in Sheet1 to 2:
466+
//
467+
// err := sw.SetColOutlineLevel(4, 2)
468+
func (sw *StreamWriter) SetColOutlineLevel(col int, level uint8) error {
469+
if sw.sheetWritten {
470+
return newStreamSetRowOrderError("SetColOutlineLevel")
471+
}
472+
if col < MinColumns || col > MaxColumns {
473+
return ErrColumnNumber
474+
}
475+
if level > 7 || level < 1 {
476+
return ErrOutlineLevel
477+
}
478+
sw.worksheet.setColOutlineLevel(col, level)
479+
return nil
480+
}
481+
463482
// SetColStyle provides a function to set the style of a single column or
464483
// multiple columns for the StreamWriter. Note that you must call
465484
// the 'SetColStyle' function before the 'SetRow' function. For example set
@@ -468,7 +487,7 @@ func (sw *StreamWriter) SetColVisible(minVal, maxVal int, visible bool) error {
468487
// err := sw.SetColStyle(8, 8, style)
469488
func (sw *StreamWriter) SetColStyle(minVal, maxVal, styleID int) error {
470489
if sw.sheetWritten {
471-
return ErrStreamSetColStyle
490+
return newStreamSetRowOrderError("SetColStyle")
472491
}
473492
if minVal < MinColumns || minVal > MaxColumns || maxVal < MinColumns || maxVal > MaxColumns {
474493
return ErrColumnNumber
@@ -495,7 +514,7 @@ func (sw *StreamWriter) SetColStyle(minVal, maxVal, styleID int) error {
495514
// err := sw.SetColWidth(2, 3, 20)
496515
func (sw *StreamWriter) SetColWidth(minVal, maxVal int, width float64) error {
497516
if sw.sheetWritten {
498-
return ErrStreamSetColWidth
517+
return newStreamSetRowOrderError("SetColWidth")
499518
}
500519
if minVal < MinColumns || minVal > MaxColumns || maxVal < MinColumns || maxVal > MaxColumns {
501520
return ErrColumnNumber
@@ -523,7 +542,7 @@ func (sw *StreamWriter) InsertPageBreak(cell string) error {
523542
// the 'SetPanes' function before the 'SetRow' function.
524543
func (sw *StreamWriter) SetPanes(panes *Panes) error {
525544
if sw.sheetWritten {
526-
return ErrStreamSetPanes
545+
return newStreamSetRowOrderError("SetPanes")
527546
}
528547
return sw.worksheet.setPanes(panes)
529548
}
@@ -710,6 +729,11 @@ func (sw *StreamWriter) writeSheetData() {
710729
if col.Hidden {
711730
sw.rawData.WriteString(` hidden="1"`)
712731
}
732+
if col.OutlineLevel > 0 {
733+
sw.rawData.WriteString(` outlineLevel="`)
734+
sw.rawData.WriteString(strconv.FormatUint(uint64(col.OutlineLevel), 10))
735+
sw.rawData.WriteString(`"`)
736+
}
713737
sw.rawData.WriteString(`/>`)
714738
}
715739
_, _ = sw.rawData.WriteString("</cols>")

stream_test.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,24 @@ func TestStreamSetColVisible(t *testing.T) {
165165
assert.Equal(t, ErrColumnNumber, streamWriter.SetColVisible(0, 3, false))
166166
assert.Equal(t, ErrColumnNumber, streamWriter.SetColVisible(MaxColumns+1, 3, false))
167167
assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
168-
assert.Equal(t, ErrStreamSetColVisible, streamWriter.SetColVisible(2, 3, false))
168+
assert.Equal(t, newStreamSetRowOrderError("SetColVisible"), streamWriter.SetColVisible(2, 3, false))
169+
assert.NoError(t, streamWriter.Flush())
170+
}
171+
172+
func TestStreamSetColOutlineLevel(t *testing.T) {
173+
file := NewFile()
174+
defer func() {
175+
assert.NoError(t, file.Close())
176+
}()
177+
streamWriter, err := file.NewStreamWriter("Sheet1")
178+
assert.NoError(t, err)
179+
assert.NoError(t, streamWriter.SetColOutlineLevel(4, 2))
180+
assert.Equal(t, ErrOutlineLevel, streamWriter.SetColOutlineLevel(4, 0))
181+
assert.Equal(t, ErrOutlineLevel, streamWriter.SetColOutlineLevel(4, 8))
182+
assert.Equal(t, ErrColumnNumber, streamWriter.SetColOutlineLevel(0, 2))
183+
assert.Equal(t, ErrColumnNumber, streamWriter.SetColOutlineLevel(MaxColumns+1, 2))
184+
assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
185+
assert.Equal(t, newStreamSetRowOrderError("SetColOutlineLevel"), streamWriter.SetColOutlineLevel(4, 2))
169186
assert.NoError(t, streamWriter.Flush())
170187
}
171188

@@ -181,7 +198,7 @@ func TestStreamSetColStyle(t *testing.T) {
181198
assert.Equal(t, ErrColumnNumber, streamWriter.SetColStyle(MaxColumns+1, 3, 20))
182199
assert.Equal(t, newInvalidStyleID(2), streamWriter.SetColStyle(1, 3, 2))
183200
assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
184-
assert.Equal(t, ErrStreamSetColStyle, streamWriter.SetColStyle(2, 3, 0))
201+
assert.Equal(t, newStreamSetRowOrderError("SetColStyle"), streamWriter.SetColStyle(2, 3, 0))
185202

186203
file = NewFile()
187204
defer func() {
@@ -214,7 +231,7 @@ func TestStreamSetColWidth(t *testing.T) {
214231
assert.Equal(t, ErrColumnNumber, streamWriter.SetColWidth(MaxColumns+1, 3, 20))
215232
assert.Equal(t, ErrColumnWidth, streamWriter.SetColWidth(1, 3, MaxColumnWidth+1))
216233
assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
217-
assert.Equal(t, ErrStreamSetColWidth, streamWriter.SetColWidth(2, 3, 20))
234+
assert.Equal(t, newStreamSetRowOrderError("SetColWidth"), streamWriter.SetColWidth(2, 3, 20))
218235
assert.NoError(t, streamWriter.Flush())
219236
}
220237

@@ -238,7 +255,7 @@ func TestStreamSetPanes(t *testing.T) {
238255
assert.NoError(t, streamWriter.SetPanes(paneOpts))
239256
assert.Equal(t, ErrParameterInvalid, streamWriter.SetPanes(nil))
240257
assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
241-
assert.Equal(t, ErrStreamSetPanes, streamWriter.SetPanes(paneOpts))
258+
assert.Equal(t, newStreamSetRowOrderError("SetPanes"), streamWriter.SetPanes(paneOpts))
242259
}
243260

244261
func TestStreamTable(t *testing.T) {

0 commit comments

Comments
 (0)