Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add 2 new functions: group_sheets and insert_page_break #12

Merged
merged 2 commits into from
Feb 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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