Skip to content

Commit aa80fa4

Browse files
authoredNov 15, 2022
This made stream writer support set the insert page break (qax-os#1393)
1 parent 45d168c commit aa80fa4

File tree

4 files changed

+69
-30
lines changed

4 files changed

+69
-30
lines changed
 

‎sheet.go

+18-12
Original file line numberDiff line numberDiff line change
@@ -1616,19 +1616,25 @@ func (f *File) UngroupSheets() error {
16161616
}
16171617

16181618
// InsertPageBreak create a page break to determine where the printed page
1619-
// ends and where begins the next one by given worksheet name and cell reference, so the
1620-
// content before the page break will be printed on one page and after the
1621-
// page break on another.
1619+
// ends and where begins the next one by given worksheet name and cell
1620+
// reference, so the content before the page break will be printed on one page
1621+
// and after the page break on another.
16221622
func (f *File) InsertPageBreak(sheet, cell string) error {
1623-
var (
1624-
ws *xlsxWorksheet
1625-
row, col int
1626-
err error
1627-
)
1628-
rowBrk, colBrk := -1, -1
1629-
if ws, err = f.workSheetReader(sheet); err != nil {
1623+
ws, err := f.workSheetReader(sheet)
1624+
if err != nil {
16301625
return err
16311626
}
1627+
return ws.insertPageBreak(cell)
1628+
}
1629+
1630+
// insertPageBreak create a page break in the worksheet by specific cell
1631+
// reference.
1632+
func (ws *xlsxWorksheet) insertPageBreak(cell string) error {
1633+
var (
1634+
row, col int
1635+
err error
1636+
rowBrk, colBrk = -1, -1
1637+
)
16321638
if col, row, err = CellNameToCoordinates(cell); err != nil {
16331639
return err
16341640
}
@@ -1638,10 +1644,10 @@ func (f *File) InsertPageBreak(sheet, cell string) error {
16381644
return err
16391645
}
16401646
if ws.RowBreaks == nil {
1641-
ws.RowBreaks = &xlsxBreaks{}
1647+
ws.RowBreaks = &xlsxRowBreaks{}
16421648
}
16431649
if ws.ColBreaks == nil {
1644-
ws.ColBreaks = &xlsxBreaks{}
1650+
ws.ColBreaks = &xlsxColBreaks{}
16451651
}
16461652

16471653
for idx, brk := range ws.RowBreaks.Brk {

‎stream.go

+24-16
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525

2626
// StreamWriter defined the type of stream writer.
2727
type StreamWriter struct {
28-
File *File
28+
file *File
2929
Sheet string
3030
SheetID int
3131
sheetWritten bool
@@ -107,7 +107,7 @@ func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error) {
107107
return nil, newNoExistSheetError(sheet)
108108
}
109109
sw := &StreamWriter{
110-
File: f,
110+
file: f,
111111
Sheet: sheet,
112112
SheetID: sheetID,
113113
}
@@ -169,7 +169,7 @@ func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error {
169169
}
170170

171171
// Correct table reference range, such correct C1:B3 to B1:C3.
172-
ref, err := sw.File.coordinatesToRangeRef(coordinates)
172+
ref, err := sw.file.coordinatesToRangeRef(coordinates)
173173
if err != nil {
174174
return err
175175
}
@@ -187,7 +187,7 @@ func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error {
187187
}
188188
}
189189

190-
tableID := sw.File.countTables() + 1
190+
tableID := sw.file.countTables() + 1
191191

192192
name := options.TableName
193193
if name == "" {
@@ -220,17 +220,17 @@ func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error {
220220
tableXML := strings.ReplaceAll(sheetRelationshipsTableXML, "..", "xl")
221221

222222
// Add first table for given sheet.
223-
sheetPath := sw.File.sheetMap[trimSheetName(sw.Sheet)]
223+
sheetPath := sw.file.sheetMap[trimSheetName(sw.Sheet)]
224224
sheetRels := "xl/worksheets/_rels/" + strings.TrimPrefix(sheetPath, "xl/worksheets/") + ".rels"
225-
rID := sw.File.addRels(sheetRels, SourceRelationshipTable, sheetRelationshipsTableXML, "")
225+
rID := sw.file.addRels(sheetRels, SourceRelationshipTable, sheetRelationshipsTableXML, "")
226226

227227
sw.tableParts = fmt.Sprintf(`<tableParts count="1"><tablePart r:id="rId%d"></tablePart></tableParts>`, rID)
228228

229-
if err = sw.File.addContentTypePart(tableID, "table"); err != nil {
229+
if err = sw.file.addContentTypePart(tableID, "table"); err != nil {
230230
return err
231231
}
232232
b, _ := xml.Marshal(table)
233-
sw.File.saveFileList(tableXML, b)
233+
sw.file.saveFileList(tableXML, b)
234234
return err
235235
}
236236

@@ -243,7 +243,7 @@ func (sw *StreamWriter) getRowValues(hRow, hCol, vCol int) (res []string, err er
243243
return nil, err
244244
}
245245

246-
dec := sw.File.xmlNewDecoder(r)
246+
dec := sw.file.xmlNewDecoder(r)
247247
for {
248248
token, err := dec.Token()
249249
if err == io.EOF {
@@ -269,7 +269,7 @@ func (sw *StreamWriter) getRowValues(hRow, hCol, vCol int) (res []string, err er
269269
if col < hCol || col > vCol {
270270
continue
271271
}
272-
res[col-hCol], _ = c.getValueFrom(sw.File, nil, false)
272+
res[col-hCol], _ = c.getValueFrom(sw.file, nil, false)
273273
}
274274
return res, nil
275275
}
@@ -438,6 +438,14 @@ func (sw *StreamWriter) SetColWidth(min, max int, width float64) error {
438438
return nil
439439
}
440440

441+
// InsertPageBreak create a page break to determine where the printed page
442+
// ends and where begins the next one by given worksheet name and cell
443+
// reference, so the content before the page break will be printed on one page
444+
// and after the page break on another.
445+
func (sw *StreamWriter) InsertPageBreak(cell string) error {
446+
return sw.worksheet.insertPageBreak(cell)
447+
}
448+
441449
// SetPanes provides a function to create and remove freeze panes and split
442450
// panes by given worksheet name and panes options for the StreamWriter. Note
443451
// that you must call the 'SetPanes' function before the 'SetRow' function.
@@ -475,15 +483,15 @@ func setCellFormula(c *xlsxC, formula string) {
475483
// setCellTime provides a function to set number of a cell with a time.
476484
func (sw *StreamWriter) setCellTime(c *xlsxC, val time.Time) error {
477485
var date1904, isNum bool
478-
wb, err := sw.File.workbookReader()
486+
wb, err := sw.file.workbookReader()
479487
if err != nil {
480488
return err
481489
}
482490
if wb != nil && wb.WorkbookPr != nil {
483491
date1904 = wb.WorkbookPr.Date1904
484492
}
485493
if isNum, err = c.setCellTime(val, date1904); err == nil && isNum && c.S == 0 {
486-
style, _ := sw.File.NewStyle(&Style{NumFmt: 22})
494+
style, _ := sw.file.NewStyle(&Style{NumFmt: 22})
487495
c.S = style
488496
}
489497
return nil
@@ -643,10 +651,10 @@ func (sw *StreamWriter) Flush() error {
643651
return err
644652
}
645653

646-
sheetPath := sw.File.sheetMap[trimSheetName(sw.Sheet)]
647-
sw.File.Sheet.Delete(sheetPath)
648-
delete(sw.File.checked, sheetPath)
649-
sw.File.Pkg.Delete(sheetPath)
654+
sheetPath := sw.file.sheetMap[trimSheetName(sw.Sheet)]
655+
sw.file.Sheet.Delete(sheetPath)
656+
delete(sw.file.checked, sheetPath)
657+
sw.file.Pkg.Delete(sheetPath)
650658

651659
return nil
652660
}

‎stream_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,19 @@ func TestStreamMergeCells(t *testing.T) {
234234
assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamMergeCells.xlsx")))
235235
}
236236

237+
func TestStreamInsertPageBreak(t *testing.T) {
238+
file := NewFile()
239+
defer func() {
240+
assert.NoError(t, file.Close())
241+
}()
242+
streamWriter, err := file.NewStreamWriter("Sheet1")
243+
assert.NoError(t, err)
244+
assert.NoError(t, streamWriter.InsertPageBreak("A1"))
245+
assert.NoError(t, streamWriter.Flush())
246+
// Save spreadsheet by the given path.
247+
assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamInsertPageBreak.xlsx")))
248+
}
249+
237250
func TestNewStreamWriter(t *testing.T) {
238251
// Test error exceptions
239252
file := NewFile()

‎xmlWorksheet.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ type xlsxWorksheet struct {
4444
PageMargins *xlsxPageMargins `xml:"pageMargins"`
4545
PageSetUp *xlsxPageSetUp `xml:"pageSetup"`
4646
HeaderFooter *xlsxHeaderFooter `xml:"headerFooter"`
47-
RowBreaks *xlsxBreaks `xml:"rowBreaks"`
48-
ColBreaks *xlsxBreaks `xml:"colBreaks"`
47+
RowBreaks *xlsxRowBreaks `xml:"rowBreaks"`
48+
ColBreaks *xlsxColBreaks `xml:"colBreaks"`
4949
CustomProperties *xlsxInnerXML `xml:"customProperties"`
5050
CellWatches *xlsxInnerXML `xml:"cellWatches"`
5151
IgnoredErrors *xlsxInnerXML `xml:"ignoredErrors"`
@@ -358,6 +358,18 @@ type xlsxBrk struct {
358358
Pt bool `xml:"pt,attr,omitempty"`
359359
}
360360

361+
// xlsxRowBreaks directly maps a collection of the row breaks.
362+
type xlsxRowBreaks struct {
363+
XMLName xml.Name `xml:"rowBreaks"`
364+
xlsxBreaks
365+
}
366+
367+
// xlsxRowBreaks directly maps a collection of the column breaks.
368+
type xlsxColBreaks struct {
369+
XMLName xml.Name `xml:"colBreaks"`
370+
xlsxBreaks
371+
}
372+
361373
// xlsxBreaks directly maps a collection of the row or column breaks.
362374
type xlsxBreaks struct {
363375
Brk []*xlsxBrk `xml:"brk"`

0 commit comments

Comments
 (0)