149 lines
4.2 KiB
Python
149 lines
4.2 KiB
Python
# sumaexcel/page.py
|
|
from typing import Optional, Dict, Any, Union
|
|
from openpyxl.worksheet.worksheet import Worksheet
|
|
from openpyxl.worksheet.page import PageMargins, PrintPageSetup
|
|
|
|
# sumaexcel/page.py (continued)
|
|
|
|
class PageManager:
|
|
"""Handle page setup and header/footer settings"""
|
|
|
|
def __init__(self, worksheet: Worksheet):
|
|
self.worksheet = worksheet
|
|
|
|
def set_page_setup(
|
|
self,
|
|
orientation: str = 'portrait',
|
|
paper_size: int = 9, # A4
|
|
fit_to_height: Optional[int] = None,
|
|
fit_to_width: Optional[int] = None,
|
|
scale: Optional[int] = None
|
|
) -> None:
|
|
"""Configure page setup
|
|
|
|
Args:
|
|
orientation: 'portrait' or 'landscape'
|
|
paper_size: paper size (e.g., 9 for A4)
|
|
fit_to_height: number of pages tall
|
|
fit_to_width: number of pages wide
|
|
scale: zoom scale (1-400)
|
|
"""
|
|
setup = PrintPageSetup(
|
|
orientation=orientation,
|
|
paperSize=paper_size,
|
|
scale=scale,
|
|
fitToHeight=fit_to_height,
|
|
fitToWidth=fit_to_width
|
|
)
|
|
self.worksheet.page_setup = setup
|
|
|
|
def set_margins(
|
|
self,
|
|
left: float = 0.7,
|
|
right: float = 0.7,
|
|
top: float = 0.75,
|
|
bottom: float = 0.75,
|
|
header: float = 0.3,
|
|
footer: float = 0.3
|
|
) -> None:
|
|
"""Set page margins in inches"""
|
|
margins = PageMargins(
|
|
left=left,
|
|
right=right,
|
|
top=top,
|
|
bottom=bottom,
|
|
header=header,
|
|
footer=footer
|
|
)
|
|
self.worksheet.page_margins = margins
|
|
|
|
def set_header_footer(
|
|
self,
|
|
odd_header: Optional[str] = None,
|
|
odd_footer: Optional[str] = None,
|
|
even_header: Optional[str] = None,
|
|
even_footer: Optional[str] = None,
|
|
first_header: Optional[str] = None,
|
|
first_footer: Optional[str] = None,
|
|
different_first: bool = False,
|
|
different_odd_even: bool = False
|
|
) -> None:
|
|
"""Set headers and footers
|
|
|
|
Format codes:
|
|
- &P: Page number
|
|
- &N: Total pages
|
|
- &D: Date
|
|
- &T: Time
|
|
- &[Tab]: Sheet name
|
|
- &[Path]: File path
|
|
- &[File]: File name
|
|
- &[Tab]: Worksheet name
|
|
"""
|
|
self.worksheet.oddHeader.left = odd_header or ""
|
|
self.worksheet.oddFooter.left = odd_footer or ""
|
|
|
|
if different_odd_even:
|
|
self.worksheet.evenHeader.left = even_header or ""
|
|
self.worksheet.evenFooter.left = even_footer or ""
|
|
|
|
if different_first:
|
|
self.worksheet.firstHeader.left = first_header or ""
|
|
self.worksheet.firstFooter.left = first_footer or ""
|
|
|
|
self.worksheet.differentFirst = different_first
|
|
self.worksheet.differentOddEven = different_odd_even
|
|
|
|
def set_print_area(self, range_string: str) -> None:
|
|
"""Set print area
|
|
|
|
Args:
|
|
range_string: Cell range in A1 notation (e.g., 'A1:H42')
|
|
"""
|
|
self.worksheet.print_area = range_string
|
|
|
|
def set_print_title_rows(self, rows: str) -> None:
|
|
"""Set rows to repeat at top of each page
|
|
|
|
Args:
|
|
rows: Row range (e.g., '1:3')
|
|
"""
|
|
self.worksheet.print_title_rows = rows
|
|
|
|
def set_print_title_columns(self, cols: str) -> None:
|
|
"""Set columns to repeat at left of each page
|
|
|
|
Args:
|
|
cols: Column range (e.g., 'A:B')
|
|
"""
|
|
self.worksheet.print_title_cols = cols
|
|
|
|
def set_print_options(
|
|
self,
|
|
grid_lines: bool = False,
|
|
horizontal_centered: bool = False,
|
|
vertical_centered: bool = False,
|
|
headers: bool = False
|
|
) -> None:
|
|
"""Set print options"""
|
|
self.worksheet.print_gridlines = grid_lines
|
|
self.worksheet.print_options.horizontalCentered = horizontal_centered
|
|
self.worksheet.print_options.verticalCentered = vertical_centered
|
|
self.worksheet.print_options.headers = headers
|
|
|
|
class PaperSizes:
|
|
"""Standard paper size constants"""
|
|
LETTER = 1
|
|
LETTER_SMALL = 2
|
|
TABLOID = 3
|
|
LEDGER = 4
|
|
LEGAL = 5
|
|
STATEMENT = 6
|
|
EXECUTIVE = 7
|
|
A3 = 8
|
|
A4 = 9
|
|
A4_SMALL = 10
|
|
A5 = 11
|
|
B4 = 12
|
|
B5 = 13
|