Guten morgen,
erstmal vielen dank für eure Antworten.
@Sirius3
Ich habe dein Script übernommen, allerdings bekomme ich dabei weiterhin auch gleiche Artiklenummern mehrmals mit ihrer dazugehörigen Stückanzahl durch. Deswegen habe ich das Script leicht angepasst, so dass es mir 2 lists (result_an und result_value) ausgibt. Mit diesen lists bin ich dann in eine andere Funktion gegangen und habe versucht sie richtig zusammenzurechnern sogar mit einem kleinen erfolg.
Hier mal der gesamte Code:
Code: Alles auswählen
import openpyxl
from collections import OrderedDict
from tkinter.filedialog import askopenfilename
import os
def get_list_xlsx1(filename, row, column):
wb = openpyxl.load_workbook(filename)
ws = wb.get_active_sheet()
result_an = []
result_value = []
while True:
value = ws.cell(row=row, column=column).value
if value is None:
break
an = ws.cell(row=row, column=column - 2).value
unit = ws.cell(row=row, column=column + 1).value
if unit == "MM":
value /= 1000
result_an.append(an)
result_value.append(value)
row += 1
return result_an, result_value
def get_dic_xlsx1(xlsx1_an, xlsx1_value):
count = 0
xlsx1_value_2 = []
xlsx1_value_2.append(xlsx1_value[count])
for item in xlsx1_an:
count += 1
xlsx1_value_2.append(xlsx1_value[count])
if item == xlsx1_an[count]:
xlsx1_an.pop()
sum_value_count = xlsx1_value_2[count-1] + xlsx1_value_2[count]
xlsx1_value_2.pop()
xlsx1_value_2.append(sum_value_count)
dic_xlsx1 =dict(zip(xlsx1_an, xlsx1_value_2))
return dic_xlsx1
def get_position_list_xlsx2(dic_xlsx1, xlsx2, hor_xlsx2):
wb = openpyxl.load_workbook(xlsx2)
ws = wb.get_active_sheet()
positions_per_item = OrderedDict()
position_list_xlsx2 = []
for item in dic_xlsx1.keys():
positions = []
for row_number, cell in enumerate(ws['D{}:D{}'.format(ws.min_row, ws.max_row)], start=1):
if cell[0].value == item:
position_list_xlsx2.append(row_number)
return position_list_xlsx2
def output_dic_xlsx1_in_xlsx1(dic_xlsx1, xlsx2, position_list_xlsx2, hor_xlsx2):
wb = openpyxl.load_workbook(xlsx2)
ws = wb.get_active_sheet()
count_var = 0
for item in dic_xlsx1.values():
cell_var = hor_xlsx2 + str(position_list_xlsx2[count_var])
print(cell_var)
count_var += 1
ws[cell_var] = item
wb.save(xlsx2)
xlsx1 = "Handlagermaterial.xlsx"
xlsx2 = "Kalkulationsstückliste.xlsx"
ver_xlsx1 = 2
hor_xlsx1 = 3
hor_xlsx2 = "E"
xlsx1_an, xlsx1_value = get_list_xlsx1(xlsx1, ver_xlsx1, hor_xlsx1)
print("Artikelnummern:")
print(len(xlsx1_an))
print(xlsx1_an)
print("---------------------------------------------------------------------")
print("Values:")
print(len(xlsx1_value))
print(xlsx1_value)
print("---------------------------------------------------------------------")
print("Dictionary xlsx1:")
dic_xlsx1 = get_dic_xlsx1(xlsx1_an, xlsx1_value)
print(len(dic_xlsx1))
print(dic_xlsx1)
print("---------------------------------------------------------------------")
print("positions list xlsx2:")
position_list_xlsx2 = get_position_list_xlsx2(dic_xlsx1, xlsx2, hor_xlsx2)
print(len(position_list_xlsx2))
print(position_list_xlsx2)
print("---------------------------------------------------------------------")
output_dic_xlsx1_in_xlsx1(dic_xlsx1, xlsx2, position_list_xlsx2, hor_xlsx2)
bei dem oben beschriebenen Funktionen handelt es sich um die ersten beiden (get_list_xlsx1 und get_dic_xlsx1).
Output bekomme ich nun folgenden:
Artikelnummern:
86
['EKK0000030', 'EKK0000030', 'EKK0000031', 'EKK0000031', 'EKK0000062', 'ESK0000017', 'ESK0000017', 'ESK0000017', 'ESK0000099', 'ESK0000099', 'ES00000009', 'ES00000028', 'ES00000038', 'ES00000054', 'ES00000054', 'ES00000054', 'ES00000054', 'ES00000148', 'ES00000809', 'NP00000110', 'NP00000110', 'NP00000112', 'NP00000113', 'NP00000144', '100CH595', '100GX705', '100HK990', '100JK590', '100MH042', '100MH042', '100MH060', '100MH062', '100MH062', '100MH062', '100MH062', '100MH062', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100MH064', '100PM032', '100PM032', '100QU894', '100QU894', '100WQ459', '100WR481', '22052090', '22052090', '22052090', '22052090', '30027407', '30043160', '30043160', '30058627', '30060500', '30060502', '30060503', '30060504', '30060506']
---------------------------------------------------------------------
Values:
86
[0.25, 0.3, 1, 1, 0.2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, 3, 2, 1, 5, 1, 10.0, 8, 10.0, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1.5, 2.0, 1, 1, 2, 2, 5, 2, 4, 1, 1, 10, 2, 1, 12, 20, 6]
---------------------------------------------------------------------
Dictionary xlsx1:
23
{'EKK0000030': 0.55, 'EKK0000031': 2, 'EKK0000062': 0.2, 'ESK0000017': 3, 'ESK0000099': 2, 'ES00000009': 1, 'ES00000028': 1, 'ES00000038': 1, 'ES00000054': 16, 'ES00000148': 1, 'ES00000809': 1, 'NP00000110': 5, 'NP00000112': 1, 'NP00000113': 5, 'NP00000144': 1, '100CH595': 10.0, '100GX705': 8, '100HK990': 10.0, '100JK590': 1, '100MH042': 6, '100MH060': 1, '100MH062': 5, '100MH064': 18}
---------------------------------------------------------------------
positions list xlsx2:
22
[11, 12, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 30, 36, 39, 40, 47, 48, 49, 50]
---------------------------------------------------------------------
E11
E12
E14
E15
E16
E17
E18
E19
E20
E23
E24
E25
E26
E27
E30
E36
E39
E40
E47
E48
E49
E50
Wie man sehen kann nimmt er zwar anfangs mal alle Artikelnummern und Stückanzahlen, aber bei der zweiten Funktion hört er bei der Artikelnummer "100MH064" auf und ich weiß leider nicht wieso und wenn ich das richtig sehe nimmt er mir bei der Position list nochmals um einen zu wenig.
Über dem Output steht jedes mal noch die länge der list oder des dictionarys zur Anschauung.
Ich hoffe es ist alles verständlich.
MfG
VoLLioMenTT