diff --git a/.gitignore b/.gitignore index 4bbd579..b5a4a9c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ dist/ downloads/ eggs/ .eggs/ +.vscode/settings.json lib64/ parts/ sdist/ diff --git a/.vscode/settings.json b/.vscode/settings.json index c77f538..51c5de6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,6 @@ "cSpell.words": [ "DXFATTRIBS", "ezdxf" - ] + ], + "iis.configDir": "" } \ No newline at end of file diff --git a/lib/ioconverter.py b/lib/ioconverter.py index f215f7c..7689456 100644 --- a/lib/ioconverter.py +++ b/lib/ioconverter.py @@ -10,6 +10,16 @@ class ExcelConverter: self.eingaenge_identifier = ["FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ"] self.ausgaenge_identifier = ["K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ"] + def _sortierter_df(self, eintraege, sortierung, spalten): + """ + Erzeugt einen sortierten DataFrame. Bei leerer Liste (z.B. SPS ohne Ausgänge) + wird ein leerer DataFrame mit den erwarteten Spalten erzeugt, damit Sortierung + und spätere Spaltenzugriffe nicht mit KeyError abbrechen. + """ + if not eintraege: + return pd.DataFrame(columns=spalten) + return pd.DataFrame(eintraege).sort_values(by=sortierung) + def _gleiche_finden(self, liste): counter = {} for eintrag in liste: @@ -147,8 +157,9 @@ class ExcelConverter: gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) # DataFrames erzeugen u. sortieren - df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name") - df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name") + spalten = ['Name', 'Kommentar', 'Zeile'] + df_eingaenge = self._sortierter_df(eingaenge, "Name", spalten) + df_ausgaenge = self._sortierter_df(ausgaenge, "Name", spalten) df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Name") if gleiche_eingaenge else pd.DataFrame() df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Name") if gleiche_ausgaenge else pd.DataFrame() @@ -218,8 +229,9 @@ class ExcelConverter: gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) # DataFrames erstellen u. sortieren - df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Zahl") - df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Zahl") + spalten = ['Name', 'NameOriginal', 'NameConstant', 'Kommentar', 'Zahl', 'Zeile'] + df_eingaenge = self._sortierter_df(eingaenge, "Zahl", spalten) + df_ausgaenge = self._sortierter_df(ausgaenge, "Zahl", spalten) df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Zahl") if gleiche_eingaenge else pd.DataFrame() df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Zahl") if gleiche_ausgaenge else pd.DataFrame() @@ -362,8 +374,9 @@ class ExcelConverter: gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) # DataFrames erzeugen u. sortieren - df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name") - df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name") + spalten = ['Name', 'Kommentar', 'Zeile', 'Bezug'] + df_eingaenge = self._sortierter_df(eingaenge, "Name", spalten) + df_ausgaenge = self._sortierter_df(ausgaenge, "Name", spalten) df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Name") if gleiche_eingaenge else pd.DataFrame() df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Name") if gleiche_ausgaenge else pd.DataFrame() diff --git a/lib/portalexport.py b/lib/portalexport.py index ec9baf7..2cf0dab 100644 --- a/lib/portalexport.py +++ b/lib/portalexport.py @@ -118,7 +118,7 @@ def do_export(conv_obj:ExcelConverter, mode_str, base_input, output_dir, lines, conv_obj.export_excel(lines, export_type, export_path, getpos_errors, getpos_warnings) print(f"Export '{export_type}' erfolgreich: {export_path}") except Exception as e: - print(f"Fehler bei Export '{export_type}': {e}") + print(f"Fehler bei Export '{export_type}' ({export_path}): {type(e).__name__}: {e}") def do_exports(converter, export_mode, output_dir, base_input, lines, getpos_errors=None, getpos_warnings=None): if export_mode: