dotfiles/VSCodium/User/History/-2f7fe65f/PUIi.py
2026-06-19 14:29:55 +02:00

110 lines
3.5 KiB
Python

#!/usr/bin/env python3
"""
Script to extract data from Production Order (mrp.production).xlsx and populate
the template A4004_v3.0-260617.ods, saving the result as a new ODS file named after
cell A2 from the source file.
Dependencies:
- openpyxl
- ezodf
Install with:
pip install openpyxl ezodf
"""
import sys
from openpyxl import load_workbook
from openpyxl.utils import column_index_from_string
import ezodf
def find_fa_suffix(ws):
"""Find the suffix after 'FA-' in column B and return it."""
for row in ws.iter_rows(min_col=2, max_col=2, values_only=False):
cell = row[0]
if isinstance(cell.value, str) and "FA-" in cell.value:
parts = cell.value.split("FA-")
if len(parts) > 1:
return parts[1].strip()
return None
def find_value_to_right(ws, search_str):
"""Find a cell containing `search_str` and return the value of the cell to its right."""
for row in ws.iter_rows(values_only=False):
for cell in row:
if isinstance(cell.value, str) and search_str in cell.value:
# Get cell to the right (next column)
right_cell = ws.cell(row=cell.row, column=cell.column + 1)
return right_cell.value
return None
def fill_range(sheet, start, end, value):
"""Fill a rectangular range (inclusive) with `value`."""
start_col = column_index_from_string(start[:1]) - 1
start_row = int(start[1:]) - 1
end_col = column_index_from_string(end[:1]) - 1
end_row = int(end[1:]) - 1
for r in range(start_row, end_row + 1):
for c in range(start_col, end_col + 1):
sheet[r, c].set_value(value)
def main():
source_file = "Production Order (mrp.production).xlsx"
template_file = "A4004_v3.0-260617.ods"
# Load source workbook
try:
src_wb = load_workbook(source_file, data_only=True)
except Exception as e:
sys.exit(f"Failed to load source file '{source_file}': {e}")
src_ws = src_wb.active
# Extract values
fa_suffix = find_fa_suffix(src_ws)
if fa_suffix is None:
sys.exit("FA- suffix not found in column B of source file.")
# Mapping of search strings to target ranges in the template
mappings = {
"All / Components / Barebone": ("C10", "D10"),
"All / Components / GPU": ("C20", "D23"),
"All / Components / RAM": ("C12", "D19"),
"All / Components / CPU": ("C11", "D11"),
"All / Components / SSD": ("C24", "D25"),
"All / Components / RAID": ("C27", "D27"),
}
# Load template ODS
try:
doc = ezodf.opendoc(template_file)
except Exception as e:
sys.exit(f"Failed to load template file '{template_file}': {e}")
sheet = doc.sheets[0]
# Fill FA- suffix into B1:C2
fill_range(sheet, "B1", "C2", fa_suffix)
# Fill other values
for search_str, (start_cell, end_cell) in mappings.items():
value = find_value_to_right(src_ws, search_str)
if value is None:
sys.exit(f"Value for '{search_str}' not found in source file.")
fill_range(sheet, start_cell, end_cell, value)
# Determine output filename from cell A2
output_name_raw = src_ws["A2"].value
if output_name_raw is None:
sys.exit("Cell A2 is empty; cannot determine output filename.")
output_name = f"{output_name_raw}.ods"
# Save new file
try:
doc.saveas(output_name)
except Exception as e:
sys.exit(f"Failed to save output file '{output_name}': {e}")