Фильтрация таблиц эксель
написал скрипт вроде все работает только вот начиная со строки 132 работает не как надо.
требуется что бы если вид ремонта Т вставлял в 4 колонку, если С 5, если К в 6.
Вместо этого он берет последний элемент списка где записанны человекочасы и вставляет его как раз по условию определнному выше. Помогите пожалуйста
import openpyxl
from openpyxl import Workbook
import re
mouth = input('Введите требуемый месяц..')
t_repair = 'Т'
c_repair = 'С'
k_repair = 'К'
path = "1234.xlsx"
excel_file = openpyxl.load_workbook(path)
ds = excel_file.sheetnames
sheets = []
mass = []
mass1 = []
mass2 = []
mass3 = []
mass4 = []
book ={
'1':19,
'2':21,
'3':23,
'4':25,
'5':27,
'6':29,
'7':31,
'8':33,
'9':35,
'10':37,
'11':39,
'12':41,
}
book2 ={
'1':20,
'2':22,
'3':24,
'4':26,
'5':28,
'6':30,
'7':32,
'8':34,
'9':36,
'10':38,
'11':40,
'12':42,
}
path2 = "12345.xlsx"
excel_file2 = openpyxl.load_workbook(path2)
sheet_obj2 = excel_file2.active
m_row2 = sheet_obj2.max_row
for i in ds:
sheets.append(i)
for n in sheets:
sheet_obj = excel_file[n] # Выбираем активный лист таблицы(
m_row = sheet_obj.max_row
for i in range(2, m_row + 1):
if mouth in book:
mouth2 = (book[mouth])
if mouth in book2:
mouth3 = (book2[mouth])
cell_obj1 = sheet_obj.cell(row=i, column=mouth2) # В column= подставляем номер нужной колонки
b = cell_obj1.value
cell_obj1 = sheet_obj.cell(row=i, column=mouth3) # В column= подставляем номер нужной колонки
b1 = cell_obj1.value
if b!= None:
mass1.append(b)
mass4.append(b1)
rt = str(cell_obj1)
s1 = re.findall(r'\d{1,5}', rt)
rrr = s1[0]
if str(b).count(t_repair) == 1:
cell_obj = sheet_obj.cell(row=int(rrr), column=3) # В column= подставляем номер нужной колонки
a = cell_obj.value
mass.append(a)
cell_obj = sheet_obj.cell(row=int(rrr), column=2) # В column= подставляем номер нужной колонки
p = cell_obj.value
mass3.append(p)
cell_obj = sheet_obj.cell(row=int(rrr), column=4) # В column= подставляем номер нужной колонки
f = cell_obj.value
cell_obj = sheet_obj.cell(row=int(rrr), column=13) # В column= подставляем номер нужной колонки
l = cell_obj.value
fl = str(f)+', '+str(l)
mass2.append(fl)
if str(b).count(c_repair) > 0:
cell_obj = sheet_obj.cell(row=int(rrr)-1, column=3) # В column= подставляем номер нужной колонки
a = cell_obj.value
mass.append(a)
cell_obj = sheet_obj.cell(row=int(rrr)-1, column=4) # В column= подставляем номер нужной колонки
f = cell_obj.value
cell_obj = sheet_obj.cell(row=int(rrr)-1, column=13) # В column= подставляем номер нужной колонки
l = cell_obj.value
fl = f + ', ' + l
mass2.append(fl)
cell_obj = sheet_obj.cell(row=int(rrr)-1, column=2) # В column= подставляем номер нужной колонки
p = cell_obj.value
mass3.append(p)
if str(b).count(k_repair) > 0:
cell_obj = sheet_obj.cell(row=int(rrr) - 2, column=3) # В column= подставляем номер нужной колонки
a = cell_obj.value
mass.append(a)
cell_obj = sheet_obj.cell(row=int(rrr)-2, column=4) # В column= подставляем номер нужной колонки
f = cell_obj.value
cell_obj = sheet_obj.cell(row=int(rrr)-2, column=13) # В column= подставляем номер нужной колонки
l = cell_obj.value
fl = f + ', ' + l
mass2.append(fl)
cell_obj = sheet_obj.cell(row=int(rrr)-2, column=2) # В column= подставляем номер нужной колонки
p = cell_obj.value
mass3.append(p)
r = 1
for h in mass:
sheet_obj2.cell(row=r, column=1).value = h
r += 1
j = 1
for q in mass2:
sheet_obj2.cell(row=j, column=3).value = q
j += 1
u = 1
for o in mass3:
sheet_obj2.cell(row=u, column=2).value = o
u += 1
gt = 1
for s in mass1:
if str(s).count(t_repair) > 0:
for m in mass4:
sheet_obj2.cell(row=gt, column=4).value = m
gt += 1
if str(s).count(c_repair) > 0:
for v in mass4:
sheet_obj2.cell(row=gt, column=5).value = v
gt += 1
if str(s).count(k_repair) > 0:
for sd in mass4:
sheet_obj2.cell(row=gt, column=6).value = sd
gt += 1
excel_file2.save(filename="12345.xlsx")
упрошаем задачу: есть два списка ['Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т1', 'Т8', 'Т8', 'Т8', 'Т6', 'Т4', 'Т4', 'С', 'Т4', 'Т8', 'Т4', 'Т7', 'Т7', 'Т7', 'Т7', 'Т4', 'Т4', 'Т4', 'Т4', 'С', 'Т9', 'Т3', 'Т5', 'Т5', 'Т5', 'Т5', 'Т5', 'Т1', 'Т7', 'Т1', 'Т5', 'Т1', 'Т5', 'Т5', 'Т5', 'Т5', 'Т5', 'С2', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т11', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т10', 'Т6', 'Т6', 'Т6', 'Т5', 'Т4', 'Т7', 'Т2', 'Т4', 'Т3', 'Т6', 'Т2'] и [5.6, 3.5, 2.6, 3.2, 3.2, 1.1, 3.3, 0.4, 3.5, 1.9, 2.3, 2.3, 1.1, 1.1, 2.3, 0.7, 5, 0.5, 3.5, 1.9, 2.3, 2.3, 1.1, 1.1, 0.7, 0.7, 45, 1.9, 0.3, 4.4, 1.9, 1.9, 1.9, 1.1, 0.7, 5, 4.5, 1.1, 0.7, 1.1, 4.4, 4.4, 3.5, 3.5, 0.3, 5.6, 3.5, 2.6, 3.2, 3.2, 1.1, 3.3, 0.4, 5.6, 3.5, 2.6, 3.2, 3.2, 1.1, 3.3, 5.6, 3.5, 2.6, 3.2, 3.2, 1.1, 3.3, 5.6, 3.5, 2.6, 3.2, 3.2, 1.1, 3.3, 5.6, 3.5, 2.6, 3.2, 3.2, 1.1, 3.3, 4.4, 4.4, 3.5, 3.5, 1.1, 5, 0.5, 0.5, 5, 0.1, 0.5] количество значений в каждом одинаковое, если в первом содержится Т то число из второго списка поместить в сроку1, если С в строку2. Очередность срок должна соблюдаться.
t_repair = 'Т'
c_repair = 'С'
k_repair = 'К'
gt = 1
st = 1
for s in mass1:
if str(s).count(t_repair) == 1:
sheet_obj2.cell(row=st, column=4).value = s
st += 1
if str(s).count(c_repair) == 1:
sheet_obj2.cell(row=st, column=5).value = s
st += 1
if str(s).count(k_repair) == 1:
sheet_obj2.cell(row=st, column=6).value = s
st += 1
for d in mass4:
sheet_obj2.cell(row=gt, column=7).value = d
gt += 1
Ответы (1 шт):
Для обработки двух массивов можно использовать такой подход:
type_col = 0
cost_col = 0
for idx, (repair_type, repair_cost) in enumerate(zip(mass1, mass4), start=1): # <- 1 - это номер первой строки, с которой заполнять таблицу
if t_repair in repair_type:
type_col, cost_col = 4, 7
elif c_repair in repair_type:
type_col, cost_col = 5, 8
elif k_repair in repair_type:
type_col, cost_col = 6, 9
sheet_obj2.cell(row=idx, column=type_col).value = repair_type
sheet_obj2.cell(row=idx, column=cost_col).value = repair_cost
Но это для случая, когда во входных данных нет значений, которые должны игнорироваться.
Если таковые есть, то в выходной таблице будут пустые строки при таком подходе. В этом случае нужно использовать как у Вас отдельный счетчик для номера строки
idx = 1
for repair_type, repair_cost in zip(mass1, mass4):
if t_repair in repair_type:
sheet_obj2.cell(row=idx, column=4).value = repair_type
sheet_obj2.cell(row=idx, column=7).value = repair_cost
idx += 1
elif c_repair in repair_type:
sheet_obj2.cell(row=idx, column=5).value = repair_type
sheet_obj2.cell(row=idx, column=8).value = repair_cost
idx += 1
elif k_repair in repair_type:
sheet_obj2.cell(row=idx, column=6).value = repair_type
sheet_obj2.cell(row=idx, column=9).value = repair_cost
idx += 1
Еще бы я рекомендовал номера необходимых столбцов поместить в переменные, либо enum, чтобы в случае необходимости было проще поменять их значения.
