Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit df5dc0e

Browse files
authoredFeb 22, 2025··
Add 2 new functions: group_sheets and insert_page_break (#12)
- Update unit tests
1 parent beb3d1f commit df5dc0e

File tree

3 files changed

+120
-1
lines changed

3 files changed

+120
-1
lines changed
 

‎excelize.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,6 +1792,25 @@ def get_workbook_props(self) -> Tuple[WorkbookPropsOptions, Optional[Exception]]
17921792
None if err == "" else Exception(err)
17931793
)
17941794

1795+
def group_sheets(self, sheets: List[str]) -> Optional[Exception]:
1796+
"""
1797+
Group worksheets by given worksheets name. Group worksheets must contain
1798+
an active worksheet.
1799+
1800+
Args:
1801+
sheets (List[str]): The worksheet names to be grouped.
1802+
1803+
Returns:
1804+
Optional[Exception]: Returns None if no error occurred,
1805+
otherwise returns an Exception with the message.
1806+
"""
1807+
lib.GroupSheets.restype = c_char_p
1808+
array = (c_char_p * len(sheets))()
1809+
for i, value in enumerate(sheets):
1810+
array[i] = value.encode(ENCODE)
1811+
err = lib.GroupSheets(self.file_index, array, c_int(len(sheets))).decode(ENCODE)
1812+
return None if err == "" else Exception(err)
1813+
17951814
def insert_cols(self, sheet: str, col: str, n: int) -> Optional[Exception]:
17961815
"""
17971816
Insert new columns before the given column name and number of columns.
@@ -1825,6 +1844,29 @@ def insert_cols(self, sheet: str, col: str, n: int) -> Optional[Exception]:
18251844
).decode(ENCODE)
18261845
return None if err == "" else Exception(err)
18271846

1847+
def insert_page_break(self, sheet: str, cell: str) -> Optional[Exception]:
1848+
"""
1849+
Create a page break to determine where the printed page ends and where
1850+
begins the next one by given worksheet name and cell reference, so the
1851+
content before the page break will be printed on one page and after the
1852+
page break on another.
1853+
1854+
Args:
1855+
sheet (str): The worksheet name
1856+
cell (str): The cell reference
1857+
1858+
Returns:
1859+
Optional[Exception]: Returns None if no error occurred,
1860+
otherwise returns an Exception with the message.
1861+
"""
1862+
lib.InsertPageBreak.restype = c_char_p
1863+
err = lib.InsertPageBreak(
1864+
self.file_index,
1865+
sheet.encode(ENCODE),
1866+
cell.encode(ENCODE),
1867+
).decode(ENCODE)
1868+
return None if err == "" else Exception(err)
1869+
18281870
def insert_rows(self, sheet: str, row: int, n: int) -> Optional[Exception]:
18291871
"""
18301872
Insert new rows after the given Excel row number starting from 1 and

‎main.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,25 @@ func GetWorkbookProps(idx int) C.struct_GetWorkbookPropsResult {
13501350
return C.struct_GetWorkbookPropsResult{opts: cVal.Elem().Interface().(C.struct_WorkbookPropsOptions), err: C.CString(emptyString)}
13511351
}
13521352

1353+
// GroupSheets provides a function to group worksheets by given worksheets
1354+
// name. Group worksheets must contain an active worksheet.
1355+
//
1356+
//export GroupSheets
1357+
func GroupSheets(idx int, sheets **C.char, length int) *C.char {
1358+
f, ok := files.Load(idx)
1359+
if !ok {
1360+
return C.CString(errFilePtr)
1361+
}
1362+
array := make([]string, length)
1363+
for i, val := range unsafe.Slice(sheets, length) {
1364+
array[i] = C.GoString(val)
1365+
}
1366+
if err := f.(*excelize.File).GroupSheets(array); err != nil {
1367+
return C.CString(err.Error())
1368+
}
1369+
return C.CString(emptyString)
1370+
}
1371+
13531372
// InsertCols provides a function to insert new columns before the given column
13541373
// name and number of columns.
13551374
//
@@ -1365,6 +1384,23 @@ func InsertCols(idx int, sheet, col *C.char, n int) *C.char {
13651384
return C.CString(emptyString)
13661385
}
13671386

