From aa8d71dec1cc34627e28c6567c7bc20d84b69e7b Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 14:48:09 +0800 Subject: [PATCH 01/25] 1. Change the subspace location 2. Added a cost ratio module --- myems-api/excelexporters/spacecost.py | 261 ++++++++++++++++---------- 1 file changed, 159 insertions(+), 102 deletions(-) diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 5a12ce35..7cf0a6a5 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -273,7 +273,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name + '分时用电成本' + ws['B12'] = name + ' 分时用电成本' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -343,131 +343,84 @@ def generate_excel(report, ws.add_chart(pie, "D13") - else: - for i in range(12, 18 + 1): - ws.row_dimensions[i].height = 0.1 - ################################## + current_row_number = 19 - has_child_flag = True + has_subtotals_data_flag = True - if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \ - len(report['child_space']["energy_category_names"]) == 0 \ - or 'child_space_names_array' not in report['child_space'].keys() \ - or report['child_space']['energy_category_names'] is None \ - or len(report['child_space']['child_space_names_array']) == 0 \ - or len(report['child_space']['child_space_names_array'][0]) == 0: - has_child_flag = False - - if has_child_flag: - child = report['child_space'] + if 'subtotals' not in reporting_period_data.keys() or \ + reporting_period_data['subtotals'] is None: + has_subtotals_data_flag = False + if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + ws['B' + str(current_row_number)] = name + ' 成本占比' current_row_number += 1 table_start_row_number = current_row_number - ws.row_dimensions[current_row_number].height = 60 ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = name_font + ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ca_len = len(child['energy_category_names']) - col = '' + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '成本占比' - for i in range(0, ca_len): - col = chr(ord('C') + i) - ws[col + str(current_row_number)].fill = table_fill - ws[col + str(current_row_number)].font = title_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' - - col = chr(ord(col) + 1) - ws[col + str(current_row_number)].fill = table_fill - ws[col + str(current_row_number)].font = title_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')' - - space_len = len(child['child_space_names_array'][0]) - - for i in range(0, space_len): - current_row_number += 1 - row = str(current_row_number) - - ws['B' + row].font = name_font - ws['B' + row].alignment = c_c_alignment - ws['B' + row] = child['child_space_names_array'][0][i] - ws['B' + row].border = f_border - - col = '' - every_day_sum = 0 - - for j in range(0, ca_len): - col = chr(ord('C') + j) - ws[col + row].font = name_font - ws[col + row].alignment = c_c_alignment - every_day_sum += child['subtotals_array'][j][i] - ws[col + row] = round(child['subtotals_array'][j][i], 2) - ws[col + row].border = f_border - - col = chr(ord(col) + 1) - ws[col + row].font = name_font - ws[col + row].alignment = c_c_alignment - ws[col + row] = round(every_day_sum, 2) - ws[col + row].border = f_border - - table_end_row_number = current_row_number current_row_number += 1 - chart_start_row_number = current_row_number - # Pie + category = reporting_period_data['names'] + ca_len = len(category) + for i in range(0, ca_len): - pie = PieChart() - labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, - max_row=table_end_row_number) - pie.add_data(pie_data, titles_from_data=True) - pie.set_categories(labels) - pie.height = 6.6 - pie.width = 8 - pie.title = ws.cell(column=3+i, row=table_start_row_number).value - s1 = pie.series[0] - s1.dLbls = DataLabelList() - s1.dLbls.showCatName = False - s1.dLbls.showVal = True - s1.dLbls.showPercent = True - chart_cell = '' - if i % 2 == 0: - chart_cell = 'B' + str(chart_start_row_number) - else: - chart_cell = 'E' + str(chart_start_row_number) - chart_start_row_number += 5 - ws.add_chart(pie, chart_cell) + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + \ + ' (' + reporting_period_data['units'][i] + ')' + ws['B' + str(current_row_number)].border = f_border - # chart_col = chr(ord('B') + 2 * i) - # chart_cell = chart_col + str(current_row_number) - # ws.add_chart(pie, chart_cell) - current_row_number = chart_start_row_number + ws['C' + str(current_row_number)].font = title_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 3) + ws['C' + str(current_row_number)].border = f_border - if ca_len % 2 == 1: - current_row_number += 5 + current_row_number += 1 - # else: - # for i in range(19, 36 + 1): - # current_row_number = 36 - # ws.row_dimensions[i].height = 0.1 + table_end_row_number = current_row_number - 1 - current_row_number += 1 + pie = PieChart() + pie.title = name + ' 成本占比' + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 6.6 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + + ws.add_chart(pie, 'D' + str(table_start_row_number)) + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + ##################################### - ############################################# reporting_period_data = report['reporting_period'] times = reporting_period_data['timestamps'] has_detail_data_flag = True ca_len = len(report['reporting_period']['names']) table_row = (current_row_number + 1) + ca_len * 6 + current_end_row_number = (current_row_number + 1) + ca_len * 6 + len(times[0]) + 3 if "timestamps" not in reporting_period_data.keys() or \ reporting_period_data['timestamps'] is None or \ len(reporting_period_data['timestamps']) == 0: @@ -584,9 +537,113 @@ def generate_excel(report, ws[col + row] = round(total_sum, 2) ws[col + row].border = f_border - else: - for i in range(37, 69 + 1): - ws.row_dimensions[i].height = 0.1 + current_row_number = current_end_row_number + + ######################################## + + has_child_flag = True + + if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \ + len(report['child_space']["energy_category_names"]) == 0 \ + or 'child_space_names_array' not in report['child_space'].keys() \ + or report['child_space']['energy_category_names'] is None \ + or len(report['child_space']['child_space_names_array']) == 0 \ + or len(report['child_space']['child_space_names_array'][0]) == 0: + has_child_flag = False + + if has_child_flag: + child = report['child_space'] + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 子空间数据' + + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + ca_len = len(child['energy_category_names']) + + col = '' + + for i in range(0, ca_len): + col = chr(ord('C') + i) + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + + col = chr(ord(col) + 1) + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + + space_len = len(child['child_space_names_array'][0]) + + for i in range(0, space_len): + current_row_number += 1 + row = str(current_row_number) + + ws['B' + row].font = name_font + ws['B' + row].alignment = c_c_alignment + ws['B' + row] = child['child_space_names_array'][0][i] + ws['B' + row].border = f_border + + col = '' + every_day_sum = 0 + + for j in range(0, ca_len): + col = chr(ord('C') + j) + ws[col + row].font = name_font + ws[col + row].alignment = c_c_alignment + every_day_sum += child['subtotals_array'][j][i] + ws[col + row] = round(child['subtotals_array'][j][i], 2) + ws[col + row].border = f_border + + col = chr(ord(col) + 1) + ws[col + row].font = name_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = round(every_day_sum, 2) + ws[col + row].border = f_border + + table_end_row_number = current_row_number + current_row_number += 1 + chart_start_row_number = current_row_number + + # Pie + for i in range(0, ca_len): + pie = PieChart() + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, + max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 6.6 + pie.width = 8 + pie.title = ws.cell(column=3 + i, row=table_start_row_number).value + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + chart_cell = '' + if i % 2 == 0: + chart_cell = 'B' + str(chart_start_row_number) + else: + chart_cell = 'E' + str(chart_start_row_number) + chart_start_row_number += 5 + ws.add_chart(pie, chart_cell) + + current_row_number = chart_start_row_number + + if ca_len % 2 == 1: + current_row_number += 5 + + current_row_number += 1 filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 8f8e3fdc5b02d62526b51a2570130a3b15a03450 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 14:59:38 +0800 Subject: [PATCH 02/25] Add layout logic --- myems-api/excelexporters/spacecost.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 7cf0a6a5..1f1a305f 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -343,6 +343,10 @@ def generate_excel(report, ws.add_chart(pie, "D13") + else: + for i in range(12, 18 + 1): + ws.row_dimensions[i].height = 0.1 + ################################## current_row_number = 19 From a3724999dd9a431e49cb69caa69ab7ef90603f8e Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 15:13:15 +0800 Subject: [PATCH 03/25] Inspect code --- myems-api/excelexporters/spacecost.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 1f1a305f..320ac5dd 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -384,7 +384,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + \ - ' (' + reporting_period_data['units'][i] + ')' + ' (' + reporting_period_data['units'][i] + ')' ws['B' + str(current_row_number)].border = f_border ws['C' + str(current_row_number)].font = title_font @@ -647,7 +647,7 @@ def generate_excel(report, if ca_len % 2 == 1: current_row_number += 5 - current_row_number += 1 + current_row_number += 1 filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From ea55e306aa5e989169c647c184ab98c42c86e9ab Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 15:16:11 +0800 Subject: [PATCH 04/25] 1. Change the subspace location 2. Added a TCE ratio module 3. Added a TCO2E ratio module --- .../excelexporters/spaceenergycategory.py | 464 +++++++++++------- 1 file changed, 283 insertions(+), 181 deletions(-) diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index 7f4bb303..f6124687 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -72,10 +72,8 @@ def generate_excel(report, # Row height ws.row_dimensions[1].height = 102 - for i in range(2, 2000 + 1): ws.row_dimensions[i].height = 42 - # # for i in range(2, 37 + 1): # ws.row_dimensions[i].height = 30 # @@ -171,14 +169,9 @@ def generate_excel(report, wb.save(filename) return filename + ################################################# - # First: 能耗分析 - # 6: title - # 7: table title - # 8~10 table_data - # Total: 5 rows - # if has not energy data: set low height for rows - ################################################# + reporting_period_data = report['reporting_period'] has_energy_data_flag = True @@ -189,14 +182,13 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 能耗分析' + ws['B6'] = name+' 报告期消耗' category = reporting_period_data['names'] ca_len = len(category) ws.row_dimensions[7].height = 60 ws['B7'].fill = table_fill - ws['B7'].border = f_border ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment @@ -205,7 +197,7 @@ def generate_excel(report, ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积能耗' + ws['B9'] = '单位面积值' ws['B9'].border = f_border ws['B10'].font = title_font @@ -213,12 +205,10 @@ def generate_excel(report, ws['B10'] = '环比' ws['B10'].border = f_border - col = '' + col = 'B' for i in range(0, ca_len): col = chr(ord('C') + i) - row = '7' - cell = col + row ws[col + '7'].fill = table_fill ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment @@ -293,13 +283,9 @@ def generate_excel(report, else: for i in range(6, 10 + 1): ws.row_dimensions[i].height = 0.1 + ################################################# - # Second: 分时电耗 - # 12: title - # 13: table title - # 14~17 table_data - # Total: 6 rows - ################################################ + has_ele_peak_flag = True if "toppeaks" not in reporting_period_data.keys() or \ reporting_period_data['toppeaks'] is None or \ @@ -310,7 +296,6 @@ def generate_excel(report, ws['B12'].font = title_font ws['B12'] = name+' 分时电耗' - ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill ws['B13'].font = name_font ws['B13'].alignment = c_c_alignment @@ -363,81 +348,311 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时电耗' + pie.title = name + ' 分时电耗' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) pie.set_categories(labels) - pie.height = 7.25 # cm 1.05*5 1.05cm = 30 pt + pie.height = 6.6 pie.width = 9 - # pie.title = "Pies sold by category" s1 = pie.series[0] s1.dLbls = DataLabelList() - s1.dLbls.showCatName = False # 标签显示 - s1.dLbls.showVal = True # 数量显示 - s1.dLbls.showPercent = True # 百分比显示 - # s1 = CharacterProperties(sz=1800) # 图表中字体大小 *100 - + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True ws.add_chart(pie, "D13") else: for i in range(12, 18 + 1): ws.row_dimensions[i].height = 0.1 - # end_row 10 - # start_row 12 - ################################################ - # Third: 子空间能耗 - # 19: title - # 20: table title - # 21~24 table_data - # Total: 6 rows + ################################################ + + current_row_number = 19 + + has_kgce_data_flag = True + if "subtotals_in_kgce" not in reporting_period_data.keys() or \ + reporting_period_data['subtotals_in_kgce'] is None or \ + len(reporting_period_data['subtotals_in_kgce']) == 0: + has_kgce_data_flag = False + + if has_kgce_data_flag: + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 吨标准煤 (TCE) 占比' + + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = name_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '吨标准煤 (TCE) 占比' + + current_row_number += 1 + + ca_len = len(reporting_period_data['names']) + + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].font = title_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce'][i] / 1000, 3) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + pie = PieChart() + pie.title = name + ' ' + ws.cell(column=3, row=table_start_row_number).value + labels = Reference(ws, min_col=2, min_row=table_start_row_number+1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 7.25 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + table_cell = 'D' + str(table_start_row_number) + ws.add_chart(pie, table_cell) + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + ##################################################### + + has_kgco2e_data_flag = True + + if "subtotals_in_kgco2e" not in reporting_period_data.keys() or \ + reporting_period_data['subtotals_in_kgco2e'] is None or \ + len(reporting_period_data['subtotals_in_kgco2e']) == 0: + has_kgco2e_data_flag = False + + if has_kgco2e_data_flag: + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放 (TCO2E) 占比' + + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 75 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = name_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '吨二氧化碳排放 (TCO2E) 占比' + + current_row_number += 1 + + ca_len = len(reporting_period_data['names']) + + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].font = title_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e'][i] / 1000, 3) + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + pie = PieChart() + pie.title = name + ' ' + ws.cell(column=3, row=table_start_row_number).value + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 7.75 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + table_cell = 'D' + str(table_start_row_number) + ws.add_chart(pie, table_cell) + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + ############################################### + + has_detail_data_flag = True + + table_start_draw_flag = current_row_number + 1 + + if "timestamps" not in reporting_period_data.keys() or \ + reporting_period_data['timestamps'] is None or \ + len(reporting_period_data['timestamps']) == 0: + has_detail_data_flag = False + + if has_detail_data_flag: + reporting_period_data = report['reporting_period'] + times = reporting_period_data['timestamps'] + ca_len = len(report['reporting_period']['names']) + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' + + table_start_row_number = (current_row_number + 1) + ca_len * 6 + current_row_number = table_start_row_number + + time = times[0] + has_data = False + + if len(time) > 0: + has_data = True + + if has_data: + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = '日期时间' + + for i in range(0, ca_len): + col = chr(ord('C') + i) + + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ + " (" + reporting_period_data['units'][i] + ")" + ws[col + str(current_row_number)].border = f_border + + current_row_number += 1 + + for i in range(0, len(time)): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = time[i] + ws['B' + str(current_row_number)].border = f_border + + for j in range(0, ca_len): + col = chr(ord('C') + j) + + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)] = round(reporting_period_data['values'][j][i], 2) + ws[col + str(current_row_number)].border = f_border + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)].border = f_border + + for i in range(0, ca_len): + col = chr(ord('C') + i) + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2) + ws[col + str(current_row_number)].border = f_border + + # line + line = LineChart() + line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_start_row_number).value + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) + line.add_data(line_data, titles_from_data=True) + line.set_categories(labels) + line_data = line.series[0] + line_data.marker.symbol = "circle" + line_data.smooth = True + line.x_axis.crosses = 'min' + line.height = 8.25 + line.width = 24 + line.dLbls = DataLabelList() + line.dLbls.dLblPos = 't' + line.dLbls.showVal = True + line.dLbls.showPercent = False + chart_col = 'B' + chart_cell = chart_col + str(table_start_draw_flag + 6 * i) + ws.add_chart(line, chart_cell) + + current_row_number += 2 + + ######################################## + has_child_flag = True - # Judge if the space has child space, if not, delete it. + if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \ len(report['child_space']["energy_category_names"]) == 0 \ or 'child_space_names_array' not in report['child_space'].keys() \ or report['child_space']['energy_category_names'] is None \ or len(report['child_space']['child_space_names_array']) == 0 \ or len(report['child_space']['child_space_names_array'][0]) == 0: - has_child_flag = False - current_row_number = 19 - if has_child_flag: child = report['child_space'] - child_spaces = child['child_space_names_array'][0] - child_subtotals = child['subtotals_array'][0] - ws['B19'].font = title_font - ws['B19'] = name+' 子空间能耗' + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 子空间数据' - ws.row_dimensions[20].height = 60 - ws['B20'].fill = table_fill - ws['B20'].border = f_border + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border ca_len = len(child['energy_category_names']) - table_start_row_number = 20 + col = '' for i in range(0, ca_len): - row = chr(ord('C') + i) - ws[row + '20'].fill = table_fill - ws[row + '20'].font = title_font - ws[row + '20'].alignment = c_c_alignment - ws[row + '20'].border = f_border - ws[row + '20'] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + col = chr(ord('C') + i) + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' space_len = len(child['child_space_names_array'][0]) for i in range(0, space_len): - row = str(i + 21) + current_row_number += 1 + row = str(current_row_number) ws['B' + row].font = name_font ws['B' + row].alignment = c_c_alignment ws['B' + row] = child['child_space_names_array'][0][i] ws['B' + row].border = f_border + col = '' + for j in range(0, ca_len): col = chr(ord('C') + j) ws[col + row].font = name_font @@ -445,153 +660,40 @@ def generate_excel(report, ws[col + row] = round(child['subtotals_array'][j][i], 2) ws[col + row].border = f_border - table_end_row_number = 20 + space_len - chart_start_row_number = 20 + space_len + 1 + table_end_row_number = current_row_number + current_row_number += 1 + chart_start_row_number = current_row_number + # Pie for i in range(0, ca_len): - # pie - # 25~30: pie pie = PieChart() - pie.title = ws.cell(column=3 + i, row=table_start_row_number).value labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, + max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) pie.set_categories(labels) - pie.height = 6.6 # cm 1.05*5 1.05cm = 30 pt + pie.height = 6.6 pie.width = 8 - # pie.title = "Pies sold by category" + pie.title = ws.cell(column=3 + i, row=table_start_row_number).value s1 = pie.series[0] s1.dLbls = DataLabelList() - s1.dLbls.showCatName = False # 标签显示 - s1.dLbls.showVal = True # 数量显示 - s1.dLbls.showPercent = True # 百分比显示 - # s1 = CharacterProperties(sz=1800) # 图表中字体大小 *100 + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True chart_cell = '' if i % 2 == 0: chart_cell = 'B' + str(chart_start_row_number) else: chart_cell = 'E' + str(chart_start_row_number) chart_start_row_number += 5 - # ws.add_chart(pie, chart_cell) - # chart_col = chr(ord('B') + 2 * j) - # chart_cell = chart_col + '25' ws.add_chart(pie, chart_cell) current_row_number = chart_start_row_number if ca_len % 2 == 1: current_row_number += 5 - current_row_number += 1 - ################################################ - # Fourth: 能耗详情 - # current_row_number: title - # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line - # current_row_number+1+ca_len*6: table title - # current_row_number+1+ca_len*6~: table_data - ################################################ - reporting_period_data = report['reporting_period'] - times = reporting_period_data['timestamps'] - has_detail_data_flag = True - ca_len = len(report['reporting_period']['names']) - table_row = current_row_number + 1 + ca_len*6 - chart_start_row_number = current_row_number + 1 - if "timestamps" not in reporting_period_data.keys() or \ - reporting_period_data['timestamps'] is None or \ - len(reporting_period_data['timestamps']) == 0: - has_detail_data_flag = False - - if has_detail_data_flag: - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' - - ws.row_dimensions[table_row].height = 60 - ws['B'+str(table_row)].fill = table_fill - ws['B' + str(table_row)].font = title_font - ws['B'+str(table_row)].border = f_border - ws['B'+str(table_row)].alignment = c_c_alignment - ws['B'+str(table_row)] = '日期时间' - time = times[0] - has_data = False - max_row = 0 - if len(time) > 0: - has_data = True - max_row = table_row + len(time) - print("max_row", max_row) - - if has_data: - for i in range(0, len(time)): - col = 'B' - row = str(table_row+1 + i) - # col = chr(ord('B') + i) - ws[col + row].font = title_font - ws[col + row].alignment = c_c_alignment - ws[col + row] = time[i] - ws[col + row].border = f_border - - for i in range(0, ca_len): - # 38 title - col = chr(ord('C') + i) - - ws[col + str(table_row)].fill = table_fill - ws[col + str(table_row)].font = title_font - ws[col + str(table_row)].alignment = c_c_alignment - ws[col + str(table_row)] = reporting_period_data['names'][i] + \ - " (" + reporting_period_data['units'][i] + ")" - ws[col + str(table_row)].border = f_border - - # 39 data - time = times[i] - time_len = len(time) - - for j in range(0, time_len): - row = str(table_row+1 + j) - # col = chr(ord('B') + i) - ws[col + row].font = title_font - ws[col + row].alignment = c_c_alignment - ws[col + row] = round(reporting_period_data['values'][i][j], 2) - ws[col + row].border = f_border - - current_row_number = table_row + 1 + len(times[0]) - - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' - - for i in range(0, ca_len): - col = chr(ord('C') + i) - ws[col + str(current_row_number)].font = title_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2) - - # line - # 39~: line - line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_row).value - labels = Reference(ws, min_col=2, min_row=table_row+1, max_row=max_row) - line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) # openpyxl bug - line.add_data(line_data, titles_from_data=True) - line.set_categories(labels) - line_data = line.series[0] - line_data.marker.symbol = "circle" - line_data.smooth = True - line.x_axis.crosses = 'min' - line.height = 8.25 # cm 1.05*5 1.05cm = 30 pt - line.width = 24 - # pie.title = "Pies sold by category" - line.dLbls = DataLabelList() - line.dLbls.dLblPos = 't' - # line.dLbls.showCatName = True # label show - line.dLbls.showVal = True # val show - line.dLbls.showPercent = True # percent show - # s1 = CharacterProperties(sz=1800) # font size *100 - chart_col = 'B' - chart_cell = chart_col + str(chart_start_row_number + 6*i) - ws.add_chart(line, chart_cell) - filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 811d0cba0db9111412c073d65fadd2957d9f4abd Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 15:23:42 +0800 Subject: [PATCH 05/25] 1. Change the subspace location 2. Change the code judgment logic --- myems-api/excelexporters/spaceenergyitem.py | 365 ++++++++++---------- 1 file changed, 183 insertions(+), 182 deletions(-) diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index bb35f268..2292c3a8 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -318,223 +318,224 @@ def generate_excel(report, current_row_number += 1 - ##################################### + ################################### - has_child_flag = True + has_values_data = True + has_timestamps_data = True - if "child_space" not in report.keys() or "energy_item_names" not in report['child_space'].keys() or \ - len(report['child_space']["energy_item_names"]) == 0 \ - or 'child_space_names_array' not in report['child_space'].keys() \ - or report['child_space']['child_space_names_array'] is None \ - or len(report['child_space']['child_space_names_array']) == 0 \ - or len(report['child_space']['child_space_names_array'][0]) == 0: - has_child_flag = False + if 'values' not in reporting_period_data.keys() or \ + reporting_period_data['values'] is None or \ + len(reporting_period_data['values']) == 0: + has_values_data = False - if has_child_flag: - child = report['child_space'] + if 'timestamps' not in reporting_period_data.keys() or \ + reporting_period_data['timestamps'] is None or \ + len(reporting_period_data['timestamps']) == 0 or \ + len(reporting_period_data['timestamps'][0]) == 0: + has_timestamps_data = False - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + if has_values_data and has_timestamps_data: + ca_len = len(reporting_period_data['names']) + time = reporting_period_data['timestamps'][0] - current_row_number += 1 - table_start_row_number = current_row_number + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' - ws.row_dimensions[current_row_number].height = 60 - ws['B' + str(current_row_number)].fill = table_fill - ws['B' + str(current_row_number)].border = f_border - ca_len = len(child['energy_item_names']) + current_row_number += 1 - for i in range(0, ca_len): - row = chr(ord('C') + i) - ws[row + str(current_row_number)].fill = table_fill - ws[row + str(current_row_number)].font = name_font - ws[row + str(current_row_number)].alignment = c_c_alignment - ws[row + str(current_row_number)].border = f_border - ws[row + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + chart_start_row_number = current_row_number - space_len = len(child['child_space_names_array'][0]) + current_row_number += ca_len * 6 + table_start_row_number = current_row_number - for i in range(0, space_len): - current_row_number += 1 - row = str(current_row_number) + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '日期时间' - ws['B' + row].font = name_font - ws['B' + row].alignment = c_c_alignment - ws['B' + row] = child['child_space_names_array'][0][i] - ws['B' + row].border = f_border + col = 'C' - for j in range(0, ca_len): - col = chr(ord('C') + j) - ws[col + row].font = name_font - ws[col + row].alignment = c_c_alignment - ws[col + row] = round(child['subtotals_array'][j][i], 2) - ws[col + row].border = f_border + for i in range(0, ca_len): + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + col = chr(ord(col) + 1) - table_end_row_number = current_row_number - current_row_number += 1 - pie_start_row_number = current_row_number + current_row_number += 1 - # Pie - for i in range(0, ca_len): - pie = PieChart() - labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, - max_row=table_end_row_number) - pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, - max_row=table_end_row_number) - pie.add_data(pie_data, titles_from_data=True) - pie.set_categories(labels) - pie.height = 6.6 - pie.width = 8 - pie.title = ws.cell(column=3 + i, row=table_start_row_number).value - s1 = pie.series[0] - s1.dLbls = DataLabelList() - s1.dLbls.showCatName = False - s1.dLbls.showVal = True - s1.dLbls.showPercent = True - chart_cell = '' - if i % 2 == 0: - chart_cell = 'B' + str(pie_start_row_number) - else: - chart_cell = 'E' + str(pie_start_row_number) - pie_start_row_number += 5 - ws.add_chart(pie, chart_cell) - - current_row_number = pie_start_row_number - if ca_len % 2 == 1: - current_row_number += 5 - - current_row_number += 1 - ####################### - - has_values_data = True - has_timestamps_data = True - - if 'values' not in reporting_period_data.keys() or \ - reporting_period_data['values'] is None or \ - len(reporting_period_data['values']) == 0: - has_values_data = False - - if 'timestamps' not in reporting_period_data.keys() or \ - reporting_period_data['timestamps'] is None or \ - len(reporting_period_data['timestamps']) == 0 or \ - len(reporting_period_data['timestamps'][0]) == 0: - has_timestamps_data = False - - if has_values_data and has_timestamps_data: - ca_len = len(reporting_period_data['names']) - time = reporting_period_data['timestamps'][0] - - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' - - current_row_number += 1 - - chart_start_row_number = current_row_number - - current_row_number += ca_len * 6 - table_start_row_number = current_row_number - - ws.row_dimensions[current_row_number].height = 60 - ws['B' + str(current_row_number)].fill = table_fill + for i in range(0, len(time)): ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = time[i] col = 'C' - - for i in range(0, ca_len): - ws[col + str(current_row_number)].fill = table_fill + for j in range(0, ca_len): ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + ws[col + str(current_row_number)] = round(reporting_period_data['values'][j][i], 2) \ + if reporting_period_data['values'][j][i] is not None else 0.00 col = chr(ord(col) + 1) current_row_number += 1 - for i in range(0, len(time)): - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = time[i] + table_end_row_number = current_row_number - 1 - col = 'C' - for j in range(0, ca_len): - ws[col + str(current_row_number)].font = title_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(reporting_period_data['values'][j][i], 2) \ - if reporting_period_data['values'][j][i] is not None else 0.00 - col = chr(ord(col) + 1) + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '小计' - current_row_number += 1 + col = 'C' - table_end_row_number = current_row_number - 1 + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2) + col = chr(ord(col) + 1) - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + current_row_number += 2 - col = 'C' + format_time_width_number = 1.0 + min_len_number = 1.0 + min_width_number = 11.0 # format_time_width_number * min_len_number + 4 and min_width_number > 11.0 - for i in range(0, ca_len): - ws[col + str(current_row_number)].font = title_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2) - col = chr(ord(col) + 1) + if period_type == 'hourly': + format_time_width_number = 4.0 + min_len_number = 2 + min_width_number = 12.0 + elif period_type == 'daily': + format_time_width_number = 2.5 + min_len_number = 4 + min_width_number = 14.0 + elif period_type == 'monthly': + format_time_width_number = 2.1 + min_len_number = 4 + min_width_number = 12.4 + elif period_type == 'yearly': + format_time_width_number = 1.5 + min_len_number = 5 + min_width_number = 11.5 - current_row_number += 2 + for i in range(0, ca_len): + line = LineChart() + line.title = '报告期消耗 - ' + \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) + line.add_data(line_data, titles_from_data=True) + line.set_categories(labels) + line_data = line.series[0] + line_data.marker.symbol = "circle" + line_data.smooth = True + line.x_axis.crosses = 'min' + line.height = 8.25 + line.width = format_time_width_number * len(time) if len(time) > min_len_number else min_width_number + if line.width > 24: + line.width = 24 + line.dLbls = DataLabelList() + line.dLbls.dLblPos = 't' + line.dLbls.showVal = True + line.dLbls.showPercent = False + chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number) + chart_start_row_number += 6 + ws.add_chart(line, chart_cell) - format_time_width_number = 1.0 - min_len_number = 1.0 - min_width_number = 11.0 # format_time_width_number * min_len_number + 4 and min_width_number > 11.0 + ##################################### - if period_type == 'hourly': - format_time_width_number = 4.0 - min_len_number = 2 - min_width_number = 12.0 - elif period_type == 'daily': - format_time_width_number = 2.5 - min_len_number = 4 - min_width_number = 14.0 - elif period_type == 'monthly': - format_time_width_number = 2.1 - min_len_number = 4 - min_width_number = 12.4 - elif period_type == 'yearly': - format_time_width_number = 1.5 - min_len_number = 5 - min_width_number = 11.5 + has_child_flag = True - for i in range(0, ca_len): - line = LineChart() - line.title = '报告期消耗 - ' + \ - reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" - labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) - line.add_data(line_data, titles_from_data=True) - line.set_categories(labels) - line_data = line.series[0] - line_data.marker.symbol = "circle" - line_data.smooth = True - line.x_axis.crosses = 'min' - line.height = 8.25 - line.width = format_time_width_number * len(time) if len(time) > min_len_number else min_width_number - if line.width > 24: - line.width = 24 - line.dLbls = DataLabelList() - line.dLbls.dLblPos = 't' - line.dLbls.showVal = True - line.dLbls.showPercent = False - chart_col = 'B' - chart_cell = chart_col + str(chart_start_row_number) - chart_start_row_number += 6 - ws.add_chart(line, chart_cell) + if "child_space" not in report.keys() or "energy_item_names" not in report['child_space'].keys() or \ + len(report['child_space']["energy_item_names"]) == 0 \ + or 'child_space_names_array' not in report['child_space'].keys() \ + or report['child_space']['child_space_names_array'] is None \ + or len(report['child_space']['child_space_names_array']) == 0 \ + or len(report['child_space']['child_space_names_array'][0]) == 0: + has_child_flag = False + + if has_child_flag: + child = report['child_space'] + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 子空间数据' + + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + ca_len = len(child['energy_item_names']) + + for i in range(0, ca_len): + row = chr(ord('C') + i) + ws[row + str(current_row_number)].fill = table_fill + ws[row + str(current_row_number)].font = name_font + ws[row + str(current_row_number)].alignment = c_c_alignment + ws[row + str(current_row_number)].border = f_border + ws[row + str(current_row_number)] = \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + + space_len = len(child['child_space_names_array'][0]) + + for i in range(0, space_len): + current_row_number += 1 + row = str(current_row_number) + + ws['B' + row].font = name_font + ws['B' + row].alignment = c_c_alignment + ws['B' + row] = child['child_space_names_array'][0][i] + ws['B' + row].border = f_border + + for j in range(0, ca_len): + col = chr(ord('C') + j) + ws[col + row].font = name_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = round(child['subtotals_array'][j][i], 2) + ws[col + row].border = f_border + + table_end_row_number = current_row_number + current_row_number += 1 + pie_start_row_number = current_row_number + + # Pie + for i in range(0, ca_len): + pie = PieChart() + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, + max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, + max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 6.6 + pie.width = 8 + pie.title = ws.cell(column=3 + i, row=table_start_row_number).value + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + chart_cell = '' + if i % 2 == 0: + chart_cell = 'B' + str(pie_start_row_number) + else: + chart_cell = 'E' + str(pie_start_row_number) + pie_start_row_number += 5 + ws.add_chart(pie, chart_cell) + + current_row_number = pie_start_row_number + if ca_len % 2 == 1: + current_row_number += 5 + + current_row_number += 1 filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 498d33d27887e5586cdbe24bd02b31b48b0efcf5 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 15:29:19 +0800 Subject: [PATCH 06/25] 1. Change the subspace location --- myems-api/excelexporters/spacesaving.py | 192 ++++++++++++------------ 1 file changed, 95 insertions(+), 97 deletions(-) diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index 36edcf02..a0bbd25d 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -428,103 +428,6 @@ def generate_excel(report, s1.dLbls.showPercent = True ws.add_chart(pie, 'D' + str(chart_start_row_number)) - ############################################# - - has_child_space_data_flag = True - - if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \ - len(report['child_space']["energy_category_names"]) == 0 \ - or 'child_space_names_array' not in report['child_space'].keys() \ - or report['child_space']['energy_category_names'] is None \ - or len(report['child_space']['child_space_names_array']) == 0 \ - or len(report['child_space']['child_space_names_array'][0]) == 0: - has_child_space_data_flag = False - - if has_child_space_data_flag: - child_space_data = report['child_space'] - ca_len = len(child_space_data['energy_category_names']) - - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' - - current_row_number += 1 - table_start_row_number = current_row_number - - ws.row_dimensions[current_row_number].height = 60 - ws['B' + str(current_row_number)].fill = table_fill - ws['B' + str(current_row_number)].font = name_font - ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '子空间' - - col = 'C' - - for i in range(0, ca_len): - ws[col + str(current_row_number)].fill = table_fill - ws[col + str(current_row_number)].font = name_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = \ - child_space_data['energy_category_names'][i] + " (" + child_space_data['units'][i] + ")" - col = chr(ord(col) + 1) - - current_row_number += 1 - ca_child_len = len(child_space_data['child_space_names_array'][0]) - - for i in range(0, ca_child_len): - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = child_space_data['child_space_names_array'][0][i] - current_row_number += 1 - - current_row_number -= ca_child_len - - for i in range(0, ca_child_len): - col = 'C' - for j in range(0, ca_len): - ws[col + str(current_row_number)].font = name_font - ws[col + str(current_row_number)].alignment = c_c_alignment - ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(child_space_data['subtotals_saving_array'][j][i], 2) - col = chr(ord(col) + 1) - - current_row_number += 1 - - table_end_row_number = current_row_number - 1 - - col = 'B' - - for i in range(0, ca_len): - pie = PieChart() - labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) - pie.add_data(pie_data, titles_from_data=True) - pie.set_categories(labels) - pie.title = reporting_period_data['names'][i] + " (" + \ - reporting_period_data['units'][i] + ")" - pie.height = 6.6 - pie.width = 9 - s1 = pie.series[0] - s1.dLbls = DataLabelList() - s1.dLbls.showCatName = False - s1.dLbls.showVal = True - s1.dLbls.showPercent = True - chart_cell = '' - if i % 2 == 0: - chart_cell = 'B' + str(current_row_number) - else: - chart_cell = 'E' + str(current_row_number) - current_row_number += 5 - ws.add_chart(pie, chart_cell) - # ws.add_chart(pie, col + str(current_row_number)) - # col = chr(ord(col) + 2) - - if ca_len % 2 == 1: - current_row_number += 5 - - current_row_number += 1 - ################################ has_values_saving_data = True @@ -656,6 +559,101 @@ def generate_excel(report, chart_start_row_number += 6 ws.add_chart(line, chart_cell) + ############################################# + + has_child_space_data_flag = True + + if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \ + len(report['child_space']["energy_category_names"]) == 0 \ + or 'child_space_names_array' not in report['child_space'].keys() \ + or report['child_space']['energy_category_names'] is None \ + or len(report['child_space']['child_space_names_array']) == 0 \ + or len(report['child_space']['child_space_names_array'][0]) == 0: + has_child_space_data_flag = False + + if has_child_space_data_flag: + child_space_data = report['child_space'] + ca_len = len(child_space_data['energy_category_names']) + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 子空间数据' + + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = name_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '子空间' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = \ + child_space_data['energy_category_names'][i] + " (" + child_space_data['units'][i] + ")" + col = chr(ord(col) + 1) + + current_row_number += 1 + ca_child_len = len(child_space_data['child_space_names_array'][0]) + + for i in range(0, ca_child_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = child_space_data['child_space_names_array'][0][i] + current_row_number += 1 + + current_row_number -= ca_child_len + + for i in range(0, ca_child_len): + col = 'C' + for j in range(0, ca_len): + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(child_space_data['subtotals_saving_array'][j][i], 2) + col = chr(ord(col) + 1) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + col = 'B' + + for i in range(0, ca_len): + pie = PieChart() + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.title = reporting_period_data['names'][i] + " (" + \ + reporting_period_data['units'][i] + ")" + pie.height = 6.6 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + chart_cell = '' + if i % 2 == 0: + chart_cell = 'B' + str(current_row_number) + else: + chart_cell = 'E' + str(current_row_number) + current_row_number += 5 + ws.add_chart(pie, chart_cell) + + if ca_len % 2 == 1: + current_row_number += 5 + + current_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 1b4189138a2577eadd5c3ff1f61cb6acee6dccf8 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 15:32:18 +0800 Subject: [PATCH 07/25] Delete comment code --- myems-api/excelexporters/spacecost.py | 6 ------ myems-api/excelexporters/spaceenergycategory.py | 5 ----- 2 files changed, 11 deletions(-) diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 320ac5dd..2deb9950 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -75,12 +75,6 @@ def generate_excel(report, for i in range(2, 2000 + 1): ws.row_dimensions[i].height = 42 - # for i in range(2, 37 + 1): - # ws.row_dimensions[i].height = 30 - # - # for i in range(38, 69 + 1): - # ws.row_dimensions[i].height = 30 - # Col width ws.column_dimensions['A'].width = 1.5 diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index f6124687..97d8a14d 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -74,11 +74,6 @@ def generate_excel(report, ws.row_dimensions[1].height = 102 for i in range(2, 2000 + 1): ws.row_dimensions[i].height = 42 - # for i in range(2, 37 + 1): - # ws.row_dimensions[i].height = 30 - # - # for i in range(38, 90 + 1): - # ws.row_dimensions[i].height = 30 # Col width ws.column_dimensions['A'].width = 1.5 From 1f9699a3187660e31df9978ba992b3b64ecf8690 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Fri, 5 Mar 2021 15:43:59 +0800 Subject: [PATCH 08/25] Implemented the spaceIncome Excel export --- myems-api/excelexporters/spaceincome.py | 599 ++++++++++++++++++++++++ myems-api/reports/spaceincome.py | 7 + 2 files changed, 606 insertions(+) create mode 100644 myems-api/excelexporters/spaceincome.py diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py new file mode 100644 index 00000000..11a4d31b --- /dev/null +++ b/myems-api/excelexporters/spaceincome.py @@ -0,0 +1,599 @@ +import base64 +import uuid +import os +from openpyxl.chart import ( + PieChart, + LineChart, + BarChart, + Reference, +) +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font +from openpyxl.drawing.image import Image +from openpyxl import Workbook +from openpyxl.chart.label import DataLabelList + + +#################################################################################################################### +# PROCEDURES +# Step 1: Validate the report data +# Step 2: Generate excel file +# Step 3: Encode the excel file bytes to Base64 +#################################################################################################################### + + +def export(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + #################################################################################################################### + # Step 1: Validate the report data + #################################################################################################################### + if report is None: + return None + print(report) + + #################################################################################################################### + # Step 2: Generate excel file from the report data + #################################################################################################################### + filename = generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + #################################################################################################################### + # Step 3: Encode the excel file to Base64 + #################################################################################################################### + try: + with open(filename, 'rb') as binary_file: + binary_file_data = binary_file.read() + except IOError as ex: + pass + + # Base64 encode the bytes + base64_encoded_data = base64.b64encode(binary_file_data) + # get the Base64 encoded data using human-readable characters. + base64_message = base64_encoded_data.decode('utf-8') + # delete the file from server + try: + os.remove(filename) + except NotImplementedError as ex: + pass + return base64_message + + +def generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + wb = Workbook() + ws = wb.active + + # Row height + ws.row_dimensions[1].height = 102 + for i in range(2, 2000 + 1): + ws.row_dimensions[i].height = 42 + + # for i in range(2, 37 + 1): + # ws.row_dimensions[i].height = 30 + # + # for i in range(38, 69 + 1): + # ws.row_dimensions[i].height = 30 + + # Col width + ws.column_dimensions['A'].width = 1.5 + + ws.column_dimensions['B'].width = 25.0 + + for i in range(ord('C'), ord('L')): + ws.column_dimensions[chr(i)].width = 15.0 + + # Font + name_font = Font(name='Constantia', size=15, bold=True) + title_font = Font(name='宋体', size=15, bold=True) + data_font = Font(name='Franklin Gothic Book', size=11) + + table_fill = PatternFill(fill_type='solid', fgColor='1F497D') + f_border = Border(left=Side(border_style='medium', color='00000000'), + right=Side(border_style='medium', color='00000000'), + bottom=Side(border_style='medium', color='00000000'), + top=Side(border_style='medium', color='00000000') + ) + b_border = Border( + bottom=Side(border_style='medium', color='00000000'), + ) + + b_c_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + c_c_alignment = Alignment(vertical='center', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + b_r_alignment = Alignment(vertical='bottom', + horizontal='right', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + c_r_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + ws.add_image(img, 'B1') + + # Title + ws.row_dimensions[3].height = 60 + + ws['B3'].font = name_font + ws['B3'].alignment = b_r_alignment + ws['B3'] = 'Name:' + ws['C3'].border = b_border + ws['C3'].alignment = b_c_alignment + ws['C3'].font = name_font + ws['C3'] = name + + ws['D3'].font = name_font + ws['D3'].alignment = b_r_alignment + ws['D3'] = 'Period:' + ws['E3'].border = b_border + ws['E3'].alignment = b_c_alignment + ws['E3'].font = name_font + ws['E3'] = period_type + + ws['F3'].font = name_font + ws['F3'].alignment = b_r_alignment + ws['F3'] = 'Date:' + ws['G3'].border = b_border + ws['G3'].alignment = b_c_alignment + ws['G3'].font = name_font + ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws.merge_cells("G3:H3") + + if "reporting_period" not in report.keys() or \ + "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename + + ################################## + + reporting_period_data = report['reporting_period'] + + has_cost_data_flag = True + + if "names" not in reporting_period_data.keys() or \ + reporting_period_data['names'] is None or \ + len(reporting_period_data['names']) == 0: + has_cost_data_flag = False + + if has_cost_data_flag: + ws['B6'].font = title_font + ws['B6'] = name + ' 报告期收入' + category = reporting_period_data['names'] + ca_len = len(category) + + ws.row_dimensions[7].height = 60 + ws['B7'].fill = table_fill + ws['B7'].border = f_border + + ws['B8'].font = title_font + ws['B8'].alignment = c_c_alignment + ws['B8'] = '报告期收入总计' + ws['B8'].border = f_border + + ws['B9'].font = title_font + ws['B9'].alignment = c_c_alignment + ws['B9'] = '单位面积值' + ws['B9'].border = f_border + + ws['B10'].font = title_font + ws['B10'].alignment = c_c_alignment + ws['B10'] = '环比' + ws['B10'].border = f_border + + col = '' + + for i in range(0, ca_len): + col = chr(ord('C') + i) + + ws[col + '7'].fill = table_fill + ws[col + '7'].font = name_font + ws[col + '7'].alignment = c_c_alignment + ws[col + '7'] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + ws[col + '7'].border = f_border + + ws[col + '8'].font = name_font + ws[col + '8'].alignment = c_c_alignment + ws[col + '8'] = round(reporting_period_data['subtotals'][i], 2) + ws[col + '8'].border = f_border + + ws[col + '9'].font = name_font + ws[col + '9'].alignment = c_c_alignment + ws[col + '9'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) + ws[col + '9'].border = f_border + + ws[col + '10'].font = name_font + ws[col + '10'].alignment = c_c_alignment + ws[col + '10'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \ + if reporting_period_data['increment_rates'][i] is not None else "-" + ws[col + '10'].border = f_border + + col = chr(ord(col) + 1) + + ws[col + '7'].fill = table_fill + ws[col + '7'].font = name_font + ws[col + '7'].alignment = c_c_alignment + ws[col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '7'].border = f_border + + ws[col + '8'].font = name_font + ws[col + '8'].alignment = c_c_alignment + ws[col + '8'] = round(reporting_period_data['total'], 2) + ws[col + '8'].border = f_border + + ws[col + '9'].font = name_font + ws[col + '9'].alignment = c_c_alignment + ws[col + '9'] = round(reporting_period_data['total_per_unit_area'], 2) + ws[col + '9'].border = f_border + + ws[col + '10'].font = name_font + ws[col + '10'].alignment = c_c_alignment + ws[col + '10'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \ + if reporting_period_data['total_increment_rate'] is not None else "-" + ws[col + '10'].border = f_border + + else: + for i in range(6, 10 + 1): + ws.row_dimensions[i].height = 0.1 + ################################## + current_row_number = 12 + has_subtotals_data_flag = True + if "subtotals" not in reporting_period_data.keys() or \ + reporting_period_data['subtotals'] is None or \ + len(reporting_period_data['subtotals']) == 0: + has_subtotals_data_flag = False + + if has_subtotals_data_flag: + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 收入占比' + + current_row_number += 1 + + table_start_row_number = current_row_number + + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = name_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '收入' + + ws['D' + str(current_row_number)].fill = table_fill + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = '收入占比' + + current_row_number += 1 + + ca_len = len(reporting_period_data['names']) + wssum = 0 + for i in range(0, ca_len): + wssum = round(reporting_period_data['subtotals'][i], 2) + wssum + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].font = title_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2) + + ws['D' + str(current_row_number)].font = title_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = '{:.2%}'.format(round(reporting_period_data['subtotals'][i], 2) / wssum) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + pie = PieChart() + pie.title = name + ' 收入占比' + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 6.6 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + table_cell = 'E' + str(table_start_row_number) + ws.add_chart(pie, table_cell) + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + else: + for i in range(21, 29 + 1): + current_row_number = 30 + ws.row_dimensions[i].height = 0.1 + + ################################## + current_row_number = 20 + + has_child_flag = True + + if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \ + len(report['child_space']["energy_category_names"]) == 0 \ + or 'child_space_names_array' not in report['child_space'].keys() \ + or report['child_space']['energy_category_names'] is None \ + or len(report['child_space']['child_space_names_array']) == 0 \ + or len(report['child_space']['child_space_names_array'][0]) == 0: + has_child_flag = False + + if has_child_flag: + child = report['child_space'] + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 子空间数据' + + current_row_number += 1 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + ca_len = len(child['energy_category_names']) + + col = '' + + for i in range(0, ca_len): + col = chr(ord('C') + i) + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + + col = chr(ord(col) + 1) + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + + space_len = len(child['child_space_names_array'][0]) + + for i in range(0, space_len): + current_row_number += 1 + row = str(current_row_number) + + ws['B' + row].font = name_font + ws['B' + row].alignment = c_c_alignment + ws['B' + row] = child['child_space_names_array'][0][i] + ws['B' + row].border = f_border + + col = '' + every_day_sum = 0 + + for j in range(0, ca_len): + col = chr(ord('C') + j) + ws[col + row].font = name_font + ws[col + row].alignment = c_c_alignment + every_day_sum += child['subtotals_array'][j][i] + ws[col + row] = round(child['subtotals_array'][j][i], 2) + ws[col + row].border = f_border + + col = chr(ord(col) + 1) + ws[col + row].font = name_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = round(every_day_sum, 2) + ws[col + row].border = f_border + + table_end_row_number = current_row_number + current_row_number += 1 + chart_start_row_number = current_row_number + + # Pie + for i in range(0, ca_len): + pie = PieChart() + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, + max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 6.6 + pie.width = 8 + pie.title = ws.cell(column=3+i, row=table_start_row_number).value + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + chart_cell = '' + if i % 2 == 0: + chart_cell = 'B' + str(chart_start_row_number) + else: + chart_cell = 'E' + str(chart_start_row_number) + chart_start_row_number += 5 + ws.add_chart(pie, chart_cell) + + # chart_col = chr(ord('B') + 2 * i) + # chart_cell = chart_col + str(current_row_number) + # ws.add_chart(pie, chart_cell) + current_row_number = chart_start_row_number + + if ca_len % 2 == 1: + current_row_number += 5 + + # else: + # for i in range(19, 36 + 1): + # current_row_number = 36 + # ws.row_dimensions[i].height = 0.1 + + current_row_number += 1 + + ############################################# + reporting_period_data = report['reporting_period'] + times = reporting_period_data['timestamps'] + has_detail_data_flag = True + ca_len = len(report['reporting_period']['names']) + table_row = (current_row_number + 1) + ca_len * 6 + if "timestamps" not in reporting_period_data.keys() or \ + reporting_period_data['timestamps'] is None or \ + len(reporting_period_data['timestamps']) == 0: + has_detail_data_flag = False + + if has_detail_data_flag: + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' + + ws.row_dimensions[table_row].height = 60 + ws['B' + str(table_row)].fill = table_fill + ws['B' + str(table_row)].font = title_font + ws['B' + str(table_row)].border = f_border + ws['B' + str(table_row)].alignment = c_c_alignment + ws['B' + str(table_row)] = '日期时间' + time = times[0] + has_data = False + max_row = 0 + if len(time) > 0: + has_data = True + max_row = table_row + len(time) + + if has_data: + for i in range(0, len(time)): + col = 'B' + row = str(table_row + 1 + i) + ws[col + row].font = title_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = time[i] + ws[col + row].border = f_border + + for i in range(0, ca_len): + + col = chr(ord('C') + i) + + ws[col + str(table_row)].fill = table_fill + ws[col + str(table_row)].font = title_font + ws[col + str(table_row)].alignment = c_c_alignment + ws[col + str(table_row)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + ")" + ws[col + str(table_row)].border = f_border + + # 39 data + time = times[i] + time_len = len(time) + + for j in range(0, time_len): + row = str(table_row + 1 + j) + ws[col + row].font = title_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = round(reporting_period_data['values'][i][j], 2) + ws[col + row].border = f_border + + line = LineChart() + line.title = \ + '报告期收入 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) + line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) + line.add_data(line_data, titles_from_data=True) + line.set_categories(labels) + line_data = line.series[0] + line_data.marker.symbol = "circle" + line_data.smooth = True + line.x_axis.crosses = 'min' + line.height = 8.25 + line.width = 24 + line.dLbls = DataLabelList() + line.dLbls.dLblPos = 't' + line.dLbls.showVal = True + line.dLbls.showPercent = False + chart_col = 'B' + chart_cell = chart_col + str(current_row_number + 1 + 6 * i) + ws.add_chart(line, chart_cell) + + row = str(max_row + 1) + + ws['B' + row].font = title_font + ws['B' + row].alignment = c_c_alignment + ws['B' + row] = '小计' + ws['B' + row].border = f_border + + col = '' + + for i in range(0, ca_len): + col = chr(ord('C') + i) + row = str(max_row + 1) + ws[col + row].font = title_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = round(reporting_period_data['subtotals'][i], 2) + ws[col + row].border = f_border + + col = chr(ord(col) + 1) + + ws[col + str(table_row)].fill = table_fill + ws[col + str(table_row)].font = title_font + ws[col + str(table_row)].alignment = c_c_alignment + ws[col + str(table_row)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(table_row)].border = f_border + + total_sum = 0 + + for j in range(0, len(time)): + row = str(table_row + 1 + j) + ws[col + row].font = title_font + ws[col + row].alignment = c_c_alignment + every_day_sum = reporting_period_values_every_day_sum(reporting_period_data, j, ca_len) + total_sum += every_day_sum + ws[col + row] = round(every_day_sum, 2) + ws[col + row].border = f_border + + row = str(table_row + 1 + len(time)) + ws[col + row].font = title_font + ws[col + row].alignment = c_c_alignment + ws[col + row] = round(total_sum, 2) + ws[col + row].border = f_border + + else: + for i in range(37, 69 + 1): + ws.row_dimensions[i].height = 0.1 + + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename + + +def reporting_period_values_every_day_sum(reporting_period_data, every_day_index, ca_len): + every_day_sum = 0 + for i in range(0, ca_len): + every_day_sum += reporting_period_data['values'][i][every_day_index] + + return every_day_sum diff --git a/myems-api/reports/spaceincome.py b/myems-api/reports/spaceincome.py index 35b43d00..979c6ea0 100644 --- a/myems-api/reports/spaceincome.py +++ b/myems-api/reports/spaceincome.py @@ -5,6 +5,7 @@ import config from datetime import datetime, timedelta, timezone from core import utilities from decimal import Decimal +import excelexporters.spaceincome class Reporting: @@ -561,4 +562,10 @@ class Reporting: result['child_space']['subtotals_array'].append( child_space_data[energy_category_id]['subtotals']) + # export result to Excel file and then encode the file to base64 string + result['excel_bytes_base64'] = excelexporters.spaceincome.export(result, + space['name'], + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) resp.body = json.dumps(result) From db31bb56fd8589762108bef683299fecc4ed9a89 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Fri, 5 Mar 2021 16:05:45 +0800 Subject: [PATCH 09/25] Implemented the spaceIncome Excel export --- myems-api/excelexporters/spaceincome.py | 144 ++++++++++++------------ 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index 11a4d31b..30c957d5 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -183,86 +183,86 @@ def generate_excel(report, has_cost_data_flag = False if has_cost_data_flag: - ws['B6'].font = title_font - ws['B6'] = name + ' 报告期收入' + ws['B5'].font = title_font + ws['B5'] = name + ' 报告期收入' category = reporting_period_data['names'] ca_len = len(category) ws.row_dimensions[7].height = 60 - ws['B7'].fill = table_fill + ws['B6'].fill = table_fill + ws['B6'].border = f_border + + ws['B7'].font = title_font + ws['B7'].alignment = c_c_alignment + ws['B7'] = '报告期收入总计' ws['B7'].border = f_border ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '报告期收入总计' + ws['B8'] = '单位面积值' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积值' + ws['B9'] = '环比' ws['B9'].border = f_border - ws['B10'].font = title_font - ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' - ws['B10'].border = f_border - col = '' for i in range(0, ca_len): col = chr(ord('C') + i) - ws[col + '7'].fill = table_fill + ws[col + '6'].fill = table_fill + ws[col + '6'].font = name_font + ws[col + '6'].alignment = c_c_alignment + ws[col + '6'] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + ws[col + '6'].border = f_border + ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment - ws[col + '7'] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + ws[col + '7'] = round(reporting_period_data['subtotals'][i], 2) ws[col + '7'].border = f_border ws[col + '8'].font = name_font ws[col + '8'].alignment = c_c_alignment - ws[col + '8'] = round(reporting_period_data['subtotals'][i], 2) + ws[col + '8'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) ws[col + '8'].border = f_border ws[col + '9'].font = name_font ws[col + '9'].alignment = c_c_alignment - ws[col + '9'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) - ws[col + '9'].border = f_border - - ws[col + '10'].font = name_font - ws[col + '10'].alignment = c_c_alignment - ws[col + '10'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \ + ws[col + '9'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \ if reporting_period_data['increment_rates'][i] is not None else "-" - ws[col + '10'].border = f_border + ws[col + '9'].border = f_border col = chr(ord(col) + 1) - ws[col + '7'].fill = table_fill + ws[col + '6'].fill = table_fill + ws[col + '6'].font = name_font + ws[col + '6'].alignment = c_c_alignment + ws[col + '6'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '6'].border = f_border + ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment - ws[col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '7'] = round(reporting_period_data['total'], 2) ws[col + '7'].border = f_border ws[col + '8'].font = name_font ws[col + '8'].alignment = c_c_alignment - ws[col + '8'] = round(reporting_period_data['total'], 2) + ws[col + '8'] = round(reporting_period_data['total_per_unit_area'], 2) ws[col + '8'].border = f_border ws[col + '9'].font = name_font ws[col + '9'].alignment = c_c_alignment - ws[col + '9'] = round(reporting_period_data['total_per_unit_area'], 2) + ws[col + '9'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \ + if reporting_period_data['total_increment_rate'] is not None else "-" ws[col + '9'].border = f_border - ws[col + '10'].font = name_font - ws[col + '10'].alignment = c_c_alignment - ws[col + '10'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \ - if reporting_period_data['total_increment_rate'] is not None else "-" - ws[col + '10'].border = f_border - else: - for i in range(6, 10 + 1): + for i in range(6, 9 + 1): ws.row_dimensions[i].height = 0.1 ################################## - current_row_number = 12 + current_row_number = 11 has_subtotals_data_flag = True if "subtotals" not in reporting_period_data.keys() or \ reporting_period_data['subtotals'] is None or \ @@ -333,19 +333,19 @@ def generate_excel(report, s1.dLbls.showCatName = False s1.dLbls.showVal = True s1.dLbls.showPercent = True - table_cell = 'E' + str(table_start_row_number) + table_cell = 'E' + str(table_start_row_number - 1) ws.add_chart(pie, table_cell) if ca_len < 4: current_row_number = current_row_number - ca_len + 4 else: - for i in range(21, 29 + 1): - current_row_number = 30 + for i in range(13, 22 + 1): + current_row_number = 23 ws.row_dimensions[i].height = 0.1 ################################## - current_row_number = 20 + current_row_number = 15 has_child_flag = True @@ -420,42 +420,42 @@ def generate_excel(report, current_row_number += 1 chart_start_row_number = current_row_number - # Pie - for i in range(0, ca_len): - pie = PieChart() - labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, - max_row=table_end_row_number) - pie.add_data(pie_data, titles_from_data=True) - pie.set_categories(labels) - pie.height = 6.6 - pie.width = 8 - pie.title = ws.cell(column=3+i, row=table_start_row_number).value - s1 = pie.series[0] - s1.dLbls = DataLabelList() - s1.dLbls.showCatName = False - s1.dLbls.showVal = True - s1.dLbls.showPercent = True - chart_cell = '' - if i % 2 == 0: - chart_cell = 'B' + str(chart_start_row_number) - else: - chart_cell = 'E' + str(chart_start_row_number) - chart_start_row_number += 5 - ws.add_chart(pie, chart_cell) - - # chart_col = chr(ord('B') + 2 * i) - # chart_cell = chart_col + str(current_row_number) - # ws.add_chart(pie, chart_cell) - current_row_number = chart_start_row_number - - if ca_len % 2 == 1: - current_row_number += 5 - - # else: - # for i in range(19, 36 + 1): - # current_row_number = 36 - # ws.row_dimensions[i].height = 0.1 + # # Pie + # for i in range(0, ca_len): + # pie = PieChart() + # labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + # pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, + # max_row=table_end_row_number) + # pie.add_data(pie_data, titles_from_data=True) + # pie.set_categories(labels) + # pie.height = 6.6 + # pie.width = 8 + # pie.title = ws.cell(column=3+i, row=table_start_row_number).value + # s1 = pie.series[0] + # s1.dLbls = DataLabelList() + # s1.dLbls.showCatName = False + # s1.dLbls.showVal = True + # s1.dLbls.showPercent = True + # chart_cell = '' + # if i % 2 == 0: + # chart_cell = 'B' + str(chart_start_row_number) + # else: + # chart_cell = 'E' + str(chart_start_row_number) + # chart_start_row_number += 5 + # ws.add_chart(pie, chart_cell) + # + # # chart_col = chr(ord('B') + 2 * i) + # # chart_cell = chart_col + str(current_row_number) + # # ws.add_chart(pie, chart_cell) + # current_row_number = chart_start_row_number + # + # if ca_len % 2 == 1: + # current_row_number += 5 + # + # # else: + # # for i in range(19, 36 + 1): + # # current_row_number = 36 + # # ws.row_dimensions[i].height = 0.1 current_row_number += 1 From aaddf6b80b73b0244e859c9c4f0b127af379c0e9 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 16:53:46 +0800 Subject: [PATCH 10/25] Implemented the CombinedEquipmentSaving Excel Exporter --- .../excelexporters/combinedequipmentsaving.py | 533 ++++++++++++++++++ 1 file changed, 533 insertions(+) create mode 100644 myems-api/excelexporters/combinedequipmentsaving.py diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py new file mode 100644 index 00000000..fe5d4363 --- /dev/null +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -0,0 +1,533 @@ +import base64 +import uuid +import os +from openpyxl.chart import ( + PieChart, + LineChart, + BarChart, + Reference, +) +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font +from openpyxl.drawing.image import Image +from openpyxl import Workbook +from openpyxl.chart.label import DataLabelList + + +#################################################################################################################### +# PROCEDURES +# Step 1: Validate the report data +# Step 2: Generate excel file +# Step 3: Encode the excel file bytes to Base64 +#################################################################################################################### + + +def export(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + #################################################################################################################### + # Step 1: Validate the report data + #################################################################################################################### + if report is None: + return None + print(report) + + #################################################################################################################### + # Step 2: Generate excel file from the report data + #################################################################################################################### + filename = generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + #################################################################################################################### + # Step 3: Encode the excel file to Base64 + #################################################################################################################### + try: + with open(filename, 'rb') as binary_file: + binary_file_data = binary_file.read() + except IOError as ex: + pass + + # Base64 encode the bytes + base64_encoded_data = base64.b64encode(binary_file_data) + # get the Base64 encoded data using human-readable characters. + base64_message = base64_encoded_data.decode('utf-8') + # delete the file from server + try: + os.remove(filename) + except NotImplementedError as ex: + pass + return base64_message + + +def generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + wb = Workbook() + ws = wb.active + + # Row height + ws.row_dimensions[1].height = 102 + for i in range(2, 2000 + 1): + ws.row_dimensions[i].height = 42 + + # Col width + ws.column_dimensions['A'].width = 1.5 + + ws.column_dimensions['B'].width = 25.0 + + for i in range(ord('C'), ord('L')): + ws.column_dimensions[chr(i)].width = 15.0 + + # Font + name_font = Font(name='Constantia', size=15, bold=True) + title_font = Font(name='宋体', size=15, bold=True) + data_font = Font(name='Franklin Gothic Book', size=11) + + table_fill = PatternFill(fill_type='solid', fgColor='1F497D') + f_border = Border(left=Side(border_style='medium', color='00000000'), + right=Side(border_style='medium', color='00000000'), + bottom=Side(border_style='medium', color='00000000'), + top=Side(border_style='medium', color='00000000') + ) + b_border = Border( + bottom=Side(border_style='medium', color='00000000'), + ) + + b_c_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + c_c_alignment = Alignment(vertical='center', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + b_r_alignment = Alignment(vertical='bottom', + horizontal='right', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + c_r_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + ws.add_image(img, 'B1') + + # Title + ws.row_dimensions[3].height = 60 + + ws['B3'].font = name_font + ws['B3'].alignment = b_r_alignment + ws['B3'] = 'Name:' + ws['C3'].border = b_border + ws['C3'].alignment = b_c_alignment + ws['C3'].font = name_font + ws['C3'] = name + + ws['D3'].font = name_font + ws['D3'].alignment = b_r_alignment + ws['D3'] = 'Period:' + ws['E3'].border = b_border + ws['E3'].alignment = b_c_alignment + ws['E3'].font = name_font + ws['E3'] = period_type + + ws['F3'].font = name_font + ws['F3'].alignment = b_r_alignment + ws['F3'] = 'Date:' + ws['G3'].alignment = b_c_alignment + ws['G3'].font = name_font + ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws.merge_cells("G3:H3") + + if "reporting_period" not in report.keys() or \ + "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename + + ################################## + + current_row_number = 6 + + reporting_period_data = report['reporting_period'] + + has_names_data_flag = True + + if "names" not in reporting_period_data.keys() or \ + reporting_period_data['names'] is None or \ + len(reporting_period_data['names']) == 0: + has_names_data_flag = False + + if has_names_data_flag: + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 报告期节约' + + current_row_number += 1 + + category = reporting_period_data['names'] + ca_len = len(category) + + ws.row_dimensions[current_row_number].height = 75 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = \ + reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + + col = chr(ord(col) + 1) + + current_row_number += 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '节约' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2) + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgce_saving'] / 1000, 2) + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgco2e_saving'] / 1000, 2) + + col = chr(ord(col) + 1) + + current_row_number += 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '环比' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = str( + round(reporting_period_data['increment_rates_saving'][i] * 100, 2)) + '%' \ + if reporting_period_data['increment_rates_saving'][i] is not None else '-' + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = str( + round(reporting_period_data['increment_rate_in_kgce_saving'] * 100, 2)) + '%' \ + if reporting_period_data['increment_rate_in_kgce_saving'] is not None else '-' + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = str( + round(reporting_period_data['increment_rate_in_kgco2e_saving'] * 100, 2)) + '%' \ + if reporting_period_data['increment_rate_in_kgco2e_saving'] is not None else '-' + + col = chr(ord(col) + 1) + + current_row_number += 2 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + + current_row_number += 1 + table_start_row_number = current_row_number + chart_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '吨标准煤(TCE)占比' + + current_row_number += 1 + + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce_saving'][i] / 1000, 3) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + pie = PieChart() + pie.title = name + ' 吨标准煤(TCE)占比' + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 7.25 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + ws.add_chart(pie, 'D' + str(chart_start_row_number)) + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + + current_row_number += 1 + table_start_row_number = current_row_number + chart_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '吨二氧化碳排放(TCO2E)占比' + + current_row_number += 1 + + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / 1000, 3) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + pie = PieChart() + pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 7.25 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + ws.add_chart(pie, 'D' + str(chart_start_row_number)) + + ############################################# + + has_values_saving_data = True + has_timestamps_data = True + + if 'values_saving' not in reporting_period_data.keys() or \ + reporting_period_data['values_saving'] is None or \ + len(reporting_period_data['values_saving']) == 0: + has_values_saving_data = False + + if 'timestamps' not in reporting_period_data.keys() or \ + reporting_period_data['timestamps'] is None or \ + len(reporting_period_data['timestamps']) == 0 or \ + len(reporting_period_data['timestamps'][0]) == 0: + has_timestamps_data = False + + if has_values_saving_data and has_timestamps_data: + ca_len = len(reporting_period_data['names']) + time = reporting_period_data['timestamps'][0] + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' + + current_row_number += 1 + + chart_start_row_number = current_row_number + + current_row_number += ca_len * 6 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '日期时间' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + col = chr(ord(col) + 1) + + current_row_number += 1 + + for i in range(0, len(time)): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = time[i] + + col = 'C' + for j in range(0, ca_len): + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['values_saving'][j][i], 2) \ + if reporting_period_data['values_saving'][j][i] is not None else 0.00 + col = chr(ord(col) + 1) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '小计' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2) + col = chr(ord(col) + 1) + + current_row_number += 2 + + format_time_width_number = 1.0 + min_len_number = 1.0 + min_width_number = 11.0 # format_time_width_number * min_len_number + 4 and min_width_number > 11.0 + + if period_type == 'hourly': + format_time_width_number = 4.0 + min_len_number = 2 + min_width_number = 12.0 + elif period_type == 'daily': + format_time_width_number = 2.5 + min_len_number = 4 + min_width_number = 14.0 + elif period_type == 'monthly': + format_time_width_number = 2.1 + min_len_number = 4 + min_width_number = 12.4 + elif period_type == 'yearly': + format_time_width_number = 1.5 + min_len_number = 5 + min_width_number = 11.5 + + for i in range(0, ca_len): + line = LineChart() + line.title = '报告期节约 - ' + \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) + line.add_data(line_data, titles_from_data=True) + line.set_categories(labels) + line_data = line.series[0] + line_data.marker.symbol = "circle" + line_data.smooth = True + line.height = 8.25 + line.width = format_time_width_number * len(time) if len(time) > min_len_number else min_width_number + if line.width > 24: + line.width = 24 + line.x_axis.crosses = 'min' + line.dLbls = DataLabelList() + line.dLbls.dLblPos = 't' + line.dLbls.showVal = True + line.dLbls.showPercent = False + chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number) + chart_start_row_number += 6 + ws.add_chart(line, chart_cell) + + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename From 5e107e3b5ce596d4b72b30dc60e3b50c8b88dc41 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 16:55:40 +0800 Subject: [PATCH 11/25] Added 'excelexporters.combinedequipmentsaving.export()' method --- myems-api/reports/combinedequipmentsaving.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/myems-api/reports/combinedequipmentsaving.py b/myems-api/reports/combinedequipmentsaving.py index 7adcbe84..e66b21d1 100644 --- a/myems-api/reports/combinedequipmentsaving.py +++ b/myems-api/reports/combinedequipmentsaving.py @@ -5,6 +5,7 @@ import config from datetime import datetime, timedelta, timezone from core import utilities from decimal import Decimal +import excelexporters.combinedequipmentsaving class Reporting: @@ -666,4 +667,11 @@ class Reporting: "values": parameters_data['values'] } + # export result to Excel file and then encode the file to base64 string + result['excel_bytes_base64'] = excelexporters.combinedequipmentsaving.export(result, + combined_equipment['name'], + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + resp.body = json.dumps(result) From 93a87cb1b055a09b4d6510280b1ec729a9042437 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 17:13:21 +0800 Subject: [PATCH 12/25] Implemented the EquipmentSaving Excel Exporter --- myems-api/excelexporters/equipmentsaving.py | 534 ++++++++++++++++++++ 1 file changed, 534 insertions(+) create mode 100644 myems-api/excelexporters/equipmentsaving.py diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py new file mode 100644 index 00000000..fbc853aa --- /dev/null +++ b/myems-api/excelexporters/equipmentsaving.py @@ -0,0 +1,534 @@ +import base64 +import uuid +import os +from openpyxl.chart import ( + PieChart, + LineChart, + BarChart, + Reference, +) +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font +from openpyxl.drawing.image import Image +from openpyxl import Workbook +from openpyxl.chart.label import DataLabelList + + +#################################################################################################################### +# PROCEDURES +# Step 1: Validate the report data +# Step 2: Generate excel file +# Step 3: Encode the excel file bytes to Base64 +#################################################################################################################### + + +def export(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + #################################################################################################################### + # Step 1: Validate the report data + #################################################################################################################### + if report is None: + return None + print(report) + + #################################################################################################################### + # Step 2: Generate excel file from the report data + #################################################################################################################### + filename = generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + #################################################################################################################### + # Step 3: Encode the excel file to Base64 + #################################################################################################################### + try: + with open(filename, 'rb') as binary_file: + binary_file_data = binary_file.read() + except IOError as ex: + pass + + # Base64 encode the bytes + base64_encoded_data = base64.b64encode(binary_file_data) + # get the Base64 encoded data using human-readable characters. + base64_message = base64_encoded_data.decode('utf-8') + # delete the file from server + try: + os.remove(filename) + except NotImplementedError as ex: + pass + return base64_message + + +def generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + wb = Workbook() + ws = wb.active + + # Row height + ws.row_dimensions[1].height = 102 + for i in range(2, 2000 + 1): + ws.row_dimensions[i].height = 42 + + # Col width + ws.column_dimensions['A'].width = 1.5 + + ws.column_dimensions['B'].width = 25.0 + + for i in range(ord('C'), ord('L')): + ws.column_dimensions[chr(i)].width = 15.0 + + # Font + name_font = Font(name='Constantia', size=15, bold=True) + title_font = Font(name='宋体', size=15, bold=True) + data_font = Font(name='Franklin Gothic Book', size=11) + + table_fill = PatternFill(fill_type='solid', fgColor='1F497D') + f_border = Border(left=Side(border_style='medium', color='00000000'), + right=Side(border_style='medium', color='00000000'), + bottom=Side(border_style='medium', color='00000000'), + top=Side(border_style='medium', color='00000000') + ) + b_border = Border( + bottom=Side(border_style='medium', color='00000000'), + ) + + b_c_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + c_c_alignment = Alignment(vertical='center', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + b_r_alignment = Alignment(vertical='bottom', + horizontal='right', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + c_r_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + ws.add_image(img, 'B1') + + # Title + ws.row_dimensions[3].height = 60 + + ws['B3'].font = name_font + ws['B3'].alignment = b_r_alignment + ws['B3'] = 'Name:' + ws['C3'].border = b_border + ws['C3'].alignment = b_c_alignment + ws['C3'].font = name_font + ws['C3'] = name + + ws['D3'].font = name_font + ws['D3'].alignment = b_r_alignment + ws['D3'] = 'Period:' + ws['E3'].border = b_border + ws['E3'].alignment = b_c_alignment + ws['E3'].font = name_font + ws['E3'] = period_type + + ws['F3'].font = name_font + ws['F3'].alignment = b_r_alignment + ws['F3'] = 'Date:' + ws['G3'].alignment = b_c_alignment + ws['G3'].font = name_font + ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws['G3'].border = b_border + ws.merge_cells("G3:H3") + + if "reporting_period" not in report.keys() or \ + "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename + + ################################## + + current_row_number = 6 + + reporting_period_data = report['reporting_period'] + + has_names_data_flag = True + + if "names" not in reporting_period_data.keys() or \ + reporting_period_data['names'] is None or \ + len(reporting_period_data['names']) == 0: + has_names_data_flag = False + + if has_names_data_flag: + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 报告期节约' + + current_row_number += 1 + + category = reporting_period_data['names'] + ca_len = len(category) + + ws.row_dimensions[current_row_number].height = 75 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = \ + reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + + col = chr(ord(col) + 1) + + current_row_number += 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '节约' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2) + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgce_saving'] / 1000, 2) + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgco2e_saving'] / 1000, 2) + + col = chr(ord(col) + 1) + + current_row_number += 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '环比' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = str( + round(reporting_period_data['increment_rates_saving'][i] * 100, 2)) + '%' \ + if reporting_period_data['increment_rates_saving'][i] is not None else '-' + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = str( + round(reporting_period_data['increment_rate_in_kgce_saving'] * 100, 2)) + '%' \ + if reporting_period_data['increment_rate_in_kgce_saving'] is not None else '-' + + col = chr(ord(col) + 1) + + ws[col + str(current_row_number)].font = name_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = str( + round(reporting_period_data['increment_rate_in_kgco2e_saving'] * 100, 2)) + '%' \ + if reporting_period_data['increment_rate_in_kgco2e_saving'] is not None else '-' + + col = chr(ord(col) + 1) + + current_row_number += 2 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + + current_row_number += 1 + table_start_row_number = current_row_number + chart_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '吨标准煤(TCE)占比' + + current_row_number += 1 + + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce_saving'][i] / 1000, 3) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + pie = PieChart() + pie.title = name + ' 吨标准煤(TCE)占比' + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 7.25 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + ws.add_chart(pie, 'D' + str(chart_start_row_number)) + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + + current_row_number += 1 + table_start_row_number = current_row_number + chart_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].border = f_border + + ws['C' + str(current_row_number)].fill = table_fill + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = '吨二氧化碳排放(TCO2E)占比' + + current_row_number += 1 + + for i in range(0, ca_len): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + + ws['C' + str(current_row_number)].font = name_font + ws['C' + str(current_row_number)].alignment = c_c_alignment + ws['C' + str(current_row_number)].border = f_border + ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / 1000, 3) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + if ca_len < 4: + current_row_number = current_row_number - ca_len + 4 + + current_row_number += 1 + + pie = PieChart() + pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) + pie.add_data(pie_data, titles_from_data=True) + pie.set_categories(labels) + pie.height = 7.25 + pie.width = 9 + s1 = pie.series[0] + s1.dLbls = DataLabelList() + s1.dLbls.showCatName = False + s1.dLbls.showVal = True + s1.dLbls.showPercent = True + ws.add_chart(pie, 'D' + str(chart_start_row_number)) + + ############################################# + + has_values_saving_data = True + has_timestamps_data = True + + if 'values_saving' not in reporting_period_data.keys() or \ + reporting_period_data['values_saving'] is None or \ + len(reporting_period_data['values_saving']) == 0: + has_values_saving_data = False + + if 'timestamps' not in reporting_period_data.keys() or \ + reporting_period_data['timestamps'] is None or \ + len(reporting_period_data['timestamps']) == 0 or \ + len(reporting_period_data['timestamps'][0]) == 0: + has_timestamps_data = False + + if has_values_saving_data and has_timestamps_data: + ca_len = len(reporting_period_data['names']) + time = reporting_period_data['timestamps'][0] + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' + + current_row_number += 1 + + chart_start_row_number = current_row_number + + current_row_number += ca_len * 6 + table_start_row_number = current_row_number + + ws.row_dimensions[current_row_number].height = 60 + ws['B' + str(current_row_number)].fill = table_fill + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '日期时间' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].fill = table_fill + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + col = chr(ord(col) + 1) + + current_row_number += 1 + + for i in range(0, len(time)): + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = time[i] + + col = 'C' + for j in range(0, ca_len): + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['values_saving'][j][i], 2) \ + if reporting_period_data['values_saving'][j][i] is not None else 0.00 + col = chr(ord(col) + 1) + + current_row_number += 1 + + table_end_row_number = current_row_number - 1 + + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)].alignment = c_c_alignment + ws['B' + str(current_row_number)].border = f_border + ws['B' + str(current_row_number)] = '小计' + + col = 'C' + + for i in range(0, ca_len): + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2) + col = chr(ord(col) + 1) + + current_row_number += 2 + + format_time_width_number = 1.0 + min_len_number = 1.0 + min_width_number = 11.0 # format_time_width_number * min_len_number + 4 and min_width_number > 11.0 + + if period_type == 'hourly': + format_time_width_number = 4.0 + min_len_number = 2 + min_width_number = 12.0 + elif period_type == 'daily': + format_time_width_number = 2.5 + min_len_number = 4 + min_width_number = 14.0 + elif period_type == 'monthly': + format_time_width_number = 2.1 + min_len_number = 4 + min_width_number = 12.4 + elif period_type == 'yearly': + format_time_width_number = 1.5 + min_len_number = 5 + min_width_number = 11.5 + + for i in range(0, ca_len): + line = LineChart() + line.title = '报告期节约 - ' + \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) + line.add_data(line_data, titles_from_data=True) + line.set_categories(labels) + line_data = line.series[0] + line_data.marker.symbol = "circle" + line_data.smooth = True + line.height = 8.25 + line.width = format_time_width_number * len(time) if len(time) > min_len_number else min_width_number + if line.width > 24: + line.width = 24 + line.x_axis.crosses = 'min' + line.dLbls = DataLabelList() + line.dLbls.dLblPos = 't' + line.dLbls.showVal = True + line.dLbls.showPercent = False + chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number) + chart_start_row_number += 6 + ws.add_chart(line, chart_cell) + + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename From 0f9b2fffb7c2b26ad07877afec330b0ed1847754 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 17:14:52 +0800 Subject: [PATCH 13/25] Added 'excelexporters.equipmentsaving.export()' method --- myems-api/reports/equipmentsaving.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/myems-api/reports/equipmentsaving.py b/myems-api/reports/equipmentsaving.py index 2f779295..af3a3247 100644 --- a/myems-api/reports/equipmentsaving.py +++ b/myems-api/reports/equipmentsaving.py @@ -5,6 +5,7 @@ import config from datetime import datetime, timedelta, timezone from core import utilities from decimal import Decimal +import excelexporters.equipmentsaving class Reporting: @@ -655,4 +656,11 @@ class Reporting: "values": parameters_data['values'] } + # export result to Excel file and then encode the file to base64 string + result['excel_bytes_base64'] = excelexporters.equipmentsaving.export(result, + equipment['name'], + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + resp.body = json.dumps(result) From 73e1e876b949c84c62cc13c0f3b8152097b7b0af Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 17:17:10 +0800 Subject: [PATCH 14/25] Modify the G3 cell style --- myems-api/excelexporters/combinedequipmentsaving.py | 1 + 1 file changed, 1 insertion(+) diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index fe5d4363..fbc853aa 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -155,6 +155,7 @@ def generate_excel(report, ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws['G3'].border = b_border ws.merge_cells("G3:H3") if "reporting_period" not in report.keys() or \ From b2b2905205fd709dcc562bb717f3ac62b60d5f75 Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 21:19:54 +0800 Subject: [PATCH 15/25] Percentage added --- .../excelexporters/combinedequipmentsaving.py | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index fbc853aa..7d5a7a1a 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -12,7 +12,6 @@ from openpyxl.drawing.image import Image from openpyxl import Workbook from openpyxl.chart.label import DataLabelList - #################################################################################################################### # PROCEDURES # Step 1: Validate the report data @@ -304,10 +303,18 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨标准煤(TCE)占比' + ws['C' + str(current_row_number)] = '节约' + + ws['D' + str(current_row_number)].fill = table_fill + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' current_row_number += 1 + subtotals_in_kgce_saving_sum = sum_list(reporting_period_data['subtotals_in_kgce_saving']) + for i in range(0, ca_len): ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment @@ -319,6 +326,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].border = f_border ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce_saving'][i] / 1000, 3) + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = \ + str(round(abs(reporting_period_data['subtotals_in_kgce_saving'][i]) / + subtotals_in_kgce_saving_sum * 100, 2)) + '%' + current_row_number += 1 table_end_row_number = current_row_number - 1 @@ -341,7 +355,7 @@ def generate_excel(report, s1.dLbls.showCatName = False s1.dLbls.showVal = True s1.dLbls.showPercent = True - ws.add_chart(pie, 'D' + str(chart_start_row_number)) + ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' @@ -358,10 +372,18 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨二氧化碳排放(TCO2E)占比' + ws['C' + str(current_row_number)] = '节约' + + ws['D' + str(current_row_number)].fill = table_fill + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' current_row_number += 1 + subtotals_in_kgco2e_saving_sum = sum_list(reporting_period_data['subtotals_in_kgco2e_saving']) + for i in range(0, ca_len): ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment @@ -373,6 +395,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].border = f_border ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / 1000, 3) + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = \ + str(round(abs(reporting_period_data['subtotals_in_kgco2e_saving'][i]) / + subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' + current_row_number += 1 table_end_row_number = current_row_number - 1 @@ -395,7 +424,7 @@ def generate_excel(report, s1.dLbls.showCatName = False s1.dLbls.showVal = True s1.dLbls.showPercent = True - ws.add_chart(pie, 'D' + str(chart_start_row_number)) + ws.add_chart(pie, 'E' + str(chart_start_row_number)) ############################################# @@ -506,7 +535,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() line.title = '报告期节约 - ' + \ - reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line.add_data(line_data, titles_from_data=True) @@ -532,3 +561,12 @@ def generate_excel(report, wb.save(filename) return filename + + +def sum_list(lists): + total = 0 + + for i in range(0, len(lists)): + total += abs(lists[i]) + + return total From a62735c9b656e7bd19ae711a5b3fec4a9204a6de Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Fri, 5 Mar 2021 21:24:00 +0800 Subject: [PATCH 16/25] Percentage added --- myems-api/excelexporters/equipmentsaving.py | 50 ++++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index fbc853aa..7d5a7a1a 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -12,7 +12,6 @@ from openpyxl.drawing.image import Image from openpyxl import Workbook from openpyxl.chart.label import DataLabelList - #################################################################################################################### # PROCEDURES # Step 1: Validate the report data @@ -304,10 +303,18 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨标准煤(TCE)占比' + ws['C' + str(current_row_number)] = '节约' + + ws['D' + str(current_row_number)].fill = table_fill + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' current_row_number += 1 + subtotals_in_kgce_saving_sum = sum_list(reporting_period_data['subtotals_in_kgce_saving']) + for i in range(0, ca_len): ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment @@ -319,6 +326,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].border = f_border ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce_saving'][i] / 1000, 3) + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = \ + str(round(abs(reporting_period_data['subtotals_in_kgce_saving'][i]) / + subtotals_in_kgce_saving_sum * 100, 2)) + '%' + current_row_number += 1 table_end_row_number = current_row_number - 1 @@ -341,7 +355,7 @@ def generate_excel(report, s1.dLbls.showCatName = False s1.dLbls.showVal = True s1.dLbls.showPercent = True - ws.add_chart(pie, 'D' + str(chart_start_row_number)) + ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' @@ -358,10 +372,18 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨二氧化碳排放(TCO2E)占比' + ws['C' + str(current_row_number)] = '节约' + + ws['D' + str(current_row_number)].fill = table_fill + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' current_row_number += 1 + subtotals_in_kgco2e_saving_sum = sum_list(reporting_period_data['subtotals_in_kgco2e_saving']) + for i in range(0, ca_len): ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment @@ -373,6 +395,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].border = f_border ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / 1000, 3) + ws['D' + str(current_row_number)].font = name_font + ws['D' + str(current_row_number)].alignment = c_c_alignment + ws['D' + str(current_row_number)].border = f_border + ws['D' + str(current_row_number)] = \ + str(round(abs(reporting_period_data['subtotals_in_kgco2e_saving'][i]) / + subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' + current_row_number += 1 table_end_row_number = current_row_number - 1 @@ -395,7 +424,7 @@ def generate_excel(report, s1.dLbls.showCatName = False s1.dLbls.showVal = True s1.dLbls.showPercent = True - ws.add_chart(pie, 'D' + str(chart_start_row_number)) + ws.add_chart(pie, 'E' + str(chart_start_row_number)) ############################################# @@ -506,7 +535,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() line.title = '报告期节约 - ' + \ - reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line.add_data(line_data, titles_from_data=True) @@ -532,3 +561,12 @@ def generate_excel(report, wb.save(filename) return filename + + +def sum_list(lists): + total = 0 + + for i in range(0, len(lists)): + total += abs(lists[i]) + + return total From 0a797a96b5609a3e1f0997314d7e659b0a968843 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 7 Mar 2021 10:52:48 +0800 Subject: [PATCH 17/25] removed abs function for calculating percentage in combinedequipmentsaving --- myems-api/excelexporters/combinedequipmentsaving.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index 7d5a7a1a..c272af9c 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -330,7 +330,7 @@ def generate_excel(report, ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)] = \ - str(round(abs(reporting_period_data['subtotals_in_kgce_saving'][i]) / + str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / subtotals_in_kgce_saving_sum * 100, 2)) + '%' current_row_number += 1 @@ -399,7 +399,7 @@ def generate_excel(report, ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)] = \ - str(round(abs(reporting_period_data['subtotals_in_kgco2e_saving'][i]) / + str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' current_row_number += 1 @@ -567,6 +567,6 @@ def sum_list(lists): total = 0 for i in range(0, len(lists)): - total += abs(lists[i]) + total += lists[i] return total From 57a4bf377bb6be2347d344a6b68d52abf559e6c3 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 7 Mar 2021 10:58:30 +0800 Subject: [PATCH 18/25] removed abs functions for calculating percentage in equipmentsaving --- myems-api/excelexporters/equipmentsaving.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index 7d5a7a1a..c272af9c 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -330,7 +330,7 @@ def generate_excel(report, ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)] = \ - str(round(abs(reporting_period_data['subtotals_in_kgce_saving'][i]) / + str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / subtotals_in_kgce_saving_sum * 100, 2)) + '%' current_row_number += 1 @@ -399,7 +399,7 @@ def generate_excel(report, ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)] = \ - str(round(abs(reporting_period_data['subtotals_in_kgco2e_saving'][i]) / + str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' current_row_number += 1 @@ -567,6 +567,6 @@ def sum_list(lists): total = 0 for i in range(0, len(lists)): - total += abs(lists[i]) + total += lists[i] return total From cd6237d57c0ac3917c044ac14a17ba3b15e06b9d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 7 Mar 2021 11:08:36 +0800 Subject: [PATCH 19/25] fixed divide by zero issues in equipmentsaving --- myems-api/excelexporters/equipmentsaving.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index c272af9c..e01ce855 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -329,9 +329,9 @@ def generate_excel(report, ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = \ - str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / - subtotals_in_kgce_saving_sum * 100, 2)) + '%' + ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / + subtotals_in_kgce_saving_sum * 100, 2)) + '%' \ + if subtotals_in_kgce_saving_sum > 0 else '-' current_row_number += 1 @@ -398,9 +398,9 @@ def generate_excel(report, ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = \ - str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / - subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' + ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / + subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' \ + if subtotals_in_kgco2e_saving_sum > 0 else '-' current_row_number += 1 From 75015e14177b40446479f75b5eda10fb5ca991ec Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 7 Mar 2021 11:16:50 +0800 Subject: [PATCH 20/25] fixed DivisionUndefined issues in combinedequipmentsaving --- myems-api/excelexporters/combinedequipmentsaving.py | 12 ++++++------ myems-api/excelexporters/equipmentsaving.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index c272af9c..abfcdf5f 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -329,9 +329,9 @@ def generate_excel(report, ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = \ - str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / - subtotals_in_kgce_saving_sum * 100, 2)) + '%' + ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / + subtotals_in_kgce_saving_sum * 100, 2)) + '%'\ + if abs(subtotals_in_kgce_saving_sum) > 0 else '-' current_row_number += 1 @@ -398,9 +398,9 @@ def generate_excel(report, ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = \ - str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / - subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' + ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / + subtotals_in_kgco2e_saving_sum * 100, 2)) + '%'\ + if abs(subtotals_in_kgco2e_saving_sum) > 0 else '-' current_row_number += 1 diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index e01ce855..d1180d5a 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -331,7 +331,7 @@ def generate_excel(report, ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgce_saving'][i] / subtotals_in_kgce_saving_sum * 100, 2)) + '%' \ - if subtotals_in_kgce_saving_sum > 0 else '-' + if abs(subtotals_in_kgce_saving_sum) > 0 else '-' current_row_number += 1 @@ -400,7 +400,7 @@ def generate_excel(report, ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / subtotals_in_kgco2e_saving_sum * 100, 2)) + '%' \ - if subtotals_in_kgco2e_saving_sum > 0 else '-' + if abs(subtotals_in_kgco2e_saving_sum) > 0 else '-' current_row_number += 1 From c50840a720798e2955f42ba076939fd81ade9790 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Sun, 7 Mar 2021 11:47:11 +0800 Subject: [PATCH 21/25] Implemented the storeload Excel Exporter --- myems-api/excelexporters/shopfloorload.py | 9 +- myems-api/excelexporters/storeload.py | 428 ++++++++++++++++++++++ myems-api/reports/storeload.py | 8 + 3 files changed, 438 insertions(+), 7 deletions(-) create mode 100644 myems-api/excelexporters/storeload.py diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 3a972e34..9d8e5d23 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -272,13 +272,8 @@ def generate_excel(report, ca_len = len(names) row_title = 9 + ca_len * 2 - for i in range(row_title + 2, row_title + 2 + ca_len): - ws.row_dimensions[i].height = 62 - ws['B' + str(row_title)].font = title_font - ws['B' + str(row_title)] = name + ' 单位面积值' - ws['D' + str(row_title)].font = title_font - ws['D' + str(row_title)] = str(report['shopfloor']['area']) + 'M²' + ws['B' + str(row_title)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' category = reporting_period_data['names'] @@ -345,7 +340,7 @@ def generate_excel(report, # row_lines == the number of rows of lines row_lines = 6 * ca_len # row_sat == the number of rows of statistical analysis table - row_sat = 9 + 2 * ca_len + row_sat = 12 + 3 * ca_len # row_da == the number of rows of Detailed data row_da = row_sat + row_lines + 1 diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py new file mode 100644 index 00000000..903436f0 --- /dev/null +++ b/myems-api/excelexporters/storeload.py @@ -0,0 +1,428 @@ +import base64 +import uuid +import os +from openpyxl.chart import ( + LineChart, + Reference, +) +from openpyxl.chart.label import DataLabelList +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font +from openpyxl.drawing.image import Image +from openpyxl import Workbook + + +#################################################################################################################### +# PROCEDURES +# Step 1: Validate the report data +# Step 2: Generate excel file +# Step 3: Encode the excel file bytes to Base64 +#################################################################################################################### + + +def export(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + #################################################################################################################### + # Step 1: Validate the report data + #################################################################################################################### + if report is None: + return None + + #################################################################################################################### + # Step 2: Generate excel file from the report data + #################################################################################################################### + filename = generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + #################################################################################################################### + # Step 3: Encode the excel file to Base64 + #################################################################################################################### + try: + with open(filename, 'rb') as binary_file: + binary_file_data = binary_file.read() + except IOError as ex: + pass + + # Base64 encode the bytes + base64_encoded_data = base64.b64encode(binary_file_data) + # get the Base64 encoded data using human-readable characters. + base64_message = base64_encoded_data.decode('utf-8') + # delete the file from server + try: + os.remove(filename) + except NotImplementedError as ex: + pass + return base64_message + + +def generate_excel(report, + name, + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type): + wb = Workbook() + ws = wb.active + + # Row height + ws.row_dimensions[1].height = 102 + + for i in range(2, 2000 + 1): + ws.row_dimensions[i].height = 42 + + # Col width + ws.column_dimensions['A'].width = 1.5 + ws.column_dimensions['B'].width = 25.0 + + for i in range(ord('C'), ord('L')): + ws.column_dimensions[chr(i)].width = 15.0 + + # Font + name_font = Font(name='Constantia', size=15, bold=True) + title_font = Font(name='宋体', size=15, bold=True) + # data_font = Font(name='Franklin Gothic Book', size=11) + + table_fill = PatternFill(fill_type='solid', fgColor='1F497D') + f_border = Border(left=Side(border_style='medium', color='00000000'), + right=Side(border_style='medium', color='00000000'), + bottom=Side(border_style='medium', color='00000000'), + top=Side(border_style='medium', color='00000000') + ) + b_border = Border( + bottom=Side(border_style='medium', color='00000000'), + ) + + b_c_alignment = Alignment(vertical='bottom', + horizontal='center', + text_rotation=0, + wrap_text=False, + shrink_to_fit=False, + indent=0) + c_c_alignment = Alignment(vertical='center', + horizontal='center', + text_rotation=0, + wrap_text=True, + shrink_to_fit=False, + indent=0) + b_r_alignment = Alignment(vertical='bottom', + horizontal='right', + text_rotation=0, + wrap_text=False, + shrink_to_fit=False, + indent=0) + # c_r_alignment = Alignment(vertical='bottom', + # horizontal='center', + # text_rotation=0, + # wrap_text=False, + # shrink_to_fit=False, + # indent=0) + + # Img + img = Image("excelexporters/myems.png") + # img = Image("myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + ws.add_image(img, 'B1') + + # Title + ws['B3'].font = name_font + ws['B3'].alignment = b_r_alignment + ws['B3'] = 'Name:' + ws['C3'].border = b_border + ws['C3'].alignment = b_c_alignment + ws['C3'].font = name_font + ws['C3'] = name + + ws['D3'].font = name_font + ws['D3'].alignment = b_r_alignment + ws['D3'] = 'Period:' + ws['E3'].border = b_border + ws['E3'].alignment = b_c_alignment + ws['E3'].font = name_font + ws['E3'] = period_type + + ws['F3'].font = name_font + ws['F3'].alignment = b_r_alignment + ws['F3'] = 'Date:' + ws['G3'].border = b_border + ws['G3'].alignment = b_c_alignment + ws['G3'].font = name_font + ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws.merge_cells("G3:H3") + + if "reporting_period" not in report.keys() or \ + "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename + ################################################# + # First: 统计分析 + # 6: title + # 7: table title + # 8~ca_len table_data + ################################################# + reporting_period_data = report['reporting_period'] + + has_energy_data_flag = True + + if "names" not in reporting_period_data.keys() or \ + reporting_period_data['names'] is None or \ + len(reporting_period_data['names']) == 0: + has_energy_data_flag = False + + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename + + if has_energy_data_flag: + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' + + category = reporting_period_data['names'] + + # table_title + ws['B7'].fill = table_fill + ws['B7'].font = title_font + ws['B7'].alignment = c_c_alignment + ws['B7'] = '报告期' + ws['B7'].border = f_border + + ws['C7'].font = title_font + ws['C7'].alignment = c_c_alignment + ws['C7'] = '平均负荷' + ws['C7'].border = f_border + + ws['D7'].font = title_font + ws['D7'].alignment = c_c_alignment + ws['D7'] = '最大负荷' + ws['D7'].border = f_border + + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '负荷系数' + ws['E7'].border = f_border + + # table_data + + for i, value in enumerate(category): + row = i * 2 + 8 + ws['B' + str(row)].font = name_font + ws['B' + str(row)].alignment = c_c_alignment + ws['B' + str(row)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + "/H )" + ws['B' + str(row)].border = f_border + + ws['B' + str(row + 1)].font = name_font + ws['B' + str(row + 1)].alignment = c_c_alignment + ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)].border = f_border + + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = round(reporting_period_data['averages'][i], 2) \ + if reporting_period_data['averages'][i] is not None else '' + ws['C' + str(row)].border = f_border + ws['C' + str(row)].number_format = '0.00' + + ws['C' + str(row + 1)].font = name_font + ws['C' + str(row + 1)].alignment = c_c_alignment + ws['C' + str(row + 1)] = str(round(reporting_period_data['averages_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['averages_increment_rate'][i] is not None else '0.00%' + ws['C' + str(row + 1)].border = f_border + + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ + if reporting_period_data['maximums'][i] is not None else '' + ws['D' + str(row)].border = f_border + ws['D' + str(row)].number_format = '0.00' + + ws['D' + str(row + 1)].font = name_font + ws['D' + str(row + 1)].alignment = c_c_alignment + ws['D' + str(row + 1)] = str(round(reporting_period_data['maximums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['maximums_increment_rate'][i] is not None else '0.00%' + ws['D' + str(row + 1)].border = f_border + + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = round(reporting_period_data['factors'][i], 2) \ + if reporting_period_data['factors'][i] is not None else '' + ws['E' + str(row)].border = f_border + ws['E' + str(row)].number_format = '0.00' + + ws['E' + str(row + 1)].font = name_font + ws['E' + str(row + 1)].alignment = c_c_alignment + ws['E' + str(row + 1)] = str(round(reporting_period_data['factors_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['factors_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border + + ################################################# + # Second: 报告期单位面积消耗 + # 9 + ca_len * 2: title + # 10 + ca_len * 2: table title + # row_title + 2 ~ row_title + 2 + ca_len : table_data + ################################################# + + if has_energy_data_flag: + names = reporting_period_data['names'] + ca_len = len(names) + row_title = 9 + ca_len * 2 + + ws['B' + str(row_title)].font = title_font + ws['B' + str(row_title)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' + + category = reporting_period_data['names'] + + # table_title + ws['B' + str(row_title + 1)].fill = table_fill + ws['B' + str(row_title + 1)].font = title_font + ws['B' + str(row_title + 1)].alignment = c_c_alignment + ws['B' + str(row_title + 1)] = '报告期' + ws['B' + str(row_title + 1)].border = f_border + + ws['C' + str(row_title + 1)].font = title_font + ws['C' + str(row_title + 1)].alignment = c_c_alignment + ws['C' + str(row_title + 1)] = '平均负荷' + ws['C' + str(row_title + 1)].border = f_border + + ws['D' + str(row_title + 1)].font = title_font + ws['D' + str(row_title + 1)].alignment = c_c_alignment + ws['D' + str(row_title + 1)] = '最大负荷' + ws['D' + str(row_title + 1)].border = f_border + + # table_data + + for i, value in enumerate(category): + row_data = row_title + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/H/M²)" + ws['B' + str(row_data)].border = f_border + + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['averages_per_unit_area'][i] \ + or reporting_period_data['averages_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['averages_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' + + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' + + ######################################################## + # Third: 详细数据 + # row_sat~ row_sat + 6*cal_len: line + # row_da: table title + # row_da + 1~: table_data + ######################################################## + has_timestamps_flag = True + if "timestamps" not in reporting_period_data.keys() or \ + reporting_period_data['timestamps'] is None or \ + len(reporting_period_data['timestamps']) == 0: + has_timestamps_flag = False + + if has_timestamps_flag: + timestamps = reporting_period_data['timestamps'][0] + names = reporting_period_data['names'] + ca_len = len(names) + time_len = len(timestamps) + # row_lines == the number of rows of lines + row_lines = 6 * ca_len + # row_sat == the number of rows of statistical analysis table + row_sat = 12 + 3 * ca_len + # row_da == the number of rows of Detailed data + row_da = row_sat + row_lines + 1 + + ws['B' + str(row_da)].font = title_font + ws['B' + str(row_da)] = name + ' 详细数据' + # table_title + ws['B' + str(row_da + 1)].fill = table_fill + ws['B' + str(row_da + 1)].font = name_font + ws['B' + str(row_da + 1)].alignment = c_c_alignment + ws['B' + str(row_da + 1)] = "日期时间" + ws['B' + str(row_da + 1)].border = f_border + + for i in range(0, ca_len): + col_average = chr(ord('C') + 2 * i) + col_maximum = chr(ord('D') + 2 * i) + + ws[col_average + str(row_da + 1)].font = name_font + ws[col_average + str(row_da + 1)].alignment = c_c_alignment + ws[col_average + str(row_da + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][ + i] + "/H)" + ws[col_average + str(row_da + 1)].border = f_border + + ws[col_maximum + str(row_da + 1)].font = name_font + ws[col_maximum + str(row_da + 1)].alignment = c_c_alignment + ws[col_maximum + str(row_da + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][ + i] + "/H)" + ws[col_maximum + str(row_da + 1)].border = f_border + # table_date + for i in range(0, time_len): + rows = i + row_da + 2 + + ws['B' + str(rows)].font = name_font + ws['B' + str(rows)].alignment = c_c_alignment + ws['B' + str(rows)] = timestamps[i] + ws['B' + str(rows)].border = f_border + + for index in range(0, ca_len): + col_average = chr(ord('C') + 2 * index) + col_maximum = chr(ord('D') + 2 * index) + + ws[col_average + str(rows)].font = name_font + ws[col_average + str(rows)].alignment = c_c_alignment + ws[col_average + str(rows)] = reporting_period_data['sub_averages'][index][i] \ + if reporting_period_data['sub_maximums'][index] is not None else '' + ws[col_average + str(rows)].number_format = '0.00' + ws[col_average + str(rows)].border = f_border + + ws[col_maximum + str(rows)].font = name_font + ws[col_maximum + str(rows)].alignment = c_c_alignment + ws[col_maximum + str(rows)] = reporting_period_data['sub_maximums'][index][i] \ + if reporting_period_data['sub_maximums'][index] is not None else '' + ws[col_maximum + str(rows)].number_format = '0.00' + ws[col_maximum + str(rows)].border = f_border + + # LineChart + for i in range(0, ca_len): + lc = LineChart() + lc.title = "报告期 最大负荷" + lc.style = 10 + lc.x_axis.majorTickMark = 'in' + lc.y_axis.majorTickMark = 'in' + lc.smooth = True + lc.x_axis.crosses = 'min' + lc.height = 8.25 + lc.width = 24 + lc.dLbls = DataLabelList() + lc.dLbls.dLblPos = 't' + lc.dLbls.showVal = True + times = Reference(ws, min_col=2, min_row=row_da + 2, + max_row=row_da + 2 + time_len) + lc_data = Reference(ws, min_col=2 + 2 * (i+1), min_row=row_da + 1, + max_row=row_da + 1 + time_len) + lc.add_data(lc_data, titles_from_data=True) + lc.set_categories(times) + ser = lc.series[0] + ser.marker.symbol = "diamond" + ser.marker.size = 5 + chart_col = 'B' + chart_cell = str(row_sat + 6 * i) + ws.add_chart(lc, chart_col + chart_cell) + + filename = str(uuid.uuid4()) + '.xlsx' + wb.save(filename) + + return filename diff --git a/myems-api/reports/storeload.py b/myems-api/reports/storeload.py index cbc1e98a..be2d95bd 100644 --- a/myems-api/reports/storeload.py +++ b/myems-api/reports/storeload.py @@ -5,6 +5,7 @@ import config from datetime import datetime, timedelta, timezone from core import utilities from decimal import Decimal +import excelexporters.storeload class Reporting: @@ -546,4 +547,11 @@ class Reporting: "values": parameters_data['values'] } + # export result to Excel file and then encode the file to base64 string + result['excel_bytes_base64'] = excelexporters.storeload.export(result, + store['name'], + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) + resp.body = json.dumps(result) From 0d667e6e1d042d3d265a87bba3483dab4af0bf36 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 7 Mar 2021 11:56:00 +0800 Subject: [PATCH 22/25] fixed PEP8 warning in spacesaving --- myems-api/excelexporters/spacesaving.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index a0bbd25d..887f7e3d 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -632,8 +632,7 @@ def generate_excel(report, pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) pie.set_categories(labels) - pie.title = reporting_period_data['names'][i] + " (" + \ - reporting_period_data['units'][i] + ")" + pie.title = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" pie.height = 6.6 pie.width = 9 s1 = pie.series[0] From f73e528a9af708d32b2a588a09b17f4b4e7d7e2d Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Sun, 7 Mar 2021 13:07:11 +0800 Subject: [PATCH 23/25] delete unrelated code and Correct errors in Reports --- myems-api/excelexporters/spaceincome.py | 47 ------------------------- myems-api/reports/spaceincome.py | 12 +++---- 2 files changed, 6 insertions(+), 53 deletions(-) diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index 30c957d5..e388ca17 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -75,12 +75,6 @@ def generate_excel(report, for i in range(2, 2000 + 1): ws.row_dimensions[i].height = 42 - # for i in range(2, 37 + 1): - # ws.row_dimensions[i].height = 30 - # - # for i in range(38, 69 + 1): - # ws.row_dimensions[i].height = 30 - # Col width ws.column_dimensions['A'].width = 1.5 @@ -341,7 +335,6 @@ def generate_excel(report, else: for i in range(13, 22 + 1): - current_row_number = 23 ws.row_dimensions[i].height = 0.1 ################################## @@ -415,47 +408,7 @@ def generate_excel(report, ws[col + row].alignment = c_c_alignment ws[col + row] = round(every_day_sum, 2) ws[col + row].border = f_border - - table_end_row_number = current_row_number current_row_number += 1 - chart_start_row_number = current_row_number - - # # Pie - # for i in range(0, ca_len): - # pie = PieChart() - # labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - # pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, - # max_row=table_end_row_number) - # pie.add_data(pie_data, titles_from_data=True) - # pie.set_categories(labels) - # pie.height = 6.6 - # pie.width = 8 - # pie.title = ws.cell(column=3+i, row=table_start_row_number).value - # s1 = pie.series[0] - # s1.dLbls = DataLabelList() - # s1.dLbls.showCatName = False - # s1.dLbls.showVal = True - # s1.dLbls.showPercent = True - # chart_cell = '' - # if i % 2 == 0: - # chart_cell = 'B' + str(chart_start_row_number) - # else: - # chart_cell = 'E' + str(chart_start_row_number) - # chart_start_row_number += 5 - # ws.add_chart(pie, chart_cell) - # - # # chart_col = chr(ord('B') + 2 * i) - # # chart_cell = chart_col + str(current_row_number) - # # ws.add_chart(pie, chart_cell) - # current_row_number = chart_start_row_number - # - # if ca_len % 2 == 1: - # current_row_number += 5 - # - # # else: - # # for i in range(19, 36 + 1): - # # current_row_number = 36 - # # ws.row_dimensions[i].height = 0.1 current_row_number += 1 diff --git a/myems-api/reports/spaceincome.py b/myems-api/reports/spaceincome.py index 979c6ea0..5ad66776 100644 --- a/myems-api/reports/spaceincome.py +++ b/myems-api/reports/spaceincome.py @@ -562,10 +562,10 @@ class Reporting: result['child_space']['subtotals_array'].append( child_space_data[energy_category_id]['subtotals']) - # export result to Excel file and then encode the file to base64 string - result['excel_bytes_base64'] = excelexporters.spaceincome.export(result, - space['name'], - reporting_start_datetime_local, - reporting_end_datetime_local, - period_type) + # export result to Excel file and then encode the file to base64 string + result['excel_bytes_base64'] = excelexporters.spaceincome.export(result, + space['name'], + reporting_start_datetime_local, + reporting_end_datetime_local, + period_type) resp.body = json.dumps(result) From 38d98a5ca17c41e0ed1de2c52748d3d2d5e39b34 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 7 Mar 2021 15:29:57 +0800 Subject: [PATCH 24/25] updated change log and version number --- CHANGELOG.md | 27 ++++++++++++++++++++++++++- admin/views/common/footer-login.html | 2 +- admin/views/common/footer.html | 2 +- database/upgrade1.0.7.sql | 3 +++ myems-api/core/version.py | 4 ++-- web/src/config.js | 2 +- 6 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 database/upgrade1.0.7.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index d42ff0b3..e160c8a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### Added +- None. + +### Changed +- None. + +### Fixed +- None. + +### Removed +- None. + +## [v1.0.7] - 2021-03-07 +### Added +- added excel exporter of storeload report +- added excel exporter of spaceincome report +- added excel exporter of equipmentsaving report +- added excel exporter of combinedequipmentsaving report +- added excel exporter of combinedequipmentload report +- added excel exporter of spaceoutput report +- added excel exporter of combinedequipmentoutput +- added excel exporter of combinedequipmentcost report +- added excel exporter of shopfloorcost report +- added excel exporter of shopfloorload report +- added excel exporter of combinedequipmentenergycategory report - added excel exporter of combinedequipmentitem report. - added excel exporter of equipmentenergyitem report. - added excel exporter of equipmentenergycategory report. @@ -53,7 +77,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. -[Unreleased]: https://github.com/MyEMS/myems/compare/v1.0.5...HEAD +[Unreleased]: https://github.com/MyEMS/myems/compare/v1.0.7...HEAD +[v1.0.7]: https://github.com/MyEMS/myems/compare/v1.0.6...v1.0.7 [v1.0.6]: https://github.com/MyEMS/myems/compare/v1.0.5...v1.0.6 [v1.0.5]: https://github.com/MyEMS/myems/releases/tag/v1.0.5 diff --git a/admin/views/common/footer-login.html b/admin/views/common/footer-login.html index bf7d36fa..3ceedced 100644 --- a/admin/views/common/footer-login.html +++ b/admin/views/common/footer-login.html @@ -1,5 +1,5 @@
diff --git a/admin/views/common/footer.html b/admin/views/common/footer.html index 249a0ba3..d5534c93 100644 --- a/admin/views/common/footer.html +++ b/admin/views/common/footer.html @@ -3,6 +3,6 @@ https://myems.io