#!/usr/bin/env python3 # -*- coding: utf-8 -*- from pathlib import Path import time import fdb import pandas as pd from openpyxl import load_workbook from openpyxl.worksheet.table import Table, TableStyleInfo from openpyxl.styles import Font, PatternFill, Alignment from openpyxl.utils import get_column_letter # ================== Výstupní cesta ================== BASE_DIR = Path(r"..") # uprav dle potřeby timestamp = time.strftime("%Y-%m-%d %H-%M-%S") xlsx_name = f"Laboratoře {timestamp}.xlsx" xlsx_path = BASE_DIR / xlsx_name # ================== Připojení k DB ================== con = fdb.connect( host='192.168.1.4', database=r'z:\\MEDICUS 3\\data\\medicus.FDB', user='sysdba', password='masterkey', charset='WIN1250' ) # ================== SQL dotaz ================== # Pozn.: CAST(ockzaz.datum AS DATE) pro přesné párování na lecd.datose (DATE). sql = """ select labvh.idpacient, kar.rodcis, upper(KAR.PRIJMENI) || ', ' || KAR.JMENO AS JMENO_CELE, labvh.datum, labvd.idvh, labvd.poradi, labvd.idmetod, labmetod.nazev, labvd.vysl, labvd.idhodn, labhodn.zkr, labvd.idjedn, labjedn.jedn, labvd.TYP from labvd join labvh on labvh.idvh=labvd.idvh join labmetod on labvd.idmetod=labmetod.idmetod join labjedn on labjedn.idjedn=labvd.idjedn join labhodn on labvd.idhodn=labhodn.idhodn join kar on kar.idpac=labvh.idpacient where EXTRACT(YEAR FROM labvh.datum)=2025 order by labvh.datum, kar.rodcis, labvd.poradi """ #and nazev containing 'chřipka' # ================== Načtení do DataFrame ================== df = pd.read_sql(sql, con) con.close() # Textové sloupce jako string for col in ["idpacient", "datum", "idvh", "poradi", "idmetod", "vysl", "idhodn", "idjedn","typ"]: if col in df.columns: df[col] = df[col].astype("string") # Převod dat na datetime for dcol in ["datum", "Expirace"]: if dcol in df.columns: df[dcol] = pd.to_datetime(df[dcol], errors="coerce") # ================== Uložení do Excelu ================== with pd.ExcelWriter(xlsx_path, engine="openpyxl") as writer: df.to_excel(writer, index=False, sheet_name="Laboratoře") # ================== Formátování ================== wb = load_workbook(xlsx_path) def hide_columns(ws, column_names): """Hide columns in Excel by header name (case-insensitive).""" header = [str(c.value).strip().upper() if c.value else "" for c in ws[1]] for name in column_names: if name.strip().upper() in header: col_idx = header.index(name.strip().upper()) + 1 col_letter = get_column_letter(col_idx) ws.column_dimensions[col_letter].hidden = True def center_columns(ws, column_names): """Center-align given columns (case-insensitive header match).""" header_values = [str(c.value).strip().upper() if c.value else "" for c in ws[1]] index_map = {h: i + 1 for i, h in enumerate(header_values)} for name in column_names: idx = index_map.get(name.strip().upper()) if not idx: continue # Center the header cell ws.cell(row=1, column=idx).alignment = Alignment(horizontal="center", vertical="center") # Center all data cells in the column for row in ws.iter_rows(min_row=2, min_col=idx, max_col=idx, max_row=ws.max_row): row[0].alignment = Alignment(horizontal="center", vertical="center") def autosize_columns(ws): for col_idx in range(1, ws.max_column + 1): col_letter = get_column_letter(col_idx) max_len = 0 for cell in ws[col_letter]: val = "" if cell.value is None else str(cell.value) if len(val) > max_len: max_len = len(val) ws.column_dimensions[col_letter].width = min(max(12, max_len + 2), 60) def style_table(ws, table_name: str): max_row = ws.max_row max_col = ws.max_column if max_col == 0: return # Hlavička vzhled header_fill = PatternFill("solid", fgColor="D9E1F2") for cell in ws[1]: cell.font = Font(bold=True) cell.fill = header_fill cell.alignment = Alignment(vertical="center") # Freeze top row ws.freeze_panes = "A2" # Tabulka jen pokud jsou data if max_row < 2: autosize_columns(ws) return ref = f"A1:{get_column_letter(max_col)}{max_row}" tbl = Table(displayName=table_name, ref=ref) tbl.tableStyleInfo = TableStyleInfo( name="TableStyleMedium9", showRowStripes=True, showColumnStripes=False ) ws.add_table(tbl) autosize_columns(ws) def format_dates(ws, columns_names): header = [c.value for c in ws[1]] date_cols = [header.index(name) + 1 for name in columns_names if name in header] for col_idx in date_cols: for row in ws.iter_rows(min_row=2, min_col=col_idx, max_col=col_idx, max_row=ws.max_row): row[0].number_format = "DD.MM.YYYY" ws_main = wb["Laboratoře"] style_table(ws_main, "Laboratoře") format_dates(ws_main, ["datum", "Expirace"]) center_columns(ws_main, ["ZKR","JEDN","idpacient", "datum", "idvh", "poradi", "idmetod", "vysl", "idhodn", "idjedn","typ"]) hide_columns(ws_main, ["IDVH", "IDMETOD", "IDJEDN", "IDHODN", "TYP","IDPACIENT","PORADI"]) wb.save(xlsx_path) print(f"Hotovo. Uloženo do: {xlsx_path.resolve()}")