#!/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"{timestamp} Davky report.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' ) #Toto je dotaz na řádky DohladH pro rok 2025 sql = """ SELECT idhlav, poj, icz, cisdokl, rodcis, hdgn, leciva, porcis, davka, oprav, rok, typ from DOKLADH where rok=2025 order by idhlav desc; """ #A toto je dotaz na řádky DohladD (details) pro rok 2025 sql2="""select id, idhlav, rodcis, datose, kod, pocvyk, ddgn, body,uct,zprac from dokladd where extract(year from datose)=2025 order by idhlav desc""" # ================== Načtení do DataFrame ================== df = pd.read_sql(sql, con) df2= pd.read_sql(sql2, con) con.close() # Textové sloupce jako string for col in ["Kód MZ", "Šarže", "Rodné číslo", "Látka", "Název", "Příjmení", "Jméno", "LECD kódy","Výkony"]: if col in df.columns: df[col] = df[col].astype("string") # Převod dat na datetime for dcol in ["Datum očkování", "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="DávkyHeader") df2.to_excel(writer, index=False, sheet_name="DávkyDetails") # ================== Formátování ================== wb = load_workbook(xlsx_path) 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" def center_columns(ws,columns_names): # Define centered alignment center_alignment = Alignment(horizontal="center", vertical="center") if isinstance(columns_names,list): pass elif isinstance(columns_names,str): if columns_names=="ALL": 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]: cell.alignment = center_alignment wsdavkyheader = wb["DávkyHeader"] wsdavkydetails = wb["DávkyDetails"] style_table(wsdavkyheader, "dávkyheader") style_table(wsdavkydetails, "dávkydetails") # format_dates(ws_main, ["Datum očkování", "Expirace"]) center_columns(wsdavkyheader,"ALL") center_columns(wsdavkydetails,"ALL") wb.save(xlsx_path) print(f"Hotovo. Uloženo do: {xlsx_path.resolve()}")