Skip to content

Commit

Permalink
Add 2 new functions: group_sheets and insert_page_break (#12)
Browse files Browse the repository at this point in the history
- Update unit tests
  • Loading branch information
tanz3 authored Feb 22, 2025
1 parent beb3d1f commit df5dc0e
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 1 deletion.
42 changes: 42 additions & 0 deletions excelize.py
Original file line number Diff line number Diff line change
Expand Up @@ -1792,6 +1792,25 @@ def get_workbook_props(self) -> Tuple[WorkbookPropsOptions, Optional[Exception]]
None if err == "" else Exception(err)
)

def group_sheets(self, sheets: List[str]) -> Optional[Exception]:
"""
Group worksheets by given worksheets name. Group worksheets must contain
an active worksheet.
Args:
sheets (List[str]): The worksheet names to be grouped.
Returns:
Optional[Exception]: Returns None if no error occurred,
otherwise returns an Exception with the message.
"""
lib.GroupSheets.restype = c_char_p
array = (c_char_p * len(sheets))()
for i, value in enumerate(sheets):
array[i] = value.encode(ENCODE)
err = lib.GroupSheets(self.file_index, array, c_int(len(sheets))).decode(ENCODE)
return None if err == "" else Exception(err)

def insert_cols(self, sheet: str, col: str, n: int) -> Optional[Exception]:
"""
Insert new columns before the given column name and number of columns.
Expand Down Expand Up @@ -1825,6 +1844,29 @@ def insert_cols(self, sheet: str, col: str, n: int) -> Optional[Exception]:
).decode(ENCODE)
return None if err == "" else Exception(err)

def insert_page_break(self, sheet: str, cell: str) -> Optional[Exception]:
"""
Create a page break to determine where the printed page ends and where
begins the next one by given worksheet name and cell reference, so the
content before the page break will be printed on one page and after the
page break on another.
Args:
sheet (str): The worksheet name
cell (str): The cell reference
Returns:
Optional[Exception]: Returns None if no error occurred,
otherwise returns an Exception with the message.
"""
lib.InsertPageBreak.restype = c_char_p
err = lib.InsertPageBreak(
self.file_index,
sheet.encode(ENCODE),
cell.encode(ENCODE),
).decode(ENCODE)
return None if err == "" else Exception(err)

def insert_rows(self, sheet: str, row: int, n: int) -> Optional[Exception]:
"""
Insert new rows after the given Excel row number starting from 1 and
Expand Down
36 changes: 36 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -1350,6 +1350,25 @@ func GetWorkbookProps(idx int) C.struct_GetWorkbookPropsResult {
return C.struct_GetWorkbookPropsResult{opts: cVal.Elem().Interface().(C.struct_WorkbookPropsOptions), err: C.CString(emptyString)}
}

// GroupSheets provides a function to group worksheets by given worksheets
// name. Group worksheets must contain an active worksheet.
//
//export GroupSheets
func GroupSheets(idx int, sheets **C.char, length int) *C.char {
f, ok := files.Load(idx)
if !ok {
return C.CString(errFilePtr)
}
array := make([]string, length)
for i, val := range unsafe.Slice(sheets, length) {
array[i] = C.GoString(val)
}
if err := f.(*excelize.File).GroupSheets(array); err != nil {
return C.CString(err.Error())
}
return C.CString(emptyString)
}

// InsertCols provides a function to insert new columns before the given column
// name and number of columns.
//
Expand All @@ -1365,6 +1384,23 @@ func InsertCols(idx int, sheet, col *C.char, n int) *C.char {
return C.CString(emptyString)
}

// InsertPageBreak create a page break to determine where the printed page
// ends and where begins the next one by given worksheet name and cell
// reference, so the content before the page break will be printed on one page
// and after the page break on another.
//
//export InsertPageBreak
func InsertPageBreak(idx int, sheet, cell *C.char) *C.char {
f, ok := files.Load(idx)
if !ok {
return C.CString(emptyString)
}
if err := f.(*excelize.File).InsertPageBreak(C.GoString(sheet), C.GoString(cell)); err != nil {
return C.CString(err.Error())
}
return C.CString(emptyString)
}

// InsertRows provides a function to insert new rows after the given Excel row
// number starting from 1 and number of rows.
//
Expand Down
43 changes: 42 additions & 1 deletion test_excelize.py
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,6 @@ def test_style(self):
)
self.assertIsNone(f.move_sheet("Sheet2", "Sheet1"))
self.assertIsNone(f.remove_col("Sheet1", "Z"))
self.assertIsNone(f.remove_page_break("Sheet1", "A1"))
self.assertIsNone(f.remove_row("Sheet1", 100))
self.assertIsNone(f.ungroup_sheets())
self.assertIsNone(f.update_linked_value())
Expand All @@ -406,6 +405,48 @@ def test_style(self):
_, err = excelize.open_reader(file.read(), excelize.Options(password=""))
self.assertEqual(str(err), "zip: not a valid zip file")

def test_group_sheets(self):
f = excelize.new_file()

sheets = ["Sheet2", "Sheet3"]
for sheet in sheets:
_, err = f.new_sheet(sheet)
self.assertIsNone(err)

self.assertEqual(
str(f.group_sheets(["Sheet1", "SheetN"])), "sheet SheetN does not exist"
)
self.assertEqual(
str(f.group_sheets(["Sheet2", "Sheet3"])),
"group worksheet must contain an active worksheet",
)
self.assertEqual(
str(f.group_sheets(["Sheet:1", "Sheet1"])),
"the sheet can not contain any of the characters :\\/?*[or]",
)
self.assertIsNone(f.group_sheets(["Sheet1", "Sheet2"]))

self.assertIsNone(f.save_as(os.path.join("test", "TestGroupSheets.xlsx")))
self.assertIsNone(f.close())

def test_page_break(self):
f = excelize.new_file()
self.assertIsNone(f.insert_page_break("Sheet1", "A1"))
self.assertIsNone(f.insert_page_break("Sheet1", "B2"))
self.assertEqual(
str(f.insert_page_break("Sheet1", "A")),
'cannot convert cell "A" to coordinates: invalid cell name "A"',
)
self.assertEqual(
str(f.insert_page_break("SheetN", "C3")), "sheet SheetN does not exist"
)
self.assertEqual(
str(f.insert_page_break("Sheet:1", "C3")),
"the sheet can not contain any of the characters :\\/?*[or]",
)
self.assertIsNone(f.remove_page_break("Sheet1", "A1"))
self.assertIsNone(f.save_as(os.path.join("test", "TestPageBreak.xlsx")))

def test_add_chart(self):
f = excelize.new_file()
for idx, row in enumerate(
Expand Down

0 comments on commit df5dc0e

Please sign in to comment.