̄(i$ddlZddlmZddlmZmZddlZddlmZddl m Z ddl m Z ddl mZddlmZmZmZmZmZmZdd lmZd ed efd Zd ed efdZ ddedededeedeejdeedeefdZ dS)N)Optional)datetimedate) QTableWidget)Qt)Workbook)get_column_letter)Font Alignment PatternFillBorderSidenumbers)loggeralignment_flagreturnc |ttjjzrt ddS|ttjjzrt ddSn#t $rYnwxYwt ddS)Nrightcenter horizontalverticalleft)intr AlignmentFlag AlignRightr AlignHCenter Exception)rs /C:\PYTHON\MyICR_Suite\app\utils\excel_export.py_qt_alignment_to_excelr s C 0 ;<< < D(CCC C C 0 =>> > E8DDD D E       : : ::s1A'1A'' A43A4pixelsc^|dkrdStdt|dz dzd}|S)Nrg$@g @g@g?)maxround)r!widths r_pixels_to_excel_widthr's9{{t UFSLC/33 4 4E L Dettagliotable file_path sheet_nametheme original_data date_columnsnumber_columnsc  )dkrtd)}})fdt |D} fd| D} t } | j} |pddd| _tj d|d | jd |d |d |r|pi d ini} dtdtfd}|| dd}|| dd}t||d}td|}tdd}tdd}t!||||}t#| d D]9\}}| d||!}||_||_||_||_:i}|!t/d"rt1d"i}t3|pg}t3|pg}t |D]g}t#| d D]Q\}}||}| |dz }d#} d#}!d}"|$| |}"|"r |"|vrd} n|"|vrd}!| r|"r|"|jvr |j||"}#t;j|#rt?|#tr't;j |#!}$nht?|#tDr|#!}$n>t?|#tBr|#}$n&t;j |#!}$| |d$z||$!}d%|_#n| |d$z|d&!}n#ttHtJf$r[}%tj&d'|d(|d)|%|r|'nd&}&| |d$z||&!}Yd}%~%nMd}%~%wwxYw|!r|"r |"|jvr |j||"}#t;j|#rJt?|#tPtRfr|#}'ntS|#}'| |d$z||'!}n| |d$z|d&!}n#ttHtJf$rZ}%tj&d*|d(|d)|%|r|'nd&}&| |d$z||&!}Yd}%~%n;d}%~%wwxYw|r|'nd&}&| |d$z||&!}|&tU|+|_Sit#| d D]F\}},|}(t[|(| j.t_|_0Gd+| _1d,t_||dz| j2_3d-| j4d_5| 6|tj d.|d/dS)0a Esporta lo stato VISIBILE di una QTableWidget in Excel, mantenendo: - ordine attuale delle colonne (anche se riordinate dall'utente) - larghezze approssimate delle colonne - formattazione delle intestazioni e allineamento celle Args: table: QTableWidget da esportare file_path: Path del file Excel di output sheet_name: Nome del foglio Excel theme: Tema colori opzionale original_data: DataFrame originale con dati non formattati (opzionale) date_columns: Lista di nomi colonne nel DataFrame che contengono date (opzionale) number_columns: Lista di nomi colonne nel DataFrame che contengono numeri (opzionale) Nota: Se original_data e date_columns/number_columns sono forniti, le colonne verranno esportate come valori nativi di Excel invece che come testo, permettendo l'ordinamento e i calcoli corretti in Excel. NrzTabella vuota o non validac:g|]}|S) logicalIndex).0vheaders r z0export_qtablewidget_to_excel..Gs'JJJA,,Q//JJJr(cg|]@}|r'|ndAS))horizontalHeaderItemtext)r5log_idxr*s rr8z0export_qtablewidget_to_excel..Hs] 8=7Q7QRY7Z7Z b # #G , , 1 1 3 3 3`br(r)z!Excel export: creating workbook 'z ', sheet='z' with z rows and z colsr* hex_colorrc|pdd}t|dkrd|zSt|dkr|SdS)Nr:#FFFF0078D4)lstripupperlen)r?hs r_argbz+export_qtablewidget_to_excel.._argbTsV _" $ $S ) ) / / 1 1 q66Q;;!8O q66Q;;Hzr( header_bgz#0078D4 header_textz#FFFFFFsolid) start_color end_color fill_typeT)boldcolorrrthinDDDDDD) border_stylerR)toprrbottomr#)start)rowcolumnvaluecolumn_mappingFz DD/MM/YYYYr:zDate conversion failed for row z, col z: z!Number conversion failed for row A2zA1:zExcel export: saved file 'z' successfully)7 columnCount ValueErrorhorizontalHeaderrowCountrangeractivetitlerinfogetstrr r r rr enumeratecellfillfont alignmentborderhasattrgetattrsetitemcolumnsilocpdnotna isinstance to_datetimerr number_format TypeErrorAttributeErrorwarningr<rfloatr textAlignment columnWidthr'column_dimensionsr r& freeze_panes auto_filterrefrow_dimensionsheightsave)*r*r+r,r-r.r/r0 col_count row_countvisual_to_logical headers_textwbws table_themerJrKrL header_fill header_fontheader_alignmentrS header_bordercrfrkheader_to_df_col date_cols_setnumber_cols_setrr6r=rsuse_native_dateuse_native_number df_col_name raw_value date_valueer[ numeric_valuepxr7s*` @rexport_qtablewidget_to_excelr#sy8 }))++q005666  # # % %F!!##I  IKJJJy9I9IJJJ(L B B)k3B3/BH KIZcoxAAA5:A5;B##GR000rKkook9==>>I%  yAABBK)yT[\\\KD 444K HxHHH V8 4 4 4Dt$d4HHHMl!444$$5ww1Qew44  )#  WU4D%E%E "5*:B?? *++M..B//O9  JNJN#$5Q???I NI NJAw::a))D&q1u-K$O % K(.22;?? 1"m33*.$77,0)2 A;2 A;-BW3W3WE - 21 5k BIx **F%i55J)+ )B)B)G)G)I)IJJ' 8<<J)2)9)9JJ' 488J)2JJ)+ )B)B)G)G)I)IJ!ww1q5*wMM-9**!ww1q5"wEE"I~>EEEN#`Q#`#`k#`#`]^#`#`aaa+/7DIIKKKRE77q1uQe7DDDDDDDD E # A{ A{mF[7[7[E - 21 5k BIx ** F%i#u>>=,5MM-2),<,EEEN#bq#b#bP[#b#b_`#b#bccc+/7DIIKKKRE77q1uQe7DDDDDDDD E(,3 ww1q5%w@@!78J8J8L8L!M!MSI NX 1;;;VV 7   w ' ';QRT;U;U.q11288BOL0;;LY]LLBN#%BaGGI KFYFFFGGGGGs4:D OP7AP22P7 B SU /AUU )r)NNNN)!mathtypingrrrpandasrvPyQt6.QtWidgetsr PyQt6.QtCoreropenpyxlropenpyxl.utilsr openpyxl.stylesr r r r rrlogururrr r~r'ridict DataFramelistrr3r(rrs ########((((((,,,,,,OOOOOOOOOOOOOOOO;3;9;;;;35" ,0#'%)nHnH nHnHnH D> nH BL) nH 4. nHTNnHnHnHnHnHnHr(