def pie_chart(): data = [ ['Pie', 'Sold'], ['Apple', 50], ['Cherry', 30], ['Pumpkin', 10], ['Chocolate', 40], ] wb = Workbook() ws = wb.active for row in data: ws.append(row) pie = PieChart() labels = Reference(ws, min_col=1, min_row=2, max_row=5) data = Reference(ws, min_col=2, min_row=1, max_row=5) pie.add_data(data, titles_from_data=True) pie.set_categories(labels) pie.title = "Pies sold by category" # Cut the first slice out of the pie slice = DataPoint(idx=0, explosion=20) pie.series[0].data_points = [slice] ws.add_chart(pie, "D1") wb.save("chart.xlsx")
def avg_chart(): chart1 = BarChart() ws = wb["Past Data"] data = Reference(worksheet=ws, min_row=1, max_row=ws.max_row, min_col=2, max_col=2) cats = Reference(worksheet=ws, min_row=2, max_row=ws.max_row, min_col=1, max_col=1) # set the title of the chart chart1.title = f'Average Regen Timing' chart1.add_data(data, titles_from_data=True) chart1.legend = None chart1.set_categories(cats) count_line = LineChart() count = Reference(worksheet=ws, min_row=2, max_row=ws.max_row - 1, min_col=3) count_line.add_data(count) chart1 += count_line # set data labels and styles s1 = chart1.series[0] s1.dLbls = DataLabelList() s1.dLbls.showVal = True pt = DataPoint(idx=ws.max_row - 3) pt.graphicalProperties.solidFill = "ff9900" pt1 = DataPoint(idx=ws.max_row - 2) pt1.graphicalProperties.solidFill = "00ff00" s1.dPt.append(pt) s1.dPt.append(pt1) # print(type(ws.max_row)) wb["Regen Timing"].add_chart(chart1, "A1")
def add_pie_chart(workbook, worksheet_level): pie = PieChart() cats = Reference(worksheet_level, min_col=1, min_row=2, max_row=worksheet_level.max_row) data = Reference(worksheet_level, min_col=2, min_row=1, max_row=worksheet_level.max_row) pie.add_data(data, titles_from_data=True) pie.set_categories(cats) pie.title = '问题评级' data_points = DataPoint(idx=0, explosion=20) pie.series[0].data_points = [data_points] worksheet_level.add_chart(pie, "C9") workbook.save(PATH + '/total.xlsx')
def printPollStat(self, quizStats): self.addIntoExecutionLog("Poll Statistics is being generated...") if not os.path.exists('Results'): os.makedirs('Results') if not os.path.exists('./Results/poll_statistics'): os.makedirs('./Results/poll_statistics') for i, keyQuizName in enumerate(quizStats): writer = pd.ExcelWriter("./Results/poll_statistics/" + keyQuizName + "_stats.xlsx", engine='xlsxwriter') quizStat = quizStats[keyQuizName] for j, quizPart in enumerate(quizStat.questionStatDict): questionStat = quizStat.questionStatDict[quizPart] answerNumDict = questionStat.getAnswerStat().answerNumDict dfAnswers = pd.DataFrame(answerNumDict, columns=answerNumDict.keys(), index=[0]) dfAnswers = dfAnswers.transpose().rename(columns={ 0: "count", 1: "%" }) nums = [n for n in answerNumDict.values()] mysum = sum(nums) for key in answerNumDict: dfAnswers.loc[key, '%'] = float("{:.2f}".format( 100 * (answerNumDict[key] / mysum))) dfAnswers.index.name = quizPart.getQuestion().getQuestionText() dfAnswers.to_excel(writer, sheet_name="q" + str(j + 1)) writer.save() wb = load_workbook("./Results/poll_statistics/" + keyQuizName + "_stats.xlsx") my_blue = openpyxl.styles.colors.Color(rgb='CCE5FF') my_fill_blue = openpyxl.styles.fills.PatternFill( patternType='solid', fgColor=my_blue) my_red = openpyxl.styles.colors.Color(rgb='FFCCCC') my_fill_red = openpyxl.styles.fills.PatternFill( patternType='solid', fgColor=my_red) my_green = openpyxl.styles.colors.Color(rgb='CCFFCC') my_fill_green = openpyxl.styles.fills.PatternFill( patternType='solid', fgColor=my_green) my_orange = openpyxl.styles.colors.Color(rgb='FFE5CC') my_fill_orange = openpyxl.styles.fills.PatternFill( patternType='solid', fgColor=my_orange) for k, ws in enumerate(wb.worksheets): correctAnswer = "" for j, quizPart in enumerate(quizStat.questionStatDict): str2 = str(ws['A1'].value) qmatch = StringComparator( quizPart.getQuestion().getQuestionText(), str2).cmp_ig_CaseSpacePunc if qmatch == 0: correctAnswer = quizPart.getQuestion().getAnswer() break for row in ws.iter_rows(): for cell in row: cell.alignment = Alignment(horizontal='center', vertical='center', text_rotation=0, wrap_text=True, shrink_to_fit=False, indent=1) for cell in ws['A']: cell.alignment = Alignment(horizontal='left', vertical='center', text_rotation=0, wrap_text=True, shrink_to_fit=False, indent=1) for column in ws.iter_cols(): column[0].fill = my_fill_blue for row in ws.iter_rows(): row[0].fill = my_fill_orange trueCellIndex = 0 for cell in ws['A']: s = cell.internal_value if s is not None: for answer in correctAnswer: match = StringComparator(str(s), answer).cmp_ig_C_S_P_N if match == 0: cell.fill = my_fill_green trueCellIndex = cell.row break if match != 0: cell.fill = my_fill_red ws['A1'].fill = my_fill_orange ws['A1'].font = Font(bold=True) ws.column_dimensions['A'].width = 40 ws.column_dimensions['B'].width = 15 ws.column_dimensions['A'].height = 20 p = BarChart3D() data = Reference(worksheet=ws, min_col=2, max_col=ws.max_column, min_row=2, max_row=ws.max_row) # p.add_data(data) p.title = "Answer Distribution" pt = DataPoint(idx=trueCellIndex - 2) pt.graphicalProperties.solidFill = "b2ff59" answers = Reference(worksheet=ws, min_col=1, max_col=1, min_row=2, max_row=ws.max_row) l = list(ws.iter_rows()) g = 2 for row in ws.iter_rows(): value = Reference(worksheet=ws, min_col=3, max_col=3, min_row=g, max_row=g) ans = str(ws['A' + str(g)].internal_value) serie = Series(value, title=ans) if ans != None: for answer in correctAnswer: match = StringComparator(ans, answer).cmp_ig_C_S_P_N if match == 0: serie.graphicalProperties.solidFill = "b2ff59" break p.append(serie) g += 1 p.height = 13 p.width = 20 p.style = 2 p.legend.legendPos.upper() p.y_axis.scaling.min = 0 p.y_axis.scaling.max = 100 p.y_axis.title = "%" ws.add_chart(p, "D1") k += 1 wb.save("./Results/poll_statistics/" + keyQuizName + "_stats.xlsx") self.addIntoExecutionLog( keyQuizName + "_stats.xlsx file has been generated in 'poll_statistics' directory" )
def main(): CATEGORY = 1 SHIHYO = 2 KAMOKU = 3 wb = load_workbook('./for_test.xlsx') ws = wb["Sheet1"] _temp_shihyo = None data_list = [] shihyo_temp = None category_temp = None type_list = [] _years_list = [] _kizyun_list = [] for row in range(1, ws.max_row): _value = ws.cell(row=row, column=1).value type_dict = {} if _value in ['連携', '単体']: type_dict['type'] = _value type_dict['row'] = row type_list.append(type_dict) for index, row in enumerate(range(KAMOKU, ws.max_row + 1)): _data_dict = {} _shigyo = ws.cell(row=row, column=2).value _kamoku = ws.cell(row=row, column=3).value _category = ws.cell(row=row - 1, column=1).value if _category is not None: category_temp = _category sub_dict = {} data = [] _type = None for row_type in type_list: if row > row_type.get('row'): _type = row_type.get('type') if _temp_shihyo != _shigyo and _shigyo is not None and _kamoku is not None: _kamoku_for_store = ws.cell(row=row - 1, column=KAMOKU).value if _kamoku_for_store: for data_row in range(1, 6): _data = ws.cell(row=row - 1, column=KAMOKU + data_row).value data.append(_data) if _kamoku_for_store == '科目': shihyo_temp = _shigyo _years_list = data continue else: sub_dict['type'] = _type sub_dict['category'] = category_temp sub_dict['shihyo'] = shihyo_temp sub_dict['kamoku'] = _kamoku_for_store sub_dict['data'] = data sub_dict['years'] = _years_list shihyo_temp = _shigyo data_list.append(sub_dict) _temp_shihyo = _shigyo if _kamoku is None: _last_kamoku = ws.cell(row=row - 1, column=3).value if _last_kamoku is not None: last_komoku_list = [] _last_komoku_dict = {} for _last_komoku in range(1, 6): _last_value = ws.cell(row=row - 1, column=KAMOKU + _last_komoku).value last_komoku_list.append(_last_value) _last_komoku_dict['type'] = _type _last_komoku_dict['category'] = category_temp _last_komoku_dict['shihyo'] = shihyo_temp _last_komoku_dict['kamoku'] = _last_kamoku _last_komoku_dict['data'] = last_komoku_list _last_komoku_dict['years'] = _years_list shihyo_temp = _shigyo data_list.append(_last_komoku_dict) # 規準を格納する _kizyun_list = [] _kizyun_dict = {} for _kizyun_col in range(1, 6): _kizyun_data = ws.cell(row=row, column=KAMOKU + _kizyun_col).value if _kizyun_data is not None: _kizyun_list.append(_kizyun_data) if len(_kizyun_list) > 0: for _get_data in data_list: if 'kizyun' not in _get_data.keys(): _get_data['kizyun'] = _kizyun_list # draw chart _years_list = [] _kizyun_list = [] _data_data_list_result = [] pprint.pprint(data_list) for _index_one, _dict_data in enumerate(data_list): _data_data_list = [] _keys = list(_dict_data.keys()) if 'data' in _keys and 'years' in _keys: pre_kizyun = None _diff_index = None for _index_two in range(0, len(_dict_data.get('years'))): _tmp = [] _tmp.append(_dict_data.get('years')[_index_two]) _tmp.append(_dict_data.get('type')) _tmp.append(_dict_data.get('category')) _tmp.append(_dict_data.get('shihyo')) _tmp.append(_dict_data.get('kamoku')) _tmp.append(_dict_data.get('kizyun')[_index_two]) _current_kizyun = _dict_data.get('kizyun')[_index_two] _current_data = _dict_data.get('data')[_index_two] if pre_kizyun != None and pre_kizyun != _current_kizyun or _current_data == '-': # TODO: set datapoint _tmp.append(_current_data) _diff_index = _index_two else: _tmp.append(_current_data) pre_kizyun = _current_kizyun if len(_tmp) > 0: _data_data_list.append(_tmp) # Draw data _data_data_list_result.append(_data_data_list) _chart_index = 0 for index, data in enumerate(_data_data_list_result): ws = wb["Sheet2"] c1 = LineChart() c1.style = 13 for _data in data: c1.title = _data[2] + "・" + _data[4] c1.x_axis.title = '年度' c1.y_axis.title = _data[3] c1.legend = None ws.append(_data) size_row = 1 + index * len(data) size_col = len(data) excel_data = Reference(ws, min_col=7, max_col=7, min_row=1 + index * len(data), max_row=(1 + index * len(data)) + len(data) - 1) c1.add_data(excel_data, titles_from_data=False) # style s1 = c1.series[0] s1.marker.graphicalProperties.solidFill = "FEFEFE" s1.marker.graphicalProperties.line.solidFill = "FEFEFE" s1.graphicalProperties.line.noFill = False pt = DataPoint(idx=3) pt.graphicalProperties.line.noFill = True s1.dPt.append(pt) ws.add_chart(c1, "I%s" % _chart_index + str(len(data))) wb.save("line2.xlsx") _chart_index += 2
c.add_data(data, titles_from_data=True) c.title = "Chart with patterns" series = c.series[0] #print(type(series)) print(series.graphicalProperties) #print(c.path) ''' 1. DataPoint代表的就是Chart里的图形,这里是Bar Chart里的柱状图, idx是柱状图的序号,从0开始 2. graphicalProperties是柱状图的图形属性,有多种属性可以改,比如pattern就代表填充的pattern, solidFill就表示的就是填充的颜色等等 3. 填充颜色需要是ColorChoice的实例,颜色的代码可以是srgb,也可以是preset color等等, preset color的值可以参考openpyxl包中的color.py里的定义 ''' pt = DataPoint(idx=0) pt.graphicalProperties.solidFill = ColorChoice(prstClr="red") series.dPt.append(pt) pt = DataPoint(idx=1) pt.graphicalProperties.solidFill = ColorChoice(prstClr="green") series.dPt.append(pt) ''' 1. series本身都有graphicalProperties属性,也可以定义patternfill, solidFill之类的 2. pattFill就是整个series填充的模式,如果没有单独定义图柱的图形属性,那就默认与series的图形属性为准 ''' fill = PatternFillProperties(prst="pct5") fill.foreground = ColorChoice(prstClr="red") fill.background = ColorChoice(prstClr="blue") series.graphicalProperties.pattFill = fill
('Sample', ), (1, ), (2, ), (3, ), (2, ), (3, ), (3, ), (1, ), (2, ), ] for r in rows: ws.append(r) c = LineChart() data = Reference(ws, min_col=1, min_row=1, max_row=8) c.add_data(data, titles_from_data=True) c.title = 'Chart with patterns' # set a pattern for the whole series series = c.series[0] fill = PatternFillProperties(prst='pct5') fill.foreground = ColorChoice(prstClr='red') fill.background = ColorChoice(prstClr='blue') series.graphicalProperties.pattFill = fill # set a pattern for a 6th data point (0-indexed) pt = DataPoint(idx=5) pt.graphicalProperties.pattFill = PatternFillProperties(prst='ltHorz') series.dPt.append(pt) ws.add_chart(c, 'C1') wb.save('pattern.xlsx')
def create_a_report(path_load, path_save, week): workbook = xl.load_workbook( path_load, data_only=True ) # открываем базу с отчетами, data_only=True - только данные (без формул) sheet_1 = workbook.active # выбираем активный лист или sheet_1 = workbook['Отчет для АО НИПОМ'] # выбираем нужный лист wb = Workbook( ) # создаем рабочую книгу, в которую будем сохранять данные из workbook ws = wb.active # создаем рабочий лист ws.sheet_properties.tabColor = "1072BA" # задаем цвет вкладки ws.title = "Графики" # задаем имя вкладки # задаем наименование столбцов ws['A1'] = "Неделя" ws['B1'] = "Wгпэг,\nкВт*ч" ws['C1'] = "Wсм,\nкВт*ч" ws['D1'] = "Wсумм,\nкВт*ч" ws['E1'] = "Wпотр,\nкВт*ч" ws['F1'] = "Wсн,\nкВт*ч" ws['G1'] = "Моточасы\n(ГПЭГ)" ws['H1'] = "Vст (Газ),\nм^3" ws['I1'] = "Qкотла,\nкВт*ч" ws['J1'] = "Vгпэг (Газ),\nм^3" ws['K1'] = "Vкотел (Газ),\nм^3" ws['L1'] = "Vгпэг/Wсумм,\nм3/кВт*ч" ws['M1'] = "T_min,\n°C" ws['N1'] = "T_max,\n°C" ws['O1'] = "Дата начала" ws['P1'] = "Дата\nокончания" i = 2 # переменная для итерации строк в последующем цикле for # for row in range(10073, sheet_1.max_row + 1): # цикл по строкам, начиная с нужной week_OPE = [ 50, 51, 52, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53 ] # количество недель ОПЭ count = 0 for row in range(5034, sheet_1.max_row + 1): # цикл по строкам с данными, начиная с 50-й недели if sheet_1.cell(row, 46).value == week_OPE[i - 2]: # если значение в ячейке # равно номеру недели из списка t_min = ws.cell( i, 13) # создаем переменную минимальной температуры АБ t_max = ws.cell( i, 14) # создаем переменную максимальной температуры АБ data_start = ws.cell(i, 15) if t_min.value is None: # проверка на наличии в ячейке значения t_min.value = 100 if t_max.value is None: # проверка на наличии в ячейке значения t_max.value = 0 if sheet_1.cell( row, 23).value < t_min.value: # проверка на меньшее значение t_min.value = sheet_1.cell(row, 23).value if sheet_1.cell( row, 23).value > t_max.value: # проверка на большее значение t_max.value = sheet_1.cell(row, 23).value if count == 0: data_start.value = sheet_1.cell(row, 3).value count = 1 if sheet_1.cell(row, 46).value == week_OPE[i - 2] and sheet_1.cell( row, 47).value == 0: # если значение в ячейке # равно номеру недели из списка и значение расхода не равно нулю v_kotel = ws.cell( i, 11 ) # создаем переменную расхода котла без учета времени работы ГПЭГ if v_kotel.value is None: # проверка на наличии в ячейке значения v_kotel.value = 0 v_kotel.value += sheet_1.cell( row, 48).value # суммирование значений в ячейках if ws.cell( i, 20).value is None: # проверка на наличии в ячейке значения ws.cell(i, 20).value = 0 ws.cell(i, 20).value += 1 # суммирование количества ячеек if sheet_1.cell( row, 1 ).value is not None: # проверяем пустая ячейка первого столбца или нет # print(sheet_1.cell(row, 1).value) week_cell = ws.cell( i, 1) # создаем переменную строк для столбца с номерами недель power_GPEG = ws.cell( i, 2 ) # создаем переменную строк для столбца с выработанной мощности ГПЭГ power_Sun = ws.cell( i, 3 ) # создаем переменную строк для столбца с выработанной мощности солнечного модуля power_Sum = ws.cell( i, 4 ) # создаем переменную строк для столбца с выработанной суммарной мощностью power_Potr = ws.cell( i, 5 ) # создаем переменную строк для столбца с потребленной нагрузкой мощностью power_SN = ws.cell( i, 6 ) # создаем переменную строк для столбца с собственными нуждами mototime_GPEG = ws.cell( i, 7) # создаем переменную строк для столбца с моточасами ГПЭГ v_Sum = ws.cell( i, 8 ) # создаем переменную строк для столбца с общим потребленным объемом газа data_end = ws.cell(i, 16) week_cell.value = sheet_1.cell( row, 1).value # присваиваем переменной значение из базовой таблицы week_cell.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 1] # формат ячейки 0 power_GPEG.value = sheet_1.cell( row, 29).value # присваиваем переменной значение из базовой таблицы power_GPEG.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 power_Sun.value = sheet_1.cell( row, 30).value # присваиваем переменной значение из базовой таблицы power_Sun.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 power_Sum.value = sheet_1.cell( row, 31).value # присваиваем переменной значение из базовой таблицы power_Sum.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 power_Potr.value = sheet_1.cell( row, 32).value # присваиваем переменной значение из базовой таблицы power_Potr.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 power_SN.value = sheet_1.cell( row, 33).value # присваиваем переменной значение из базовой таблицы power_SN.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 mototime_GPEG.value = sheet_1.cell( row, 34).value # присваиваем переменной значение из базовой таблицы mototime_GPEG.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 v_Sum.value = sheet_1.cell( row, 35).value # присваиваем переменной значение из базовой таблицы v_Sum.number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 data_end.value = sheet_1.cell(row, 3).value count = 0 i += 1 for i in range(2, ws.max_row + 1): if ws.cell(i, 1).value is not None: ws.cell(i, 11).value = ws.cell(i, 11).value / ( ws.cell(i, 20).value / 30) * 168 # столбец с данными расхода газа котлом ws.cell( i, 11).number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 ws.cell(i, 10).value = ws.cell(i, 8).value - ws.cell( i, 11).value # столбец с данными расхода газа ГПЭГ ws.cell( i, 10).number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 ws.cell(i, 9).value = ws.cell( i, 11 ).value * 9.5 # столбец с данными выработки тепловой энергии котла ws.cell(i, 9).number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 1] # формат ячейки 0 ws.cell(i, 12).value = ws.cell(i, 10).value / ws.cell( i, 4 ).value # расчет эффективности выработки БКЭУ, выраженной через Vгпэг / Wсумм ws.cell( i, 12).number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[ 2] # формат ячейки 0.00 ws.cell( i, 20).value = None # удаляем временное значение количества ячеек else: ws.cell( i, 11 ).value = None # удаляем значения выходящие за пределы расчетных недель ws.cell( i, 13 ).value = None # удаляем значения выходящие за пределы расчетных недель ws.cell( i, 14 ).value = None # удаляем значения выходящие за пределы расчетных недель ws.cell( i, 15 ).value = None # удаляем значения выходящие за пределы расчетных недель ws.cell( i, 20 ).value = None # удаляем значения выходящие за пределы расчетных недель # задаем ширину столбцов ws.column_dimensions['A'].width = 10 ws.column_dimensions['B'].width = 10 ws.column_dimensions['C'].width = 10 ws.column_dimensions['D'].width = 10 ws.column_dimensions['E'].width = 10 ws.column_dimensions['F'].width = 10 ws.column_dimensions['G'].width = 12 ws.column_dimensions['H'].width = 10 ws.column_dimensions['I'].width = 10 ws.column_dimensions['J'].width = 12 ws.column_dimensions['K'].width = 14 ws.column_dimensions['L'].width = 15 ws.column_dimensions['M'].width = 10 ws.column_dimensions['N'].width = 10 ws.column_dimensions['O'].width = 18 ws.column_dimensions['P'].width = 18 thin_border = Border( # выделение границ ячеек left=Side(border_style=BORDER_THIN, color='00000000'), right=Side(border_style=BORDER_THIN, color='00000000'), top=Side(border_style=BORDER_THIN, color='00000000'), bottom=Side(border_style=BORDER_THIN, color='00000000')) # цикл для задания ячейкам заголовков свойств for row in ws.iter_cols(min_col=1, max_col=16, min_row=1, max_row=1): for cel in row: cel.font = Font(size=12, bold=True) # размер шрифта и жирное выделение cel.alignment = Alignment( horizontal="center", vertical="center", wrapText=True ) # выравнивание по центру и разрешение переноса строк cel.fill = PatternFill(start_color="EEEEEE", end_color="EEEEEE", fill_type="solid") # цикл для выделения границ ячеек for row in ws.iter_cols(min_col=1, max_col=16, min_row=1, max_row=ws.max_row): for cel in row: cel.border = thin_border # print(week) # print(ws.cell(ws.max_row-1, 1).value) if ws.cell(ws.max_row - 1, 1).value < week: return "Задана неделя вне диапазона текущего ОПЭ, равного {} недель в 2021 году".format( ws.cell(ws.max_row - 1, 1).value) # построение графиков # график "ДИАГРАММА ИЗМЕРЯЕМЫХ ПРАМЕТРОВ ПО НЕДЕЛЯМ" cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=2, max_col=8) # chart = LineChart() chart = BarChart() chart.y_axis.title = 'Параметры' chart.x_axis.title = 'Недели' chart.height = 10 chart.width = 30 chart.add_data(values, titles_from_data=True) chart.set_categories(cats) ws.add_chart(chart, "A{}".format(ws.max_row + 2)) # график выработки ГПЭГ, СМ и общий ch1 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=2, max_col=4) ch1.title = "ВЫРАБОТКА ЭЛЕКТРОЭНЕРГИИ" # заголовок ch1.style = 13 # шрифт ch1.height = 10 # высота ch1.width = 20 # ширина ch1.x_axis.title = 'Недели' # подпись оси х ch1.y_axis.title = 'кВт*ч' # подпись оси у ch1.legend.position = 'r' # позиция подписей данных справа ch1.add_data( values, titles_from_data=True) # загрузка данных с заголовками столбцов ch1.set_categories(cats) # загрузка подписи оси х ch1.series[0].graphicalProperties.line.solidFill = "85C1E9" # цвет синий ch1.series[1].graphicalProperties.line.solidFill = "F7DC6F" # цвет желтый ch1.series[2].graphicalProperties.line.solidFill = "EC7063" # цвет красный ch1.series[0].graphicalProperties.solidFill = "85C1E9" # цвет синий ch1.series[1].graphicalProperties.solidFill = "F7DC6F" # цвет желтый ch1.series[2].graphicalProperties.solidFill = "EC7063" # цвет красный ws.add_chart(ch1, "A{}".format(ws.max_row + 22)) # загрузка графика в ячейку # график ПОТРЕБЛЕНИЕ ЭЛЕКТРОЭНЕРГИИ ch2 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=4, max_col=6) ch2.title = "ПОТРЕБЛЕНИЕ ЭЛЕКТРОЭНЕРГИИ" # заголовок ch2.style = 13 # шрифт ch2.height = 10 # высота ch2.width = 20 # ширина ch2.x_axis.title = 'Недели' # подпись оси х ch2.y_axis.title = 'кВт*ч' # подпись оси у ch2.legend.position = 'r' # позиция подписей данных справа ch2.add_data( values, titles_from_data=True) # загрузка данных с заголовками столбцов ch2.set_categories(cats) # загрузка подписи оси х ch2.series[ 0].graphicalProperties.line.solidFill = "EC7063" # цвет линии красный ch2.series[ 1].graphicalProperties.line.solidFill = "F7DC6F" # цвет линии желтый ch2.series[ 2].graphicalProperties.line.solidFill = "85C1E9" # цвет линии синий ch2.series[ 0].graphicalProperties.solidFill = "EC7063" # цвет заливки красный ch2.series[ 1].graphicalProperties.solidFill = "F7DC6F" # цвет заливки желтый ch2.series[ 2].graphicalProperties.solidFill = "85C1E9" # цвет заливки синий ws.add_chart(ch2, "A{}".format(ws.max_row + 42)) # загрузка графика в ячейку # график ПОТРЕБЛЕНИЕ ГАЗА ch3 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=10, max_col=11) ch3.title = "ПОТРЕБЛЕНИЕ ГАЗА" # заголовок ch3.style = 13 # шрифт ch3.height = 10 # высота ch3.width = 20 # ширина ch3.x_axis.title = 'Недели' # подпись оси х ch3.y_axis.title = 'м3' # подпись оси у ch3.legend.position = 'r' # позиция подписей данных справа ch3.add_data( values, titles_from_data=True) # загрузка данных с заголовками столбцов ch3.set_categories(cats) # загрузка подписи оси х ch3.series[ 0].graphicalProperties.line.solidFill = "EC7063" # цвет линии красный ch3.series[ 1].graphicalProperties.line.solidFill = "85C1E9" # цвет линии синий ch3.series[ 0].graphicalProperties.solidFill = "EC7063" # цвет заливки красный ch3.series[ 1].graphicalProperties.solidFill = "85C1E9" # цвет заливки синий ch31 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values1 = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=8, max_col=8) ch31.title = "ПОТРЕБЛЕНИЕ ГАЗА" # заголовок ch31.style = 13 # шрифт ch31.height = 10 # высота ch31.width = 20 # ширина ch31.x_axis.title = 'Недели' # подпись оси х ch31.y_axis.title = 'м3' # подпись оси у ch31.legend.position = 'r' # позиция подписей данных справа ch31.add_data( values1, titles_from_data=True) # загрузка данных с заголовками столбцов ch31.set_categories(cats) # загрузка подписи оси х ch3 += ch31 ws.add_chart(ch3, "A{}".format(ws.max_row + 62)) # загрузка графика в ячейку # график ЭФФЕКТИВНОСТЬ ВЫРАБОТКИ ЭЛЕКТРОЭНЕРГИИ БКЭУ ch4 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=12, max_col=12) ch4.title = "ЭФФЕКТИВНОСТЬ ВЫРАБОТКИ ЭЛЕКТРОЭНЕРГИИ БКЭУ" # заголовок ch4.style = 13 # шрифт ch4.height = 10 # высота ch4.width = 20 # ширина ch4.x_axis.title = 'Недели' # подпись оси х ch4.y_axis.title = 'м3/кВт*ч' # подпись оси у ch4.legend.position = 'r' # позиция подписей данных справа ch4.add_data( values, titles_from_data=True) # загрузка данных с заголовками столбцов ch4.set_categories(cats) # загрузка подписи оси х ch4.series[ 0].graphicalProperties.line.solidFill = "28B463" # цвет линии зеленый ch4.series[ 0].graphicalProperties.solidFill = "28B463" # цвет заливки зеленый ws.add_chart(ch4, "A{}".format(ws.max_row + 82)) # загрузка графика в ячейку # график ВЫРАБОТКА ТЕПЛОВОЙ ЭНЕРГИИ ch5 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=9, max_col=9) ch5.title = "ВЫРАБОТКА ТЕПЛОВОЙ ЭНЕРГИИ" # заголовок ch5.style = 13 # шрифт ch5.height = 10 # высота ch5.width = 20 # ширина ch5.x_axis.title = 'Недели' # подпись оси х ch5.y_axis.title = 'кВт*ч' # подпись оси у ch5.legend.position = 'r' # позиция подписей данных справа ch5.add_data( values, titles_from_data=True) # загрузка данных с заголовками столбцов ch5.set_categories(cats) # загрузка подписи оси х ch5.series[ 0].graphicalProperties.line.solidFill = "C0392B" # цвет линии красный ch5.series[ 0].graphicalProperties.solidFill = "C0392B" # цвет заливки красный ws.add_chart(ch5, "A{}".format(ws.max_row + 102)) # загрузка графика в ячейку # расчет суммы выработки ГПЭГ и СМ для построения общей диаграммы ws.cell(ws.max_row, 2).value = 0 ws.cell(ws.max_row, 3).value = 0 for i in range(2, ws.max_row + 1): if ws.cell(i, 1).value is None: ws.cell(i, 1).value = "Итого:" break if ws.cell(i, 2).value is not None: ws.cell(ws.max_row, 2).value += ws.cell(i, 2).value if ws.cell(i, 3).value is not None: ws.cell(ws.max_row, 3).value += ws.cell(i, 3).value ws.cell(ws.max_row, 3).number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[1] ws.cell(ws.max_row, 2).number_format = openpyxl.styles.numbers.BUILTIN_FORMATS[1] # построение общей диаграммы выработки ГПЭГ и СМ за отчетный период chart_itog = PieChart() labels = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=1) data = Reference(ws, min_col=2, max_col=3, min_row=ws.max_row, max_row=ws.max_row) chart_itog.title = "Выработка за отчетный период {} недель".format( ws.max_row - 2) chart_itog.style = 13 # шрифт chart_itog.height = 10 # высота chart_itog.width = 20 # ширина chart_itog.add_data( data, titles_from_data=True) # загрузка данных с заголовками столбцов chart_itog.set_categories(labels) # загрузка подписи оси х slice = DataPoint(idx=0, explosion=15) # разделение пирога и сдвиг на 15 пунктов chart_itog.series[0].data_points = [ slice ] # применение сдвига к первому значению ws.add_chart(chart_itog, "A{}".format(ws.max_row + 122)) # график температур внутри блок-бокса ch6 = LineChart() cats = Reference(ws, min_row=2, max_row=ws.max_row - 1, min_col=1, max_col=1) values = Reference(ws, min_row=1, max_row=ws.max_row - 1, min_col=13, max_col=14) ch6.title = "ТЕМПЕРАТУРА ВНУТРИ БКЭУ" # заголовок ch6.style = 13 # шрифт ch6.height = 10 # высота ch6.width = 20 # ширина ch6.x_axis.title = 'Недели' # подпись оси х ch6.y_axis.title = '°C' # подпись оси у ch6.legend.position = 'r' # позиция подписей данных справа ch6.add_data( values, titles_from_data=True) # загрузка данных с заголовками столбцов ch6.set_categories(cats) # загрузка подписи оси х ch6.series[0].graphicalProperties.line.solidFill = "85C1E9" # цвет синий ch6.series[1].graphicalProperties.line.solidFill = "EC7063" # цвет красный ch6.series[0].graphicalProperties.solidFill = "85C1E9" # цвет синий ch6.series[1].graphicalProperties.solidFill = "EC7063" # цвет красный ws.add_chart(ch6, "A{}".format(ws.max_row + 142)) # загрузка графика в ячейку wb.save(path_save + '\\Графики.xlsx') # сохранение таблицы в указанную директорию # -------Генерация автоматического отчета в WORD------------------------ template = DocxTemplate('temp6707.docx') #week = 17 # задаем номер недели для отчета # задаем начальные значения недельных параметров Wfull = 0 Wcm = 0 Wgpeg = 0 Wcn = 0 Wnagr = 0 Qgvk = 0 moto = 0 Vgvk = 0 Vgpeg = 0 Vbkeu = 0 Tmin = 0 Tmax = 0 # задаем начальные значения суммы параметров за период с начала ОПЭ Wfull_sum = 0 Wcm_sum = 0 Wgpeg_sum = 0 Wcn_sum = 0 Wnagr_sum = 0 Qgvk_sum = 0 Vgvk_sum = 0 Vgpeg_sum = 0 Vbkeu_sum = 0 moto_sum = 0 # задаем начальные значения дня и месяца начала и окончания недели d_start = 0 m_start = 0 d_end = 0 m_end = 0 # рассчитываем значения за неделю и сумму с начала ОПЭ for i in range(2, ws.max_row): Wfull_sum += ws.cell(i, 4).value Wcm_sum += ws.cell(i, 3).value Wgpeg_sum += ws.cell(i, 2).value Wcn_sum += ws.cell(i, 6).value Wnagr_sum += ws.cell(i, 5).value Qgvk_sum += ws.cell(i, 9).value Vgvk_sum += ws.cell(i, 11).value Vgpeg_sum += ws.cell(i, 10).value Vbkeu_sum += ws.cell(i, 8).value moto_sum += ws.cell(i, 7).value if ws.cell(i, 1).value == week: Wfull = ws.cell(i, 4).value Wcm = ws.cell(i, 3).value Wgpeg = ws.cell(i, 2).value Wcn = ws.cell(i, 6).value Wnagr = ws.cell(i, 5).value Qgvk = ws.cell(i, 9).value moto = ws.cell(i, 7).value Vgvk = ws.cell(i, 11).value Vgpeg = ws.cell(i, 10).value Vbkeu = ws.cell(i, 8).value Tmin = ws.cell(i, 13).value Tmax = ws.cell(i, 14).value d_start = ws.cell(i, 15).value m_start = ws.cell(i, 15).value d_end = ws.cell(i, 16).value m_end = ws.cell(i, 16).value break def month_name(num): # функция возврата названия месяца по его номеру ru = [ 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря' ] return ru[int(num) - 1] # Объявляем значения переменных, идентичных шаблону в документе word context = { 'week': week, 'year': d_end.strftime('%Y'), 'Wfull': round(Wfull, 2), 'Wcm': round(Wcm, 2), 'Wgpeg': round(Wgpeg, 2), 'Wcn': round(Wcn, 2), 'Wnagr': round(Wnagr, 2), 'Qgvk': round(Qgvk, 1), 'moto': moto, 'Vgvk': round(Vgvk, 2), 'Vgpeg': round(Vgpeg, 2), 'Vbkeu': round(Vbkeu, 2), 'Tmin': Tmin, 'Tmax': Tmax, 'Wfull_sum': round(Wfull_sum, 1), 'Wcm_sum': round(Wcm_sum, 1), 'Wgpeg_sum': round(Wgpeg_sum, 1), 'Wcn_sum': round(Wcn_sum, 1), 'Wnagr_sum': round(Wnagr_sum, 1), 'Qgvk_sum': round(Qgvk_sum), 'Vgvk_sum': round(Vgvk_sum, 1), 'Vgpeg_sum': round(Vgpeg_sum, 1), 'Vbkeu_sum': round(Vbkeu_sum, 1), 'moto_sum': moto_sum, 'd_start': d_start.strftime('%d'), 'm_start': month_name(m_start.strftime('%m')), 'd_end': d_end.strftime('%d'), 'm_end': month_name(m_end.strftime('%m')) } # создаем автоматизированный отчет template.render(context) template.save(path_save + '\\Еженедельный отчет по ОПЭ БКЭУ-{}.docx'.format(week) ) # сохранение отчета с атоприсвоением номера недели file_path = path_save + '\\Еженедельный отчет по ОПЭ БКЭУ-{}.docx'.format( week) os.startfile(file_path) return "Отчет успешно сформирован"