Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.77 KB | None | 0 0
  1. from openpyxl import load_workbook
  2. from openpyxl.styles import PatternFill
  3. from datetime import date, datetime, timedelta
  4. #Значения по умолчанию:
  5. pathname = 'result_wb.xlsx'
  6. key = 'Легенда'
  7. value_s = 'Потрачено времени'
  8. #Если нужно - можно изменить значения заданные выше прямо из консоли:
  9. print('Ввести путь и имя исходной таблицы? (0=Y, 1=N)')
  10. work = input()
  11. if work == '0':
  12.     pathname = input('Введи путь/имя таблицы')
  13.  
  14. print('Ввести имя столбца значений? (0=Y, 1=N)')
  15. work = input()
  16.  
  17. if work == '0':
  18.     value_s = input()
  19.  
  20. print('Ввести имя столбца ключей? (0=Y, 1=N)')
  21. work = input()
  22.  
  23. if work == '0':
  24.     key = input()
  25.  
  26. print(F'Работаем с таблицей:\n{pathname}\nЗначения: "{value_s}"\nКлюч: "{key}"')
  27. #Загружаем таблицу по заданному ранее пути:
  28. wb = load_workbook(pathname)
  29. s_r = wb.create_sheet('Результаты') #Создаем лист с результатами (sheet results)
  30. s_s = wb.active #сохраняем в переменную лист с исходными данными (sheet source)
  31.  
  32. #Размечаем лист результатов:
  33. s_r['A1'] = 'Проект:'
  34. s_r['B1'] = 'Отработано часов:'
  35. s_r['C1'] = 'Стоимость в час:'
  36. s_r['D1'] = 'Сумма (р.р.)'
  37.  
  38. for cel in s_s[1]: #В первой строке ищем столбец значений и столбец ключей (Value, Column). Сохраняем их букву и номер в переменные
  39.     if s_s[cel.coordinate].value == value_s: #Сравниваем значение в ячейке со значением заданным вначале
  40.         cnv, clv = cel.column, cel.column_letter #cnv= Column Number for "Value" column, clv = Column Letter for "Value" column
  41.     elif s_s[cel.coordinate].value == key:
  42.         cnk, clk = cel.column, cel.column_letter ##cnk= Column Number for "Key" column, clk = Column Letter for "Key" column
  43.  
  44. #Необходимые переменные для работы над данными:
  45. colkey = None #Цвет ключа
  46. cost = None #Стоимость часа работы по ключу
  47. t_time = None #храним преобразованное значение ячейки
  48.  
  49. for cels in s_s[clk]: #Перебираем ключи из столбца ключей, где указаны цвет, название проекта
  50.     s_time = timedelta(hours=0)  # Переменная для хранения суммарного времени
  51.     if s_s[cels.coordinate].value == None: #Если ячейка пустая - пропускаем итерацию
  52.         if s_s.cell(row=cels.row-1, column=cnk).value == None: #Если предыдущая ячейка так же была пустой - прекращаем перебор
  53.             break
  54.         continue #Если пустая ячейка встречена впервые - просто пропускаем итерацию
  55.     elif cels.row == 1:
  56.         continue #Так же пропускаем итерацию, если это ячейка в первой строке
  57.     else:
  58.         colkey = s_s[cels.coordinate].fill.fgColor.value #сохраняем значение цвета заливки ячейки
  59.         cost = s_s.cell(row=cels.row, column=cnk+1).value #сохраняем значение стоимости часа работы из соседней ячейки
  60.         s_r.cell(row=cels.row, column=1).fill = PatternFill(fill_type='solid', start_color=colkey, end_color=colkey) #на листе результата заливаем ячейку проекта тем же цветом
  61.         s_r.cell(row=cels.row, column=1).value = s_s[cels.coordinate].value #записываем значение ключа на лист результата
  62.         s_r.cell(row=cels.row, column=3).value = cost #записываем стоимость на лист результата
  63.  
  64.         for cl in s_s[clv]: #проходим по столбцу значений и суммируем время в ячейках того же цвета что и ключ
  65.             cur_cel = s_s[cl.coordinate] #сохраняем путь к текущей ячейке в переменную
  66.             if cl.row == 1 or s_s[cl.coordinate].fill.fgColor.value != colkey: #пропуск итерации если ячейка в первой строке или цвет заливки не совпадает с ключем
  67.                 continue
  68.             elif cur_cel.value == None: # так же пропускаем итерацию, если ячейка пуста. если это третья подряд пустая ячейка - прерываем цикл
  69.                 if s_s.cell(row=cl.row-1, column=cnv).value == None and s_s.cell(row=cl.row-2, column=cnv).value == None:
  70.                     break
  71.                 continue
  72.             else:
  73.                 t_time = datetime.combine(date.min, cur_cel.value)-datetime.min #Конвертируем полученное значение из time в timedelta
  74.                 s_time += t_time #суммируем время ключа в переменной s_time
  75.  
  76.         s_r.cell(row=cels.row, column=2).value = s_time #Записываем полученное время ключа(проекта) на лист результатов
  77.         s_r.cell(row=cels.row, column=4).value = round((s_time.total_seconds())/60 * (cost/60)) #Считаем сумму за отработанное время и записываем на лист результатов
  78.  
  79. wb.save(pathname) #сохраняем файл
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement