Fix printing area and options

This commit is contained in:
2024-11-11 00:59:53 +09:00
parent 9e3a940ec2
commit 5e2b5add5c

View File

@ -890,6 +890,102 @@ class SumasenExcel:
logging.error(f"Error verifying merged cell borders: {str(e)}")
return None
def copy_print_scaling_settings(self, source_sheet, target_sheet):
"""
印刷の拡大縮小設定を正確にコピーする
Args:
source_sheet: コピー元のワークシート
target_sheet: コピー先のワークシート
"""
try:
source_setup = source_sheet.page_setup
target_setup = target_sheet.page_setup
# fitToPage の設定をコピー
target_setup.fitToPage = source_setup.fitToPage
if source_setup.fitToPage:
# 「次のページに合わせる」が選択されている場合
target_setup.fitToWidth = source_setup.fitToWidth # ページ(横)の設定
target_setup.fitToHeight = source_setup.fitToHeight # ページ(縦)の設定
# scale をクリア(%指定をオフに)
target_setup.scale = None
else:
# 拡大縮小率が指定されている場合
target_setup.scale = source_setup.scale
# fitTo* をクリア
target_setup.fitToWidth = None
target_setup.fitToHeight = None
logging.info(f"Print scaling settings copied - fitToPage: {target_setup.fitToPage}, "
f"fitToWidth: {target_setup.fitToWidth}, "
f"fitToHeight: {target_setup.fitToHeight}, "
f"scale: {target_setup.scale}")
except Exception as e:
logging.error(f"Error copying print scaling settings: {str(e)}")
raise
def adjust_print_area(self, source_print_area: str, last_data_row: int) -> str:
"""
印刷範囲を最終データ行まで拡張する
Args:
source_print_area: 元の印刷範囲(例: 'A1:H45'
last_data_row: 最終データ行番号
Returns:
str: 調整後の印刷範囲
"""
try:
if not source_print_area:
return None
# 印刷範囲の解析
# 例: $A$1:$H$45 -> ['$A$1', '$H$45']
range_parts = source_print_area.split(':')
if len(range_parts) != 2:
logging.warning(f"Unexpected print area format: {source_print_area}")
return source_print_area
# 開始セルと終了セルを取得
start_ref, end_ref = range_parts
# 列と行の参照を分離
# 例: $A$1 -> ($A, 1)
start_col = ''.join(c for c in start_ref if c.isalpha() or c == '$')
end_col = ''.join(c for c in end_ref if c.isalpha() or c == '$')
# 新しい印刷範囲を構築(最終行を更新)
new_print_area = f"{start_ref}:{end_col}{last_data_row}"
logging.info(f"Print area adjusted from {source_print_area} to {new_print_area}")
return new_print_area
except Exception as e:
logging.error(f"Error adjusting print area: {str(e)}")
return source_print_area
def get_last_data_row(self) -> int:
"""
ワークシートの最終データ行を取得する
Returns:
int: 最終データ行の番号
"""
try:
last_row = 1
for row in self.current_sheet.iter_rows():
for cell in row:
if cell.value is not None:
last_row = max(last_row, cell.row)
return last_row
except Exception as e:
logging.error(f"Error getting last data row: {str(e)}")
return 1
def copy_template_to_current(self, orig_range, target_range):
@ -939,12 +1035,30 @@ class SumasenExcel:
if self.template_sheet.print_area:
self.current_sheet.print_area = self.template_sheet.print_area
# 印刷タイトルの設定をコピー
if self.template_sheet.print_title_rows:
self.current_sheet.print_title_rows = self.template_sheet.print_title_rows
if self.template_sheet.print_title_cols:
self.current_sheet.print_title_cols = self.template_sheet.print_title_cols
# 印刷範囲の設定をコピーして調整
if self.template_sheet.print_area:
# 最終データ行を取得
last_data_row = self.get_last_data_row()
# 印刷範囲を調整
adjusted_print_area = self.adjust_print_area(
self.template_sheet.print_area,
last_data_row
)
if adjusted_print_area:
self.current_sheet.print_area = adjusted_print_area
logging.info(f"Print area set to: {adjusted_print_area}")
# 印刷タイトルの設定をコピー
if self.template_sheet.print_title_rows:
self.current_sheet.print_title_rows = self.template_sheet.print_title_rows
if self.template_sheet.print_title_cols:
self.current_sheet.print_title_cols = self.template_sheet.print_title_cols
# 拡大縮小印刷の設定を正確にコピー
self.copy_print_scaling_settings(self.template_sheet, self.current_sheet)
# Copy cell contents and styles