1387+
// InsertPageBreak create a page break to determine where the printed page
1388+
// ends and where begins the next one by given worksheet name and cell
1389+
// reference, so the content before the page break will be printed on one page
1390+
// and after the page break on another.
1391+
//
1392+
//export InsertPageBreak
1393+
func InsertPageBreak(idx int, sheet, cell *C.char) *C.char {
1394+
f, ok := files.Load(idx)
1395+
if !ok {
1396+
return C.CString(emptyString)
1397+
}
1398+
if err := f.(*excelize.File).InsertPageBreak(C.GoString(sheet), C.GoString(cell)); err != nil {
1399+
return C.CString(err.Error())
1400+
}
1401+
return C.CString(emptyString)
1402+
}
1403+
13681404
// InsertRows provides a function to insert new rows after the given Excel row
13691405
// number starting from 1 and number of rows.
13701406
//

‎test_excelize.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,6 @@ def test_style(self):
389389
)
390390
self.assertIsNone(f.move_sheet("Sheet2", "Sheet1"))
391391
self.assertIsNone(f.remove_col("Sheet1", "Z"))
392-
self.assertIsNone(f.remove_page_break("Sheet1", "A1"))
393392
self.assertIsNone(f.remove_row("Sheet1", 100))
394393
self.assertIsNone(f.ungroup_sheets())
395394
self.assertIsNone(f.update_linked_value())
@@ -406,6 +405,48 @@ def test_style(self):
406405
_, err = excelize.open_reader(file.read(), excelize.Options(password=""))
407406
self.assertEqual(str(err), "zip: not a valid zip file")
408407

408+
def test_group_sheets(self):
409+
f = excelize.new_file()
410+
411+
sheets = ["Sheet2", "Sheet3"]
412+
for sheet in sheets:
413+
_, err = f.new_sheet(sheet)
414+
self.assertIsNone(err)
415+
416+
self.assertEqual(
417+
str(f.group_sheets(["Sheet1", "SheetN"])), "sheet SheetN does not exist"
418+
)
419+
self.assertEqual(
420+
str(f.group_sheets(["Sheet2", "Sheet3"])),
421+
"group worksheet must contain an active worksheet",
422+
)
423+
self.assertEqual(
424+
str(f.group_sheets(["Sheet:1", "Sheet1"])),
425+
"the sheet can not contain any of the characters :\\/?*[or]",
426+
)
427+
self.assertIsNone(f.group_sheets(["Sheet1", "Sheet2"]))
428+
429+
self.assertIsNone(f.save_as(os.path.join("test", "TestGroupSheets.xlsx")))
430+
self.assertIsNone(f.close())
431+
432+
def test_page_break(self):
433+
f = excelize.new_file()
434+
self.assertIsNone(f.insert_page_break("Sheet1", "A1"))
435+
self.assertIsNone(f.insert_page_break("Sheet1", "B2"))
436+
self.assertEqual(
437+
str(f.insert_page_break("Sheet1", "A")),
438+
'cannot convert cell "A" to coordinates: invalid cell name "A"',
439+
)
440+
self.assertEqual(
441+
str(f.insert_page_break("SheetN", "C3")), "sheet SheetN does not exist"
442+
)
443+
self.assertEqual(
444+
str(f.insert_page_break("Sheet:1", "C3")),
445+
"the sheet can not contain any of the characters :\\/?*[or]",
446+
)
447+
self.assertIsNone(f.remove_page_break("Sheet1", "A1"))
448+
self.assertIsNone(f.save_as(os.path.join("test", "TestPageBreak.xlsx")))
449+
409450
def test_add_chart(self):
410451
f = excelize.new_file()
411452
for idx, row in enumerate(

0 commit comments

Comments
 (0)
Please sign in to comment.