コード例 #1
0
ファイル: chart.py プロジェクト: sunxiaoou/py
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")
コード例 #2
0
ファイル: main.py プロジェクト: realKyawSwar/regen_time
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")
コード例 #3
0
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')
コード例 #4
0
    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"
            )
コード例 #5
0
    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
コード例 #6
0
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
コード例 #7
0
ファイル: test2.py プロジェクト: jeanmoongill/genba
    ('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')
コード例 #8
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 "Отчет успешно сформирован"