コード例 #1
0
def add_pie_chart(writer, df):
    # 初始化excel并确立图表类型
    sheet = writer.sheets['全球最新疫情分布']
    chart = PieChart()
    # 设置插入序列
    max_row = len(df)
    labels = Reference(sheet,
                       min_col=2,
                       max_col=2,
                       min_row=2,
                       max_row=max_row + 1)
    chart_data = Reference(sheet,
                           min_col=3,
                           max_col=3,
                           min_row=1,
                           max_row=max_row + 1)
    chart.add_data(chart_data, titles_from_data=True)
    chart.set_categories(labels)
    # 设置图表格式
    chart.title = "除湖北外全球各地区确诊人数占比"
    chart.height, chart.width = 14, 21
    chart.style = 5
    chart.dataLabels = DataLabelList()
    chart.dataLabels.showCatName = True
    chart.dataLabels.showPercent = True
    # 插入图表
    sheet.add_chart(chart, 'F1')
    writer.save()
コード例 #2
0
    def create_platform_demographics_from_csv(self, csv_file_location):
        with open(csv_file_location) as f:
            csv_reader = csv.reader(f)
            ws = self.worksheets[ExcelBuilder.PlatformDemographics]
            if not isinstance(ws, openpyxl.worksheet.Worksheet):
                print("not a worksheet: " + str(ws))
                return
            number_of_rows = 0

            ws['A1'] = str(ExcelBuilder.PlatformDemographics)
            ws.merge_cells(start_row=1,
                           start_column=1,
                           end_row=1,
                           end_column=8)
            font = Font(bold=True, color=colors.RED)
            grey = "D9D9D9"
            fill = PatternFill(fill_type='solid',
                               start_color=grey,
                               end_color=grey)
            alignment = Alignment(horizontal='center', vertical='center')
            self.set_cell_formatting(ws['A1'], font, fill, None, alignment,
                                     None)

            for row_index, row in enumerate(csv_reader):
                number_of_rows += 1
                for column_index, csv_cell in enumerate(row):
                    column_letter = get_column_letter(column_index + 1)
                    row_lookup_index = str(row_index + 2)
                    this_cell = ws[str(column_letter + row_lookup_index)]

                    if not isinstance(this_cell, openpyxl.cell.Cell):
                        print("what the hell is going on. not a cell?!: " +
                              str(this_cell))
                        continue

                    this_cell.value = csv_cell

                    font = None
                    fill = None
                    border = None
                    alignment = None
                    number_format = None

                    if column_index == 1 and str(csv_cell).isdigit():
                        number_format = openpyxl.styles.numbers.FORMAT_NUMBER
                        this_cell.value = int(csv_cell)

                    self.set_cell_formatting(this_cell, font, fill, border,
                                             alignment, number_format)

            # Create and add pie chart
            pie = PieChart()
            labels = Reference(ws,
                               min_col=1,
                               min_row=2,
                               max_col=1,
                               max_row=number_of_rows + 1)
            data = Reference(ws,
                             min_col=2,
                             min_row=2,
                             max_col=2,
                             max_row=number_of_rows + 1)
            pie.add_data(data)
            pie.set_categories(labels)
            pie.title = None
            pie.style = 2
            pie.height = 13
            pie.width = 21.55

            ws.add_chart(pie, anchor='A2')

            # Add the last note

            ws['A28'] = "NOTE: Which platforms are being utilized the most by the attendees? For more info visit " \
                        "socioevents.com or reach us at [email protected]!"

            ws.merge_cells(start_row=28,
                           start_column=1,
                           end_row=30,
                           end_column=8)
            font = Font(bold=True, )
            alignment = Alignment(horizontal='left',
                                  wrap_text=True,
                                  vertical='top')
            self.set_cell_formatting(ws['A28'], font, fill, None, alignment,
                                     None)

        os.remove(csv_file_location)
コード例 #3
0
from openpyxl.drawing.fill import PatternFillProperties, ColorChoice
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.styles import Color, Fill

filePath = "F:/AllState_Python2018/logs/reports/GDP.xlsx"
wb = load_workbook(filePath, read_only=False, data_only=True)

sheetNames = wb.get_sheet_names()
print(sheetNames)

sheet = wb.get_sheet_by_name('GDP')

for row in range(6, 50):
    for col in range(1, 6):
        print(sheet.cell(row=row, column=col).value)

chart = PieChart()
chart.title = "World GDP Ranking"
chart.style = 10
#chart.x_axis.title="Country Code"
#chart.y_axis.title="Rank"

#props = GraphicalProperties(solidFill="999999")
#chart.plot_area.graphicalProperties = props

xdata = Reference(sheet, min_col=1, min_row=6, max_row=50)
ydata = Reference(sheet, min_col=2, min_row=6, max_row=50)
chart.add_data(ydata, titles_from_data=True)
chart.set_categories(xdata)
sheet.add_chart(chart, "G10")
wb.save(filePath)
コード例 #4
0
ファイル: 004excel.py プロジェクト: ichengplus/python1024
def auto_chart(in_path, out_path):
    """
    自动生成报告
    汇总某个文件夹内所有同类Excel文件,输出报表
    以时间维度,粒度为月,汇总统计单店经营和全国经营
    输出报表:
        1. 各门店经营:销售额、成本、毛利
        2. 全国经营:销售额,成本,毛利
        3. 门店总排行榜:销售额、毛利润
    TODO: 可以增加产品维度的统计作为练习。

    Version: 0.0.1
    Author : yichu.cheng
    """
    wb = Workbook()
    ws_all = wb.active
    ws_all.title = '全国汇总'
    # 一、先为每个门店生成一张单店经营表
    # 月份, 总营收, 总折扣, 总成本, 总毛利
    shop_list = list(in_path.glob('*.xlsx'))
    shop_names = [shop.stem for shop in shop_list]
    for shop in shop_list:
        # shop = shop_list[0]
        print(f'正在处理 {shop.stem} 表......')
        wb_shop = load_workbook(shop)  # 打开城市门店数据
        ws_shop = wb_shop.active
        shop_name = shop.stem
        ws = wb.create_sheet(shop_name)  # 生成对应城市门店表
        # 表头
        header_list = ['月份', '销售额', '折扣额', '成本', '毛利润']
        ws.append(header_list)
        # 从1到12月生成数据汇总表
        for m in range(1, 13):
            start_date = datetime.datetime(2020, m, 1)
            _, days_in_month = calendar.monthrange(
                start_date.year, start_date.month)
            end_date = start_date + datetime.timedelta(days=days_in_month)
            # print(m, start_date, end_date)
            # 按月提取数据
            month_data_list = [
                ([ws_shop.cell(row=i, column=j).value for j in range(6, 10)])
                for i in range(2, ws_shop.max_row + 1)
                if start_date <= ws_shop.cell(row=i, column=1).value < end_date
            ]
            # 累加汇总
            # zip(*list)可以把list中的tuple重新按序打包
            month_data_T = list(zip(*month_data_list))
            month_sum = [
                f'{m}月',
                sum(month_data_T[1]),  # sum of sale
                # sum of sale*(1-discount) 折扣总额
                sum([a*(1-b) for a, b in zip(month_data_T[1], month_data_T[0])]),
                sum(month_data_T[2]),  # sum of cost
                sum(month_data_T[3])  # sum of profit
            ]
            ws.append(month_sum)
        year_sum = [
            '全年总计',
            '=SUM(B2:B13)',
            '=SUM(C2:C13)',
            '=SUM(D2:D13)',
            '=SUM(E2:E13)'
        ]
        ws.append(year_sum)
        # 画个月度统计图表
        # 列状图
        bar_chart = BarChart()
        bar_chart.type = 'col'  # 列状图
        bar_chart.style = 10
        bar_chart.title = '门店经营统计图'
        bar_chart.y_axis.title = '金额'
        bar_chart.x_axis.title = '月份'
        d_ref = Reference(ws, min_col=2, min_row=1, max_row=13, max_col=5)
        cat = Reference(ws, min_col=1, min_row=2, max_row=13)
        bar_chart.add_data(d_ref, titles_from_data=True)
        bar_chart.set_categories(cat)
        ws.add_chart(bar_chart, 'A17')

    # 开始处理全国总表
    print('开始处理全国总表......')
    ws_all.append(header_list)
    for m in range(1, 13):
        # (销售额, 折扣额, 成本, 毛利润)
        month_all_shop = [
            ([wb[shop].cell(row=m+1, column=j).value
              for j in range(2, 6)])
            for shop in shop_names
        ]
        month_all_shop_T = list(zip(*month_all_shop))
        month_all_sum = [
            f'{m}月',
            sum(month_all_shop_T[0]),  # sale
            sum(month_all_shop_T[1]),  # discount
            sum(month_all_shop_T[2]),  # cost
            sum(month_all_shop_T[3]),  # profit
        ]
        ws_all.append(month_all_sum)
    ws_all.append(year_sum)

    # 生成全国月度统计报表
    bar_chart = BarChart()
    bar_chart.type = 'col'  # 列状图
    bar_chart.style = 10
    bar_chart.title = '全国经营统计图'
    bar_chart.y_axis.title = '金额'
    bar_chart.x_axis.title = '月份'
    d_ref = Reference(ws_all, min_col=2, min_row=1, max_row=13, max_col=5)
    cat = Reference(ws_all, min_col=1, min_row=2, max_row=13)
    bar_chart.add_data(d_ref, titles_from_data=True)
    bar_chart.set_categories(cat)
    ws_all.add_chart(bar_chart, 'J1')

    # 生成城市门店排名数据
    header_list = ['城市门店', '年度销售额', '年度毛利润']
    for j in range(3):
        ws_all.cell(row=19, column=j+1, value=header_list[j])
    for i, shop in enumerate(shop_names, start=2):
        ws_shop = wb[shop]
        year_sale = sum([ws_shop.cell(row=r, column=2).value
                         for r in range(2, 14)])
        year_profit = sum([ws_shop.cell(row=r, column=5).value
                           for r in range(2, 14)])
        ws_all.append([
            shop, year_sale, year_profit
        ])

    # 排序
    ws_all.auto_filter.ref = 'A19:C27'
    ws_all.auto_filter.add_sort_condition('B20:B27')
    # 生成排名图表
    bar_chart = BarChart()
    bar_chart.type = 'col'
    bar_chart.style = 10
    bar_chart.title = '城市门店年度经营'
    bar_chart.y_axis.title = '年度销售额'
    bar_chart.x_axis.title = '城市门店'
    d_ref = Reference(ws_all, min_col=2, min_row=19, max_row=27, max_col=3)
    cat = Reference(ws_all, min_col=1, min_row=20, max_row=27)
    bar_chart.add_data(d_ref, titles_from_data=True)
    bar_chart.set_categories(cat)
    ws_all.add_chart(bar_chart, 'J19')
    # 门店销售额比例饼图
    pie_chart = PieChart()
    pie_chart.dataLabels = DataLabelList()
    pie_chart.dataLabels.showPercent = True
    pie_chart.style = 10
    pie_chart.title = '门店销量占比'
    d_ref = Reference(ws_all, min_col=2, min_row=19, max_row=27)
    cat = Reference(ws_all, min_col=1, min_row=20, max_row=27)
    pie_chart.add_data(d_ref, titles_from_data=True)
    pie_chart.set_categories(cat)
    ws_all.add_chart(pie_chart, 'S1')
    # 门店利润比例饼图
    pie_chart = PieChart()
    pie_chart.dataLabels = DataLabelList()
    pie_chart.dataLabels.showPercent = True
    pie_chart.title = '门店利润占比'
    d_ref = Reference(ws_all, min_col=3, min_row=19, max_row=27)
    cat = Reference(ws_all, min_col=1, min_row=20, max_row=27)
    pie_chart.add_data(d_ref, titles_from_data=True)
    pie_chart.set_categories(cat)
    ws_all.add_chart(pie_chart, 'S19')

    wb.save(out_path)
コード例 #5
0
def excel_create_chart(excel_file):
    """
    生成图表
    :param excel_file:
    :return:
    """
    wb = load_workbook(excel_file)
    print(f'{datetime.now()} | 信息 | 开始Excel图表渲染')
    # 进行净值走势图渲染
    net_worth_sheet = wb['账户净值']
    net_worth_chart_sheet = wb.create_chartsheet(title='净值走势图')
    chart1 = LineChart()
    dates1 = Reference(net_worth_sheet,
                       min_col=1,
                       min_row=2,
                       max_row=len(net_worth_sheet['A']))
    data1 = Reference(net_worth_sheet,
                      min_col=3,
                      min_row=1,
                      max_row=len(net_worth_sheet['C']))
    chart1.add_data(data1, titles_from_data=True)
    chart1.y_axis = NumericAxis(title='净值', majorTickMark='out')
    chart1.x_axis = TextAxis(majorTickMark='out',
                             tickLblSkip=10,
                             tickMarkSkip=10,
                             noMultiLvlLbl=True,
                             numFmt='yyyy-mm-dd')
    chart1.legend = None
    chart1.title = str()
    chart1.style = 1
    chart1.set_categories(dates1)
    net_worth_chart_sheet.add_chart(chart1)
    # 进行权益走势图渲染
    account_sheet = wb['账户统计']
    account_chart_sheet = wb.create_chartsheet(title='权益走势图')
    dates2 = Reference(account_sheet,
                       min_col=1,
                       min_row=2,
                       max_row=len(account_sheet['A']))
    chart2 = LineChart(varyColors=True)
    data2 = Reference(account_sheet,
                      min_col=8,
                      min_row=1,
                      max_row=len(account_sheet['H']))
    chart2.add_data(data2, titles_from_data=True)
    chart2.y_axis = NumericAxis(title='权益', majorTickMark='out')
    chart2.legend = None
    chart2.set_categories(dates2)
    chart3 = BarChart()
    data3 = Reference(account_sheet,
                      min_col=10,
                      min_row=1,
                      max_row=len(account_sheet['J']))
    chart3.add_data(data3, titles_from_data=True)
    chart3.y_axis = NumericAxis(axId=200,
                                title='风险度',
                                majorGridlines=None,
                                majorTickMark='out',
                                crosses='max')
    chart3.x_axis = TextAxis(majorTickMark='out',
                             tickLblSkip=10,
                             tickMarkSkip=10,
                             noMultiLvlLbl=True,
                             numFmt='yyyy-mm-dd')
    chart3.legend = None
    chart3.set_categories(dates2)
    chart2 += chart3
    account_chart_sheet.add_chart(chart2)
    # 进行交易分布图的渲染
    categories_analysis_sheet = wb['交易分析(按品种)']
    trading_frequency_analysis_sheet = wb.create_chartsheet(title='交易分布图')
    labels = Reference(categories_analysis_sheet,
                       min_col=1,
                       min_row=2,
                       max_row=len(categories_analysis_sheet['A']))
    chart4 = PieChart(varyColors=True)
    chart4.style = 34
    data4 = Reference(categories_analysis_sheet,
                      min_col=4,
                      min_row=2,
                      max_row=len(categories_analysis_sheet['D']))
    chart4.add_data(data4)
    chart4.set_categories(labels)
    chart4.legend = None
    # chart4.series[0].data_points = [DataPoint(idx=i, explosion=8)
    #                                 for i in range(len(categories_analysis_sheet['D']) - 1)]
    chart4.series[0].dLbls = DataLabelList(dLblPos='bestFit',
                                           showPercent=True,
                                           showCatName=True,
                                           showVal=True,
                                           showLeaderLines=True)
    chart4.layout = Layout(manualLayout=ManualLayout(
        x=0, y=0, h=0.75, w=0.75, xMode='factor', yMode='factor'))
    trading_frequency_analysis_sheet.add_chart(chart4)
    # 进行品种盈亏图的渲染
    categories_win_and_loss_chart_sheet = wb.create_chartsheet(title='品种盈亏图')
    chart5 = BarChart(barDir='col')
    chart5.style = 18
    data5 = Reference(categories_analysis_sheet,
                      min_col=2,
                      min_row=2,
                      max_row=len(categories_analysis_sheet['B']))
    chart5.add_data(data5)
    chart5.set_categories(labels)
    chart5.legend = None
    chart5.series[0].dLbls = DataLabelList(showVal=True)
    chart5.y_axis = NumericAxis(title='平仓盈亏',
                                majorTickMark='out',
                                minorTickMark='out')
    categories_win_and_loss_chart_sheet.add_chart(chart5)
    # 进行交易盈亏图的渲染
    trading_win_and_loss_chart_sheet = wb.create_chartsheet(title='交易盈亏图')
    chart6 = RadarChart()
    chart6.style = 24
    data6 = Reference(categories_analysis_sheet,
                      min_col=8,
                      max_col=9,
                      min_row=1,
                      max_row=categories_analysis_sheet.max_row)
    chart6.add_data(data6, titles_from_data=True)
    chart6.set_categories(labels)
    trading_win_and_loss_chart_sheet.add_chart(chart6)
    # 图表保存
    wb.save(excel_file)
    wb.close()
    # 输出信息
    print(f'{datetime.now()} | 信息 | 已生成Excel图表')
コード例 #6
0
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 "Отчет успешно сформирован"