Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from openpyxl import load_workbook
- from openpyxl.styles import PatternFill
- from datetime import date, datetime, timedelta
- #Значения по умолчанию:
- pathname = 'result_wb.xlsx'
- key = 'Легенда'
- value_s = 'Потрачено времени'
- #Если нужно - можно изменить значения заданные выше прямо из консоли:
- print('Ввести путь и имя исходной таблицы? (0=Y, 1=N)')
- work = input()
- if work == '0':
- pathname = input('Введи путь/имя таблицы')
- print('Ввести имя столбца значений? (0=Y, 1=N)')
- work = input()
- if work == '0':
- value_s = input()
- print('Ввести имя столбца ключей? (0=Y, 1=N)')
- work = input()
- if work == '0':
- key = input()
- print(F'Работаем с таблицей:\n{pathname}\nЗначения: "{value_s}"\nКлюч: "{key}"')
- #Загружаем таблицу по заданному ранее пути:
- wb = load_workbook(pathname)
- s_r = wb.create_sheet('Результаты') #Создаем лист с результатами (sheet results)
- s_s = wb.active #сохраняем в переменную лист с исходными данными (sheet source)
- #Размечаем лист результатов:
- s_r['A1'] = 'Проект:'
- s_r['B1'] = 'Отработано часов:'
- s_r['C1'] = 'Стоимость в час:'
- s_r['D1'] = 'Сумма (р.р.)'
- for cel in s_s[1]: #В первой строке ищем столбец значений и столбец ключей (Value, Column). Сохраняем их букву и номер в переменные
- if s_s[cel.coordinate].value == value_s: #Сравниваем значение в ячейке со значением заданным вначале
- cnv, clv = cel.column, cel.column_letter #cnv= Column Number for "Value" column, clv = Column Letter for "Value" column
- elif s_s[cel.coordinate].value == key:
- cnk, clk = cel.column, cel.column_letter ##cnk= Column Number for "Key" column, clk = Column Letter for "Key" column
- #Необходимые переменные для работы над данными:
- colkey = None #Цвет ключа
- cost = None #Стоимость часа работы по ключу
- t_time = None #храним преобразованное значение ячейки
- for cels in s_s[clk]: #Перебираем ключи из столбца ключей, где указаны цвет, название проекта
- s_time = timedelta(hours=0) # Переменная для хранения суммарного времени
- if s_s[cels.coordinate].value == None: #Если ячейка пустая - пропускаем итерацию
- if s_s.cell(row=cels.row-1, column=cnk).value == None: #Если предыдущая ячейка так же была пустой - прекращаем перебор
- break
- continue #Если пустая ячейка встречена впервые - просто пропускаем итерацию
- elif cels.row == 1:
- continue #Так же пропускаем итерацию, если это ячейка в первой строке
- else:
- colkey = s_s[cels.coordinate].fill.fgColor.value #сохраняем значение цвета заливки ячейки
- cost = s_s.cell(row=cels.row, column=cnk+1).value #сохраняем значение стоимости часа работы из соседней ячейки
- s_r.cell(row=cels.row, column=1).fill = PatternFill(fill_type='solid', start_color=colkey, end_color=colkey) #на листе результата заливаем ячейку проекта тем же цветом
- s_r.cell(row=cels.row, column=1).value = s_s[cels.coordinate].value #записываем значение ключа на лист результата
- s_r.cell(row=cels.row, column=3).value = cost #записываем стоимость на лист результата
- for cl in s_s[clv]: #проходим по столбцу значений и суммируем время в ячейках того же цвета что и ключ
- cur_cel = s_s[cl.coordinate] #сохраняем путь к текущей ячейке в переменную
- if cl.row == 1 or s_s[cl.coordinate].fill.fgColor.value != colkey: #пропуск итерации если ячейка в первой строке или цвет заливки не совпадает с ключем
- continue
- elif cur_cel.value == None: # так же пропускаем итерацию, если ячейка пуста. если это третья подряд пустая ячейка - прерываем цикл
- if s_s.cell(row=cl.row-1, column=cnv).value == None and s_s.cell(row=cl.row-2, column=cnv).value == None:
- break
- continue
- else:
- t_time = datetime.combine(date.min, cur_cel.value)-datetime.min #Конвертируем полученное значение из time в timedelta
- s_time += t_time #суммируем время ключа в переменной s_time
- s_r.cell(row=cels.row, column=2).value = s_time #Записываем полученное время ключа(проекта) на лист результатов
- s_r.cell(row=cels.row, column=4).value = round((s_time.total_seconds())/60 * (cost/60)) #Считаем сумму за отработанное время и записываем на лист результатов
- wb.save(pathname) #сохраняем файл
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement