Fix printing area and options
This commit is contained in:
@ -890,6 +890,102 @@ class SumasenExcel:
|
|||||||
logging.error(f"Error verifying merged cell borders: {str(e)}")
|
logging.error(f"Error verifying merged cell borders: {str(e)}")
|
||||||
return None
|
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):
|
def copy_template_to_current(self, orig_range, target_range):
|
||||||
@ -939,13 +1035,31 @@ class SumasenExcel:
|
|||||||
if self.template_sheet.print_area:
|
if self.template_sheet.print_area:
|
||||||
self.current_sheet.print_area = self.template_sheet.print_area
|
self.current_sheet.print_area = self.template_sheet.print_area
|
||||||
|
|
||||||
# 印刷タイトルの設定をコピー
|
# 印刷範囲の設定をコピーして調整
|
||||||
if self.template_sheet.print_title_rows:
|
if self.template_sheet.print_area:
|
||||||
self.current_sheet.print_title_rows = self.template_sheet.print_title_rows
|
# 最終データ行を取得
|
||||||
if self.template_sheet.print_title_cols:
|
last_data_row = self.get_last_data_row()
|
||||||
self.current_sheet.print_title_cols = self.template_sheet.print_title_cols
|
|
||||||
|
# 印刷範囲を調整
|
||||||
|
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
|
# Copy cell contents and styles
|
||||||
row_offset = target_min_row - orig_min_row
|
row_offset = target_min_row - orig_min_row
|
||||||
|
|||||||
Reference in New Issue
Block a user