diff --git a/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py b/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py index 25e96e9..74bbea1 100644 --- a/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py +++ b/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py @@ -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,13 +1035,31 @@ 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 row_offset = target_min_row - orig_min_row