You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

excel_evaluation.py 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import openpyxl
  2. def excel_row_to_string(file_path):
  3. # Öffne die Excel-Datei
  4. workbook = openpyxl.load_workbook(file_path)
  5. # Wähle das Arbeitsblatt aus
  6. sheet = workbook['Sheet1']
  7. # Erhalte die angegebene Zeile als Liste von Zellen
  8. row_values = [cell.value for cell in sheet[2]]
  9. # Ergebnisse werden ab Spalte 5 eingetragen
  10. selected_columns = list(range(4, len(row_values)))
  11. # Wähle nur die gewünschten Spalten aus
  12. selected_values = [row_values[col] for col in selected_columns]
  13. # Schließe die Excel-Datei
  14. workbook.close()
  15. # Konvertiere die Liste von Zellen in einen String
  16. row_string = ', '.join(str(value) for value in selected_values)
  17. return row_string
  18. def write_subdivided_string_to_excel(file_path, input_string):
  19. # Öffne die Excel-Datei
  20. workbook = openpyxl.load_workbook(file_path)
  21. # Wähle das Arbeitsblatt aus
  22. sheet = workbook['Sheet1']
  23. # Teile den String nach jedem Komma auf
  24. parts = input_string.split(',')
  25. # Trage jeden Teil des Strings in eine neue Zeile ein
  26. for i, part in enumerate(parts, 1):
  27. #Spalte 17 kann sich je nach Tabellenstruktur ändern!
  28. sheet.cell(row=2 + i - 1, column=17, value=part.strip()) # strip entfernt mögliche Leerzeichen
  29. # Speichere die Änderungen
  30. workbook.save(file_path)
  31. # Schließe die Excel-Datei
  32. workbook.close()
  33. def read_columns(file_path):
  34. # Öffne die Excel-Datei
  35. workbook = openpyxl.load_workbook(file_path)
  36. # Wähle das Arbeitsblatt aus
  37. sheet = workbook['Sheet1']
  38. # Lese die Werte der beiden Spalten aus
  39. values_column1 = [cell.value for cell in sheet['O']][1:]
  40. values_column2 = [cell.value for cell in sheet['Q']][1:]
  41. # Schließe die Excel-Datei
  42. workbook.close()
  43. return values_column1, values_column2
  44. def calculate_deviation(liste1, liste2):
  45. # Überprüfe, ob die Listen die gleiche Länge haben
  46. if len(liste1) != len(liste2):
  47. raise ValueError("Die Listen müssen die gleiche Länge haben")
  48. # Berechne die prozentuale Abweichung zwischen den Werten
  49. deviations = [((abs(float(b) - float(a)) / float(a)) * 100) if float(a) != 0 else None for a, b in zip(liste1, liste2)]
  50. return deviations
  51. def write_string_to_excel(file_path, input_string, column):
  52. # Öffne die Excel-Datei
  53. workbook = openpyxl.load_workbook(file_path)
  54. # Wähle das Arbeitsblatt aus
  55. sheet = workbook['Sheet1']
  56. # Trage jeden Buchstaben des Strings in eine eigene Zeile ein
  57. for i, char in enumerate(input_string, 1):
  58. sheet.cell(row=2 + i - 1, column=column, value=char)
  59. # Speichere die Änderungen
  60. workbook.save(file_path)
  61. # Schließe die Excel-Datei
  62. workbook.close()
  63. def copy_header(input_sheet, output_sheet):
  64. # Kopiere den Header manuell in das Ausgabe-Arbeitsblatt
  65. for row in input_sheet.iter_rows(min_row=1, max_row=1, values_only=True):
  66. output_sheet.append(row)
  67. def sort_excel(input_file_path, output_file_path, ):
  68. # Öffne die Eingabe-Excel-Datei
  69. input_workbook = openpyxl.load_workbook(input_file_path)
  70. input_sheet = input_workbook['Sheet1']
  71. # Erstelle eine neue Excel-Tabelle für die sortierten Zeilen
  72. output_workbook = openpyxl.Workbook()
  73. output_sheet = output_workbook.active
  74. # Kopiere den Header ins Ausgabe-Arbeitsblatt
  75. copy_header(input_sheet, output_sheet)
  76. # Lese die Daten-Zeilen aus der Tabelle
  77. data_rows = list(input_sheet.iter_rows(min_row=2, values_only=True))
  78. # Sortiere die Daten-Zeilen nach dem Wert der angegebenen Spalte
  79. sorted_data_rows = sorted(data_rows, key=lambda x: x[18 - 1]) # -1, da Listenindizes bei 0 beginnen
  80. # Schreibe die sortierten Daten-Zeilen in die neue Tabelle
  81. for row in sorted_data_rows:
  82. output_sheet.append(row)
  83. # Speichere die Änderungen in der neuen Excel-Datei
  84. output_workbook.save(output_file_path)
  85. # Schließe die Excel-Dateien
  86. input_workbook.close()
  87. output_workbook.close()
  88. #Sollten mehrere Testruns ausgewertet werden wollen, müssen die enthaltenen Funktionen umstrukturiert werden
  89. #Aktuell wird nur der Testrun in Zeile 1 ausgewertet
  90. #Eine Weitere Funktion, die zwei Tabellenzeilen tauscht, wäre der einfachste workaround
  91. def evaluation(testcases, testruns):
  92. #liest die Ergebnisse des Testruns aus
  93. #bei mehreren Testruns muss diese Funktion angepasst werden!
  94. input_string = excel_row_to_string(testruns)
  95. #schreibt die Berechneten Ergebnisse in die Testcases-Tabelle
  96. write_subdivided_string_to_excel(testcases, input_string)
  97. #liest die gemessenen und die errechneten Werte aus den Testcases
  98. values_col1, values_col2 = read_columns(testcases)
  99. #berechnet aus diesen Werten die prozentuale Abweichung
  100. deviations = calculate_deviation(values_col1, values_col2)
  101. #Trägt die prozentualen Abweichungen in die Testcases-Tabelle
  102. #je nach Tabellenstruktur kann sich die 18 ändern!
  103. write_string_to_excel(testcases, deviations, 18)
  104. #Gibt die eine Kopie der Testcases-Tabelle sortiert nach Genauigkeit aus
  105. sort_excel(testcases, 'Testcases_nach_Genauigkeit.xlsx')