Coverage for src/artemis_sg/foo.py: 0%
66 statements
« prev ^ index » next coverage.py v7.3.1, created at 2024-03-06 08:01 -0800
« prev ^ index » next coverage.py v7.3.1, created at 2024-03-06 08:01 -0800
1import math
2from copy import copy
4from openpyxl import load_workbook
5from openpyxl.utils import get_column_letter
6from openpyxl.worksheet.dimensions import ColumnDimension, DimensionHolder
8from artemis_sg.config import CFG
11def get_sheet_keys(ws):
12 for row in ws.values:
13 sheet_keys = [x.upper() if isinstance(x, str) else x for x in row]
14 break
15 return sheet_keys
17def shift_col(ws, col_key, target_idx):
18 ws.insert_cols(target_idx)
19 sheet_keys = get_sheet_keys(ws)
20 sheet_key_idx = sheet_keys.index(col_key) + 1 # for openpyxl
21 sheet_key_idx_ltr = get_column_letter(sheet_key_idx)
22 col_delta = target_idx - sheet_key_idx
23 ws.move_range(f"{sheet_key_idx_ltr}1:{sheet_key_idx_ltr}{ws.max_row}",
24 rows=0, cols=col_delta)
25 ws.delete_cols(sheet_key_idx)
27def copy_cell_style(ws, style_src_cell, target_cell):
28 if style_src_cell.has_style:
29 ws[target_cell].font = copy(style_src_cell.font)
30 ws[target_cell].border = copy(style_src_cell.border)
31 ws[target_cell].fill = copy(style_src_cell.fill)
32 ws[target_cell].number_format = copy(style_src_cell.number_format)
33 ws[target_cell].protection = copy(style_src_cell.protection)
34 ws[target_cell].alignment = copy(style_src_cell.alignment)
36def create_col(ws, col_key, target_idx, style_src_cell=None):
37 ws.insert_cols(target_idx)
38 col_header = f"{get_column_letter(target_idx)}1"
39 ws[col_header] = col_key
40 if style_src_cell:
41 copy_cell_style(ws, style_src_cell, col_header)
43def sequence_worksheet(ws, col_order):
44 sheet_keys = get_sheet_keys(ws)
45 for i, key_name in enumerate(col_order):
46 order_idx = i + 1 # for openpyxl
47 get_column_letter(order_idx)
48 if key_name == "ISBN":
49 key_name = isbn_key # noqa: PLW2901
50 if key_name in sheet_keys:
51 shift_col(ws, key_name, order_idx)
52 else:
53 create_col(ws, key_name, order_idx)
55def size_sheet_cols(ws):
56 dim_holder = DimensionHolder(worksheet=ws)
57 sheet_keys = get_sheet_keys(ws)
58 for i, key_name in enumerate(sheet_keys):
59 col_idx = i + 1 # for openpyxl
60 col_idx_ltr = get_column_letter(col_idx)
61 width = (
62 max(len(str(cell.value)) for cell in ws[col_idx_ltr])
63 * CFG["asg"]["spreadsheet"]["sheet_image"]["col_buffer"]
64 )
65 if width > CFG["asg"]["spreadsheet"]["sheet_image"]["max_col_width"]:
66 width = CFG["asg"]["spreadsheet"]["sheet_image"]["max_col_width"]
67 dim_holder[col_idx_ltr] = ColumnDimension(ws, index=col_idx_ltr, width=width)
68 if key_name == isbn_key:
69 dim_holder[col_idx_ltr] = ColumnDimension(
70 ws,
71 index=col_idx_ltr,
72 width=math.ceil(
73 CFG["asg"]["spreadsheet"]["sheet_image"]["isbn_col_width"]
74 * CFG["asg"]["spreadsheet"]["sheet_image"]["col_buffer"]
75 ),
76 )
77 if key_name == "IMAGE":
78 dim_holder[col_idx_ltr] = ColumnDimension(
79 ws,
80 index=col_idx_ltr,
81 width=CFG["asg"]["spreadsheet"]["sheet_image"]["image_col_width"]
82 )
84 ws.column_dimensions = dim_holder
87isbn_key = "ISBN-13"
88col_order = CFG["asg"]["spreadsheet"]["sheet_image"]["col_order"]
89workbook = "/home/john/Downloads/foo.xlsx"
91wb = load_workbook(workbook)
92ws = wb.worksheets[0]
94sequence_worksheet(ws, col_order)
95size_sheet_cols(ws)
96wb.save(workbook)