Фильтрация таблиц эксель

введите сюда описание изображениянаписал скрипт вроде все работает только вот начиная со строки 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 шт):

Автор решения: Evrik

Для обработки двух массивов можно использовать такой подход:

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, чтобы в случае необходимости было проще поменять их значения.

→ Ссылка