From 768dd6e2617808aa212081c044a5a64fb922e77b Mon Sep 17 00:00:00 2001 From: hayano Date: Wed, 6 Nov 2024 09:17:30 +0000 Subject: [PATCH] Generate Excel stage-2 --- .../excel_lib/sumaexcel/.sumaexcel.py.swp | Bin 0 -> 45056 bytes SumasenLibs/excel_lib/sumaexcel/sumaexcel.py | 66 ++++++++++++------ .../excel_lib/testdata/certificate_5033.xlsx | Bin 6294 -> 6625 bytes .../testdata/~$certificate_template.xlsx | Bin 165 -> 0 bytes 4 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 SumasenLibs/excel_lib/sumaexcel/.sumaexcel.py.swp delete mode 100644 SumasenLibs/excel_lib/testdata/~$certificate_template.xlsx diff --git a/SumasenLibs/excel_lib/sumaexcel/.sumaexcel.py.swp b/SumasenLibs/excel_lib/sumaexcel/.sumaexcel.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..d9fd27f3a8bf2135535a23158010b715f7d885b2 GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py b/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py index 9ac7c9d..c12154f 100644 --- a/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py +++ b/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py @@ -410,8 +410,11 @@ class SumasenExcel: print(f"orig_rage={orig_range},target_range={target_range}") # 範囲をパースする - min_col, min_row, max_col, max_row = range_boundaries(orig_range) - print(f"min_col, min_row, max_col, max_row = {min_col}, {min_row}, {max_col}, {max_row}") + orig_min_col, orig_min_row, orig_max_col, orig_max_row = range_boundaries(orig_range) + target_min_col, target_min_row, target_max_col, target_max_row = range_boundaries(target_range) + print(f"min_col, min_row, max_col, max_row = {orig_min_col}, {orig_min_row}, {orig_max_col}, {orig_max_row}") + + print(f"min_col, min_row, max_col, max_row = {target_min_col}, {target_min_row}, {target_max_col}, {target_max_row}") # 新しいシートを作成(必要な場合) if 'Sheet' not in self.workbook.sheetnames: @@ -462,34 +465,53 @@ class SumasenExcel: target_page_setup = self.current_sheet.page_setup source_page_setup = self.template_sheet.page_setup - # Copy all page setup attributes - target_page_setup.paperSize = source_page_setup.paperSize - target_page_setup.orientation = source_page_setup.orientation - target_page_setup.fitToHeight = source_page_setup.fitToHeight - target_page_setup.fitToWidth = source_page_setup.fitToWidth - target_page_setup.zoom = source_page_setup.zoom - target_page_setup.scale = source_page_setup.scale + # Copy supported page setup attributes + copyable_attrs = [ + 'paperSize', + 'orientation', + 'fitToHeight', + 'fitToWidth', + 'scale' + ] + + for attr in copyable_attrs: + try: + if hasattr(source_page_setup, attr): + setattr(target_page_setup, attr, getattr(source_page_setup, attr)) + except Exception as e: + logging.warning(f"Could not copy page setup attribute {attr}: {str(e)}") + # Copy margins target_margins = self.current_sheet.page_margins source_margins = self.template_sheet.page_margins - - target_margins.left = source_margins.left - target_margins.right = source_margins.right - target_margins.top = source_margins.top - target_margins.bottom = source_margins.bottom - target_margins.header = source_margins.header - target_margins.footer = source_margins.footer + + margin_attrs = ['left', 'right', 'top', 'bottom', 'header', 'footer'] + for attr in margin_attrs: + try: + if hasattr(source_margins, attr): + setattr(target_margins, attr, getattr(source_margins, attr)) + except Exception as e: + logging.warning(f"Could not copy margin attribute {attr}: {str(e)}") # Copy print options target_print = self.current_sheet.print_options source_print = self.template_sheet.print_options - - target_print.horizontalCentered = source_print.horizontalCentered - target_print.verticalCentered = source_print.verticalCentered - target_print.gridLines = source_print.gridLines - target_print.gridLinesSet = source_print.gridLinesSet - + + print_attrs = [ + 'horizontalCentered', + 'verticalCentered', + 'gridLines', + 'gridLinesSet' + ] + + for attr in print_attrs: + try: + if hasattr(source_print, attr): + setattr(target_print, attr, getattr(source_print, attr)) + except Exception as e: + logging.warning(f"Could not copy print option {attr}: {str(e)}") + return {"status": True, "message": "Successfully copied template range"} except Exception as e: diff --git a/SumasenLibs/excel_lib/testdata/certificate_5033.xlsx b/SumasenLibs/excel_lib/testdata/certificate_5033.xlsx index e852aa6eafe776996139943e7518f07f52ea757e..f021d27d45ecc7a332ae728413f2a904741dd747 100644 GIT binary patch delta 2899 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 diff --git a/SumasenLibs/excel_lib/testdata/~$certificate_template.xlsx b/SumasenLibs/excel_lib/testdata/~$certificate_template.xlsx deleted file mode 100644 index 52abcffbccd9a04a06f2b02e94aadf62824b7593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 xcmd<_&8$o;NmOvm&MZn)AR6#6_%dWNR5BzolmM{;gCj#WkY5C5D**Y_g#Zl86LSCn