From b7a80833802437457cda11a8754aeea2c862c9ef Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Sat, 10 Apr 2021 17:45:16 +0800 Subject: [PATCH 01/10] Parameter data has been added to the Excel export --- myems-api/excelexporters/metercost.py | 243 +++++++++++++++++- myems-api/excelexporters/meterenergy.py | 242 +++++++++++++++++ .../excelexporters/metersubmetersbalance.py | 242 +++++++++++++++++ myems-api/excelexporters/metertrend.py | 242 +++++++++++++++++ 4 files changed, 967 insertions(+), 2 deletions(-) diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index 26ac8466..8d190590 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -11,6 +11,7 @@ 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### @@ -59,6 +60,60 @@ def export(report, name, reporting_start_datetime_local, reporting_end_datetime_ return base64_message +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number + + +def decimal_to_column(num=65): + string = '' + num = num - 64 +# The column number is not greater than 90 + if num <= 26: + return chr(num+64) +# The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 +# Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): wb = Workbook() @@ -203,7 +258,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment ws[col + '7'] = report['meter']['energy_category_name'] + \ - " (" + report['meter']['unit_of_measure'] + ")" + " (" + report['meter']['unit_of_measure'] + ")" ws[col + '7'].border = f_border ws[col + '8'].font = name_font @@ -316,7 +371,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + '18'].font = title_font ws[col + '18'].alignment = c_c_alignment ws[col + '18'] = report['meter']['energy_category_name'] + \ - " (" + report['meter']['unit_of_measure'] + ")" + " (" + report['meter']['unit_of_measure'] + ")" ws[col + '18'].border = f_border time = times @@ -356,6 +411,190 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d for i in range(11, 43 + 1): ws.row_dimensions[i].height = 0.0 + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + current_sheet_parameters_row_number = 15 + ca_len * 6 + time_len + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 673fafff..41df793f 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -10,6 +10,7 @@ from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Fo from openpyxl.drawing.image import Image from openpyxl import Workbook from openpyxl.chart.label import DataLabelList +import openpyxl.utils.cell as format_cell #################################################################################################################### @@ -55,6 +56,60 @@ def export(result, name, reporting_start_datetime_local, reporting_end_datetime_ return base64_message +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number + + +def decimal_to_column(num=65): + string = '' + num = num - 64 +# The column number is not greater than 90 + if num <= 26: + return chr(num+64) +# The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 +# Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): wb = Workbook() @@ -372,6 +427,193 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d else: for i in range(11, 43 + 1): ws.row_dimensions[i].height = 0.0 + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + category = report['meter']['energy_category_name'] + ca_len = len(category) + current_sheet_parameters_row_number = 15 + ca_len * 6 + time_len + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 25e6292b..85eb2af9 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -10,6 +10,7 @@ from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Fo from openpyxl.drawing.image import Image from openpyxl import Workbook from openpyxl.chart.label import DataLabelList +import openpyxl.utils.cell as format_cell #################################################################################################################### @@ -55,6 +56,60 @@ def export(result, name, reporting_start_datetime_local, reporting_end_datetime_ return base64_message +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number + + +def decimal_to_column(num=65): + string = '' + num = num - 64 +# The column number is not greater than 90 + if num <= 26: + return chr(num+64) +# The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 +# Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): wb = Workbook() ws = wb.active @@ -313,6 +368,193 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d else: pass + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + category = report['meter']['energy_category_name'] + ca_len = len(category) + time_len = len(report['reporting_period']['timestamps']) + current_sheet_parameters_row_number = 17 + ca_len * 6 + time_len + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index e73e39cd..c21d847f 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -11,6 +11,7 @@ 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### @@ -62,6 +63,60 @@ def export(result, return base64_message +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number + + +def decimal_to_column(num=65): + string = '' + num = num - 64 +# The column number is not greater than 90 + if num <= 26: + return chr(num+64) +# The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 +# Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + def generate_excel(report, name, reporting_start_datetime_local, @@ -272,6 +327,193 @@ def generate_excel(report, for i in range(8, temp_max_row + 1 + 1 + + ca_len * 6): ws.row_dimensions[i].height = 42 + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + category = report['meter']['energy_category_name'] + ca_len = len(category) + time_len = len(report['reporting_period']['timestamps']) + current_sheet_parameters_row_number = 17 + ca_len * 6 + time_len + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 5b6ed073390dcecc7b125835bb672b1950a4217c Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 12 Apr 2021 16:06:44 +0800 Subject: [PATCH 02/10] fixed the sequence of detailed data line chart --- myems-api/excelexporters/metercost.py | 53 ++++++++++--------- myems-api/excelexporters/meterenergy.py | 39 +++++++------- .../excelexporters/metersubmetersbalance.py | 9 ++-- myems-api/excelexporters/metertrend.py | 44 ++++++--------- 4 files changed, 67 insertions(+), 78 deletions(-) diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index 8d190590..dbb51c70 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -88,10 +88,10 @@ def timestamps_data_not_equal_0(lists): def decimal_to_column(num=65): string = '' num = num - 64 -# The column number is not greater than 90 + # The column number is not greater than 90 if num <= 26: - return chr(num+64) -# The column number is greater than 90 + return chr(num + 64) + # The column number is greater than 90 while num // 26 > 0: if num % 26 == 0: string += 'Z' @@ -99,7 +99,7 @@ def decimal_to_column(num=65): else: string += chr(num % 26 + 64) num //= 26 -# Avoid conversion errors that might occur between 741 and 766 + # Avoid conversion errors that might occur between 741 and 766 if num > 0: string += chr(num + 64) @@ -257,8 +257,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + '7'].fill = table_fill ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment - ws[col + '7'] = report['meter']['energy_category_name'] + \ - " (" + report['meter']['unit_of_measure'] + ")" + ws[col + '7'] = report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")" ws[col + '7'].border = f_border ws[col + '8'].font = name_font @@ -328,29 +327,32 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d has_cost_datail_flag = False if has_cost_datail_flag: + parameters_names_len = len(report['parameters']['names']) + start_detail_data_row_number = 7 + (parameters_names_len + ca_len) * 6 + ws['B11'].font = title_font ws['B11'] = name + '详细数据' - ws.row_dimensions[18].height = 60 - ws['B18'].fill = table_fill - ws['B18'].font = title_font - ws['B18'].border = f_border - ws['B18'].alignment = c_c_alignment - ws['B18'] = '日期时间' + ws.row_dimensions[start_detail_data_row_number].height = 60 + ws['B' + str(start_detail_data_row_number)].fill = table_fill + ws['B' + str(start_detail_data_row_number)].font = title_font + ws['B' + str(start_detail_data_row_number)].border = f_border + ws['B' + str(start_detail_data_row_number)].alignment = c_c_alignment + ws['B' + str(start_detail_data_row_number)] = '日期时间' time = times has_data = False max_row = 0 if len(time) > 0: has_data = True - max_row = 18 + len(time) + max_row = start_detail_data_row_number + len(time) if has_data: - end_data_row_number = 19 + end_data_row_number = start_detail_data_row_number for i in range(0, len(time)): col = 'B' - end_data_row_number = 19 + i + end_data_row_number += 1 row = str(end_data_row_number) ws[col + row].font = title_font @@ -367,18 +369,18 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d col = chr(ord('C') + i) - ws[col + '18'].fill = table_fill - ws[col + '18'].font = title_font - ws[col + '18'].alignment = c_c_alignment - ws[col + '18'] = report['meter']['energy_category_name'] + \ - " (" + report['meter']['unit_of_measure'] + ")" - ws[col + '18'].border = f_border + ws[col + str(start_detail_data_row_number)].fill = table_fill + ws[col + str(start_detail_data_row_number)].font = title_font + ws[col + str(start_detail_data_row_number)].alignment = c_c_alignment + ws[col + str(start_detail_data_row_number)] = \ + report['meter']['energy_category_name']+" (" + report['meter']['unit_of_measure'] + ")" + ws[col + str(start_detail_data_row_number)].border = f_border time = times time_len = len(time) for j in range(0, time_len): - row = str(19 + j) + row = str(start_detail_data_row_number + 1 + j) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment @@ -393,9 +395,9 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d line = LineChart() line.title = '报告期成本 - ' + report['meter']['energy_category_name'] + \ " (" + report['meter']['unit_of_measure'] + ")" - line_data = Reference(ws, min_col=3, min_row=18, max_row=max_row) + line_data = Reference(ws, min_col=3, min_row=start_detail_data_row_number, max_row=max_row) line.series.append(Series(line_data, title_from_data=True)) - labels = Reference(ws, min_col=2, min_row=19, max_row=max_row) + labels = Reference(ws, min_col=2, min_row=start_detail_data_row_number + 1, max_row=max_row) line.set_categories(labels) line_data = line.series[0] line_data.marker.symbol = "circle" @@ -414,7 +416,8 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ########################################## has_parameters_names_and_timestamps_and_values_data = True # 12 is the starting line number of the last line chart in the report period - current_sheet_parameters_row_number = 15 + ca_len * 6 + time_len + time_len = len(reporting_period_data['timestamps']) + current_sheet_parameters_row_number = 12 + ca_len * 6 if 'parameters' not in report.keys() or \ report['parameters'] is None or \ 'names' not in report['parameters'].keys() or \ diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 41df793f..a7310abb 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -333,28 +333,30 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d reporting_period_data = report['reporting_period'] category = report['meter']['energy_category_name'] ca_len = len(category) + parameters_names_len = len(report['parameters']['names']) + start_detail_data_row_num = 7 + (parameters_names_len + ca_len) * 6 ws['B11'].font = title_font ws['B11'] = name + '详细数据' - ws.row_dimensions[18].height = 60 + ws.row_dimensions[start_detail_data_row_num].height = 60 - ws['B18'].fill = table_fill - ws['B18'].font = title_font - ws['B18'].border = f_border - ws['B18'].alignment = c_c_alignment - ws['B18'] = '日期时间' + ws['B' + str(start_detail_data_row_num)].fill = table_fill + ws['B' + str(start_detail_data_row_num)].font = title_font + ws['B' + str(start_detail_data_row_num)].border = f_border + ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment + ws['B' + str(start_detail_data_row_num)] = '日期时间' time = times has_data = False max_row = 0 if len(time) > 0: has_data = True - max_row = 18 + len(time) + max_row = start_detail_data_row_num + len(time) if has_data: for i in range(0, len(time)): col = 'B' - row = str(19 + i) + row = str(start_detail_data_row_num + 1 + i) # col = chr(ord('B') + i) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment @@ -365,19 +367,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # 12 title col = chr(ord('C') + i) - ws[col + '18'].fill = table_fill - ws[col + '18'].font = title_font - ws[col + '18'].alignment = c_c_alignment - ws[col + '18'] = report['meter']['energy_category_name'] + \ + ws[col + str(start_detail_data_row_num)].fill = table_fill + ws[col + str(start_detail_data_row_num)].font = title_font + ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment + ws[col + str(start_detail_data_row_num)] = report['meter']['energy_category_name'] + \ " (" + report['meter']['unit_of_measure'] + ")" - ws[col + '18'].border = f_border + ws[col + str(start_detail_data_row_num)].border = f_border # 13 data time = times time_len = len(time) for j in range(0, time_len): - row = str(19 + j) + row = str(start_detail_data_row_num + 1 + j) # col = chr(ord('B') + i) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment @@ -388,8 +390,8 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d line = LineChart() line.title = '报告期消耗 - ' + report['meter']['energy_category_name'] + \ " (" + report['meter']['unit_of_measure'] + ")" - labels = Reference(ws, min_col=2, min_row=19, max_row=max_row) - bar_data = Reference(ws, min_col=3, min_row=18, max_row=max_row) + labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num + 1, max_row=max_row) + bar_data = Reference(ws, min_col=3, min_row=start_detail_data_row_num, max_row=max_row) line.add_data(bar_data, titles_from_data=True) line.set_categories(labels) line_data = line.series[0] @@ -410,7 +412,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_chart(line, "B12") col = 'B' - row = str(19 + len(time)) + row = str(start_detail_data_row_num + 1 + len(time)) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment @@ -432,8 +434,9 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d has_parameters_names_and_timestamps_and_values_data = True # 12 is the starting line number of the last line chart in the report period category = report['meter']['energy_category_name'] + time_len = len(reporting_period_data['timestamps']) ca_len = len(category) - current_sheet_parameters_row_number = 15 + ca_len * 6 + time_len + current_sheet_parameters_row_number = 12 + ca_len * 6 if 'parameters' not in report.keys() or \ report['parameters'] is None or \ 'names' not in report['parameters'].keys() or \ diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 85eb2af9..481d761f 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -290,6 +290,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 2 time = reporting_period_data['timestamps'] + parameters_names_len = len(report['parameters']['names']) has_time_data_flag = False if time is not None and len(time) > 0: has_time_data_flag = True @@ -301,7 +302,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 1 chart_start_number = current_row_number - current_row_number = current_row_number + 6 + current_row_number = current_row_number + 7 + parameters_names_len * 6 table_start_number = current_row_number ws.row_dimensions[current_row_number].height = 60 @@ -374,7 +375,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d category = report['meter']['energy_category_name'] ca_len = len(category) time_len = len(report['reporting_period']['timestamps']) - current_sheet_parameters_row_number = 17 + ca_len * 6 + time_len + current_sheet_parameters_row_number = 14 + ca_len * 6 if 'parameters' not in report.keys() or \ report['parameters'] is None or \ 'names' not in report['parameters'].keys() or \ @@ -551,10 +552,6 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d chart_start_row_number += 6 ws.add_chart(line, chart_cell) - current_sheet_parameters_row_number = chart_start_row_number - - current_sheet_parameters_row_number += 1 - filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index c21d847f..6f325912 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -199,14 +199,6 @@ def generate_excel(report, 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:' @@ -247,6 +239,7 @@ def generate_excel(report, ca_len = len(ca) temp_max_row = 0 times = reporting_period_data['timestamps'] + category = report['meter']['energy_category_name'] if has_data_flag: ws['B6'].font = title_font ws['B6'] = name + ' 趋势' @@ -258,13 +251,18 @@ def generate_excel(report, ws['B7'].alignment = c_c_alignment ws['B7'] = '日期时间' time = times[0] + for time in times: + if len(time) > 0: + break has_data = False max_row = 0 + current_sheet_parameters_row_number = 10 if len(time) > 0: has_data = True max_row = 8 + len(time) # print("max_row", max_row) temp_max_row = max_row + current_sheet_parameters_row_number = 2 + ca_len * 6 + temp_max_row if has_data: for i in range(0, len(time)): col = 'B' @@ -285,19 +283,18 @@ def generate_excel(report, ws[col + '7'] = reporting_period_data['names'][i] ws[col + '7'].border = f_border - # 39 data - time = times[i] - time_len = len(time) + for j in range(0, len(time)): - for j in range(0, time_len): row = str(8 + 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], 3) + ws[col + row] = round(reporting_period_data['values'][i][j], 3) if \ + len(reporting_period_data['values'][i]) > 0 is not None and \ + reporting_period_data['values'][i][j] is not None else " " ws[col + row].border = f_border - # line - # 39~: line + # line + # 39~: line line = LineChart() line.title = '趋势值 - ' + reporting_period_data['names'][i] labels = Reference(ws, min_col=2, min_row=8, max_row=max_row-1) @@ -319,21 +316,18 @@ def generate_excel(report, # s1 = CharacterProperties(sz=1800) # font size *100 chart_col = chr(ord('B')) chart_cell = chart_col + str(max_row + 2 + 6*i) - print("chart_cell", chart_cell) + ws.add_chart(line, chart_cell) else: pass - for i in range(8, temp_max_row + 1 + 1 + + ca_len * 6): + for i in range(8, temp_max_row + 1 + 1 + + ca_len * 6 + len(category) * 6 + 2): ws.row_dimensions[i].height = 42 ########################################## has_parameters_names_and_timestamps_and_values_data = True # 12 is the starting line number of the last line chart in the report period - category = report['meter']['energy_category_name'] - ca_len = len(category) - time_len = len(report['reporting_period']['timestamps']) - current_sheet_parameters_row_number = 17 + ca_len * 6 + time_len + if 'parameters' not in report.keys() or \ report['parameters'] is None or \ 'names' not in report['parameters'].keys() or \ @@ -396,14 +390,6 @@ def generate_excel(report, parameters_ws['C3'].font = name_font parameters_ws['C3'] = name - parameters_ws['D3'].font = name_font - parameters_ws['D3'].alignment = b_r_alignment - parameters_ws['D3'] = 'Period:' - parameters_ws['E3'].border = b_border - parameters_ws['E3'].alignment = b_c_alignment - parameters_ws['E3'].font = name_font - parameters_ws['E3'] = period_type - parameters_ws['F3'].font = name_font parameters_ws['F3'].alignment = b_r_alignment parameters_ws['F3'] = 'Date:' From b868ae4f2567b60c5455ffc1e6ecd73ab00c01b0 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 12 Apr 2021 21:46:44 +0800 Subject: [PATCH 03/10] Modified the location of the detailed data table --- myems-api/excelexporters/metercost.py | 10 ++- myems-api/excelexporters/meterenergy.py | 9 ++- .../excelexporters/metersubmetersbalance.py | 8 ++- myems-api/excelexporters/metertrend.py | 67 +++++++++++-------- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index dbb51c70..53e8bc2d 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -322,13 +322,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d category = report['meter']['energy_category_name'] ca_len = len(category) times = reporting_period_data['timestamps'] + parameters_names_len = len(report['parameters']['names']) + parameters_data = report['parameters'] + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(parameters_data['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 if "values" not in reporting_period_data.keys() or len(reporting_period_data['values']) == 0: has_cost_datail_flag = False if has_cost_datail_flag: - parameters_names_len = len(report['parameters']['names']) - start_detail_data_row_number = 7 + (parameters_names_len + ca_len) * 6 + start_detail_data_row_number = 13 + (parameters_parameters_datas_len + ca_len) * 6 ws['B11'].font = title_font ws['B11'] = name + '详细数据' diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index a7310abb..560874cf 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -334,8 +334,13 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d category = report['meter']['energy_category_name'] ca_len = len(category) parameters_names_len = len(report['parameters']['names']) - start_detail_data_row_num = 7 + (parameters_names_len + ca_len) * 6 - + parameters_data = report['parameters'] + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(parameters_data['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + start_detail_data_row_num = 13 + (parameters_parameters_datas_len + ca_len) * 6 ws['B11'].font = title_font ws['B11'] = name + '详细数据' diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 481d761f..c08272e5 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -291,6 +291,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d time = reporting_period_data['timestamps'] parameters_names_len = len(report['parameters']['names']) + parameters_data = report['parameters'] + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(parameters_data['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 has_time_data_flag = False if time is not None and len(time) > 0: has_time_data_flag = True @@ -302,7 +308,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 1 chart_start_number = current_row_number - current_row_number = current_row_number + 7 + parameters_names_len * 6 + current_row_number = current_row_number + 1 + len(category) * 6 + parameters_parameters_datas_len * 6 table_start_number = current_row_number ws.row_dimensions[current_row_number].height = 60 diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index 6f325912..ebdb35e9 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -127,7 +127,7 @@ def generate_excel(report, # Row height ws.row_dimensions[1].height = 102 - for i in range(2, 5 + 1): + for i in range(2, 8): ws.row_dimensions[i].height = 42 # for i in range(2, 6 + 1): @@ -240,33 +240,45 @@ def generate_excel(report, temp_max_row = 0 times = reporting_period_data['timestamps'] category = report['meter']['energy_category_name'] + parameters_names_len = len(report['parameters']['names']) + parameters_data = report['parameters'] + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(parameters_data['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + start_detail_data_row_num = 9 + (parameters_parameters_datas_len + ca_len) * 6 if has_data_flag: - ws['B6'].font = title_font - ws['B6'] = name + ' 趋势' - - ws.row_dimensions[7].height = 60 - ws['B7'].fill = table_fill - ws['B7'].font = title_font - ws['B7'].border = f_border - ws['B7'].alignment = c_c_alignment - ws['B7'] = '日期时间' time = times[0] for time in times: if len(time) > 0: break has_data = False max_row = 0 - current_sheet_parameters_row_number = 10 + current_sheet_parameters_row_number = 7 + temp_max_row = max_row + for i in range(8, len(time) + 6 + ca_len * 6 + len(category) * 6 + 2): + ws.row_dimensions[i].height = 42 if len(time) > 0: has_data = True - max_row = 8 + len(time) - # print("max_row", max_row) - temp_max_row = max_row - current_sheet_parameters_row_number = 2 + ca_len * 6 + temp_max_row + current_sheet_parameters_row_number = 7 + ca_len * 6 if has_data: + + max_row = start_detail_data_row_num + len(time) + # print("max_row", max_row) + ws['B6'].font = title_font + ws['B6'] = name + ' 趋势' + + ws.row_dimensions[start_detail_data_row_num - 1].height = 60 + ws['B' + str(start_detail_data_row_num - 1)].fill = table_fill + ws['B' + str(start_detail_data_row_num - 1)].font = title_font + ws['B' + str(start_detail_data_row_num - 1)].border = f_border + ws['B' + str(start_detail_data_row_num - 1)].alignment = c_c_alignment + ws['B' + str(start_detail_data_row_num - 1)] = '日期时间' + for i in range(0, len(time)): col = 'B' - row = str(8 + i) + row = str(start_detail_data_row_num + i) # col = chr(ord('B') + i) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment @@ -277,28 +289,28 @@ def generate_excel(report, # 38 title col = chr(ord('C') + i) - ws[col + '7'].fill = table_fill - ws[col + '7'].font = title_font - ws[col + '7'].alignment = c_c_alignment - ws[col + '7'] = reporting_period_data['names'][i] - ws[col + '7'].border = f_border + ws[col + str(start_detail_data_row_num - 1)].fill = table_fill + ws[col + str(start_detail_data_row_num - 1)].font = title_font + ws[col + str(start_detail_data_row_num - 1)].alignment = c_c_alignment + ws[col + str(start_detail_data_row_num - 1)] = reporting_period_data['names'][i] + ws[col + str(start_detail_data_row_num - 1)].border = f_border for j in range(0, len(time)): - row = str(8 + j) + row = str(start_detail_data_row_num + 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], 3) if \ - len(reporting_period_data['values'][i]) > 0 is not None and \ + len(reporting_period_data['values'][i]) > 0 and \ reporting_period_data['values'][i][j] is not None else " " ws[col + row].border = f_border # line # 39~: line line = LineChart() line.title = '趋势值 - ' + reporting_period_data['names'][i] - labels = Reference(ws, min_col=2, min_row=8, max_row=max_row-1) - line_data = Reference(ws, min_col=3 + i, min_row=7, max_row=max_row-1) + labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num, max_row=max_row-1) + line_data = Reference(ws, min_col=3 + i, min_row=start_detail_data_row_num+1, max_row=max_row-1) line.add_data(line_data, titles_from_data=True) line.set_categories(labels) # line_data = line.series[0] @@ -315,15 +327,12 @@ def generate_excel(report, line.dLbls.showPercent = False # percent show # s1 = CharacterProperties(sz=1800) # font size *100 chart_col = chr(ord('B')) - chart_cell = chart_col + str(max_row + 2 + 6*i) + chart_cell = chart_col + str(7 + 6*i) ws.add_chart(line, chart_cell) else: pass - for i in range(8, temp_max_row + 1 + 1 + + ca_len * 6 + len(category) * 6 + 2): - ws.row_dimensions[i].height = 42 - ########################################## has_parameters_names_and_timestamps_and_values_data = True # 12 is the starting line number of the last line chart in the report period From 001412323e056555a0e2f170d17896dd5932d432 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 14 Apr 2021 21:26:40 +0800 Subject: [PATCH 04/10] Parameter Data is added to Excel Exporter of All Store Reports --- myems-api/excelexporters/storecost.py | 312 +++++++++++++++-- .../excelexporters/storeenergycategory.py | 242 ++++++++++++- myems-api/excelexporters/storeenergyitem.py | 264 +++++++++++++- myems-api/excelexporters/storeload.py | 327 +++++++++++++++--- myems-api/excelexporters/storesaving.py | 251 +++++++++++++- myems-api/excelexporters/storestatistics.py | 298 ++++++++++++++-- 6 files changed, 1574 insertions(+), 120 deletions(-) diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index af22c867..68b7894f 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -5,11 +5,13 @@ from openpyxl.chart import ( PieChart, BarChart, Reference, + LineChart, ) 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -60,6 +62,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -71,11 +119,8 @@ def generate_excel(report, # Row height ws.row_dimensions[1].height = 118 - 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 + for i in range(2, 2000 + 1): + ws.row_dimensions[i].height = 42 # Col width ws.column_dimensions['A'].width = 1.5 @@ -109,7 +154,7 @@ def generate_excel(report, c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', @@ -405,8 +450,6 @@ def generate_excel(report, ############################################### - current_row_number += 1 - has_detail_data_flag = True table_start_draw_flag = current_row_number + 1 @@ -420,12 +463,18 @@ def generate_excel(report, reporting_period_data = report['reporting_period'] times = reporting_period_data['timestamps'] ca_len = len(report['reporting_period']['names']) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 3 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 * 5 - current_row_number = table_start_row_number + current_row_number = detail_data_table_start_row_number time = times[0] has_data = False @@ -500,6 +549,27 @@ def generate_excel(report, col = 'B' + 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): col = chr(ord('C') + i) ws[col + str(current_row_number)].font = title_font @@ -507,20 +577,30 @@ def generate_excel(report, ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2) ws[col + str(current_row_number)].border = f_border - # bar - bar = BarChart() - labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) - bar_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) - bar.add_data(bar_data, titles_from_data=True) - bar.set_categories(labels) - bar.height = 4.9 - bar.width = 16 - bar.dLbls = DataLabelList() - bar.dLbls.showVal = True - bar.dLbls.showPercent = True + line = LineChart() + line.title = '报告期成本 - ' + \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=detail_data_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(table_start_draw_flag + 5 * i) - ws.add_chart(bar, chart_cell) + chart_cell = chart_col + str(table_start_draw_flag + 6 * i) + ws.add_chart(line, chart_cell) end_col = chr(ord(col) + 1) ws[end_col + str(current_row_number)].font = title_font @@ -535,6 +615,192 @@ def generate_excel(report, current_row_number = 70 ws.row_dimensions[i].height = 0.1 + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index 5fb3e801..a8272847 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -4,13 +4,13 @@ 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -61,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -489,7 +535,13 @@ def generate_excel(report, 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 + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + table_row = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 chart_start_row_number = current_row_number + 1 if "timestamps" not in reporting_period_data.keys() or \ reporting_period_data['timestamps'] is None or \ @@ -586,6 +638,192 @@ def generate_excel(report, chart_cell = chart_col + str(chart_start_row_number + 6*i) ws.add_chart(line, chart_cell) + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index cf03915e..a2759eb2 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -4,14 +4,13 @@ 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 - +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -31,7 +30,7 @@ def export(report, #################################################################################################################### if report is None: return None - print(report) + print(report['reporting_period']) #################################################################################################################### # Step 2: Generate excel file from the report data @@ -62,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -334,20 +379,24 @@ def generate_excel(report, len(reporting_period_data['timestamps'][0]) == 0: has_timestamps_data = False + current_row_number += 1 + + chart_start_row_number = current_row_number if has_values_data and has_timestamps_data: ca_len = len(reporting_period_data['names']) time = reporting_period_data['timestamps'][0] + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 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['B' + str(current_row_number - 1)].font = title_font + ws['B' + str(current_row_number - 1)] = name + ' 详细数据' + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + current_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 + detail_data_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 @@ -428,8 +477,10 @@ def generate_excel(report, 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) + labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=detail_data_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] @@ -445,10 +496,195 @@ def generate_excel(report, line.dLbls.showVal = True line.dLbls.showPercent = False chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number + 6 * i) + ws.add_chart(line, chart_cell) + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index acdf2b34..9b686e5d 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -9,6 +9,7 @@ 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### @@ -59,6 +60,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -326,42 +373,48 @@ def generate_excel(report, len(reporting_period_data['timestamps']) == 0: has_timestamps_flag = False + timestamps = reporting_period_data['timestamps'][0] + names = reporting_period_data['names'] + ca_len = len(names) + time_len = len(timestamps) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + analysis_end_row_number = 12 + 3 * ca_len + current_row_number = analysis_end_row_number if has_timestamps_flag: - timestamps = reporting_period_data['timestamps'][0] - names = reporting_period_data['names'] - ca_len = len(names) - time_len = len(timestamps) - line_charts_row_number = 6 * ca_len - analysis_end_row_number = 12 + 3 * ca_len - detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 - ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' # table_title - ws['B' + str(detailed_start_row_number + 1)].fill = table_fill - ws['B' + str(detailed_start_row_number + 1)].font = name_font - ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "日期时间" - ws['B' + str(detailed_start_row_number + 1)].border = f_border + ws['B' + str(detail_data_table_start_row_number)].fill = table_fill + ws['B' + str(detail_data_table_start_row_number)].font = name_font + ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws['B' + str(detail_data_table_start_row_number)] = "日期时间" + ws['B' + str(detail_data_table_start_row_number)].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(detailed_start_row_number + 1)].font = name_font - ws[col_average + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws[col_average + str(detailed_start_row_number + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][ - i] + "/H)" - ws[col_average + str(detailed_start_row_number + 1)].border = f_border + ws[col_average + str(detail_data_table_start_row_number)].font = name_font + ws[col_average + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws[col_average + str(detail_data_table_start_row_number)] =\ + names[i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + ws[col_average + str(detail_data_table_start_row_number)].border = f_border - ws[col_maximum + str(detailed_start_row_number + 1)].font = name_font - ws[col_maximum + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws[col_maximum + str(detailed_start_row_number + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][ - i] + "/H)" - ws[col_maximum + str(detailed_start_row_number + 1)].border = f_border + ws[col_maximum + str(detail_data_table_start_row_number)].font = name_font + ws[col_maximum + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws[col_maximum + str(detail_data_table_start_row_number)] = \ + names[i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + ws[col_maximum + str(detail_data_table_start_row_number)].border = f_border # table_date for i in range(0, time_len): - rows = i + detailed_start_row_number + 2 + rows = i + detail_data_table_start_row_number + 1 ws['B' + str(rows)].font = name_font ws['B' + str(rows)].alignment = c_c_alignment @@ -386,37 +439,221 @@ def generate_excel(report, ws[col_maximum + str(rows)].number_format = '0.00' ws[col_maximum + str(rows)].border = f_border - ######################################################## - # third: LineChart - # LineChart requires data from the detailed data table in the Excel file - # so print the detailed data table first and then print LineChart - ######################################################## + current_row_number += 1 + ######################################################## + # third: LineChart + # LineChart requires data from the detailed data table in the Excel file + # so print the detailed data table first and then print LineChart + ######################################################## for i in range(0, ca_len): line = LineChart() line.title = "报告期 最大负荷 - " + names[i] + "(" + reporting_period_data['units'][i] + ")" - line.style = 10 - line.x_axis.majorTickMark = 'in' - line.y_axis.majorTickMark = 'in' - line.smooth = True + times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=detail_data_table_start_row_number + 1 + time_len) + line_data = Reference(ws, min_col=2 + 2 * (i + 1), min_row=detail_data_table_start_row_number, + max_row=detail_data_table_start_row_number + time_len) + line.add_data(line_data, titles_from_data=True) + line.set_categories(times) + 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 - times = Reference(ws, min_col=2, min_row=detailed_start_row_number + 2, - max_row=detailed_start_row_number + 2 + time_len) - line_data = Reference(ws, min_col=2 + 2 * (i+1), min_row=detailed_start_row_number + 1, - max_row=detailed_start_row_number + 1 + time_len) - line.add_data(line_data, titles_from_data=True) - line.set_categories(times) - ser = line.series[0] - ser.marker.symbol = "diamond" - ser.marker.size = 5 + line.dLbls.showVal = False + line.dLbls.showPercent = False chart_col = 'B' - chart_cell = str(analysis_end_row_number + 6 * i) + chart_cell = str(current_row_number + 6 * i) ws.add_chart(line, chart_col + chart_cell) + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = current_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 0a9415b2..783e3ad4 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -4,13 +4,14 @@ 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 +import openpyxl.utils.cell as format_cell + #################################################################################################################### # PROCEDURES @@ -61,6 +62,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -474,18 +521,23 @@ def generate_excel(report, len(reporting_period_data['timestamps'][0]) == 0: has_timestamps_data = False + current_row_number += 1 + chart_start_row_number = current_row_number if has_values_saving_data and has_timestamps_data: ca_len = len(reporting_period_data['names']) time = reporting_period_data['timestamps'][0] + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number - 1)].font = title_font + ws['B' + str(current_row_number - 1)] = name + ' 详细数据' - current_row_number += 1 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 - chart_start_row_number = current_row_number - - current_row_number += ca_len * 6 + current_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 table_start_row_number = current_row_number ws.row_dimensions[current_row_number].height = 60 @@ -585,10 +637,195 @@ def generate_excel(report, line.dLbls.showVal = True line.dLbls.showPercent = False chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number + 6 * i) + ws.add_chart(line, chart_cell) + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 7d63e5af..510d8671 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -10,7 +10,7 @@ from openpyxl.chart import ( from openpyxl.chart.label import DataLabelList from openpyxl.drawing.image import Image from openpyxl.styles import PatternFill, Border, Side, Alignment, Font - +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -61,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -106,7 +152,7 @@ def generate_excel(report, c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', @@ -432,36 +478,44 @@ def generate_excel(report, len(reporting_period_data['timestamps']) == 0: has_timestamps_flag = False + timestamps = reporting_period_data['timestamps'][0] + names = reporting_period_data['names'] + ca_len = len(names) + time_len = len(timestamps) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + analysis_end_row_number = 12 + 3 * ca_len + current_row_number = analysis_end_row_number + values = reporting_period_data['values'] if has_timestamps_flag: - timestamps = reporting_period_data['timestamps'][0] - values = reporting_period_data['values'] - names = reporting_period_data['names'] - ca_len = len(names) - time_len = len(timestamps) - # title - line_charts_row_number = 6 * ca_len - analysis_end_row_number = 12 + 3 * ca_len - detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 - ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' # table_title - ws['B' + str(detailed_start_row_number + 1)].fill = table_fill - ws['B' + str(detailed_start_row_number + 1)].font = name_font - ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "时间" - ws['B' + str(detailed_start_row_number + 1)].border = f_border + ws['B' + str(detail_data_table_start_row_number)].fill = table_fill + ws['B' + str(detail_data_table_start_row_number)].font = name_font + ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws['B' + str(detail_data_table_start_row_number)] = "时间" + ws['B' + str(detail_data_table_start_row_number)].border = f_border + + current_row_number += 1 for i in range(0, ca_len): col = chr(ord('C') + i) - ws[col + str(detailed_start_row_number + 1)].font = name_font - ws[col + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws[col + str(detailed_start_row_number + 1)] = names[i] + " - (" + reporting_period_data['units'][i] + ")" - ws[col + str(detailed_start_row_number + 1)].border = f_border + ws[col + str(detail_data_table_start_row_number)].font = name_font + ws[col + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws[col + str(detail_data_table_start_row_number)] = \ + names[i] + " - (" + reporting_period_data['units'][i] + ")" + ws[col + str(detail_data_table_start_row_number)].border = f_border # table_date for i in range(0, time_len): - rows = i + detailed_start_row_number + 2 + rows = i + detail_data_table_start_row_number + 1 ws['B' + str(rows)].font = name_font ws['B' + str(rows)].alignment = c_c_alignment @@ -478,7 +532,7 @@ def generate_excel(report, ws[col + str(rows)].border = f_border # 小计 - row_subtotals = detailed_start_row_number + 2 + time_len + row_subtotals = detail_data_table_start_row_number + 1 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment ws['B' + str(row_subtotals)] = "小计" @@ -511,16 +565,202 @@ def generate_excel(report, line.dLbls = DataLabelList() line.dLbls.dLblPos = 't' line.dLbls.showVal = True - times = Reference(ws, min_col=2, min_row=detailed_start_row_number + 2, - max_row=detailed_start_row_number + 2 + time_len) - line_data = Reference(ws, min_col=3 + i, min_row=detailed_start_row_number + 1, - max_row=detailed_start_row_number + 1 + time_len) + times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=detail_data_table_start_row_number + 1 + time_len) + line_data = Reference(ws, min_col=3 + i, min_row=detail_data_table_start_row_number, + max_row=detail_data_table_start_row_number + time_len) line.add_data(line_data, titles_from_data=True) line.set_categories(times) ser = line.series[0] ser.marker.symbol = "diamond" ser.marker.size = 5 - ws.add_chart(line, 'B' + str(analysis_end_row_number + 6 * i)) + ws.add_chart(line, 'B' + str(current_row_number + 6 * i)) + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = current_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 14c87ea613005a8753a2b9a605bb1a81abba8fe7 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 19 Apr 2021 16:25:01 +0800 Subject: [PATCH 05/10] Parameter Data is added to Excel Exporter of All Shopfloor Reports --- myems-api/excelexporters/shopfloorcost.py | 294 +++++++++++++++-- .../excelexporters/shopfloorenergycategory.py | 244 +++++++++++++- .../excelexporters/shopfloorenergyitem.py | 247 ++++++++++++++- myems-api/excelexporters/shopfloorload.py | 296 +++++++++++++++-- myems-api/excelexporters/shopfloorsaving.py | 250 ++++++++++++++- .../excelexporters/shopfloorstatistics.py | 297 ++++++++++++++++-- 6 files changed, 1525 insertions(+), 103 deletions(-) diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index 9cc3730e..8a680175 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -2,15 +2,16 @@ import base64 import uuid import os from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) + PieChart, + LineChart, + 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 +import openpyxl.utils.cell as format_cell + #################################################################################################################### # PROCEDURES @@ -61,12 +62,57 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): - wb = Workbook() ws = wb.active @@ -182,7 +228,7 @@ 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) @@ -232,7 +278,7 @@ def generate_excel(report, if reporting_period_data['increment_rates'][i] is not None else "-" ws[col + '10'].border = f_border - end_col = chr(ord(col)+1) + end_col = chr(ord(col) + 1) ws[end_col + '7'].fill = table_fill ws[end_col + '7'].font = name_font ws[end_col + '7'].alignment = c_c_alignment @@ -269,7 +315,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+'分时用电成本' + ws['B12'] = name + '分时用电成本' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -288,8 +334,8 @@ def generate_excel(report, ws['D13'].border = f_border ws['D13'] = '分时用电成本占比' - wssum = round(reporting_period_data['toppeaks'][0], 2)+round(reporting_period_data['onpeaks'][0], 2)\ - + round(reporting_period_data['midpeaks'][0], 2)+round(reporting_period_data['offpeaks'][0], 2) + wssum = round(reporting_period_data['toppeaks'][0], 2) + round(reporting_period_data['onpeaks'][0], 2) + round( + reporting_period_data['midpeaks'][0], 2) + round(reporting_period_data['offpeaks'][0], 2) ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment @@ -304,7 +350,8 @@ def generate_excel(report, ws['D14'].font = title_font ws['D14'].alignment = c_c_alignment ws['D14'].border = f_border - ws['D14'] = '{:.2%}'.format(round(reporting_period_data['toppeaks'][0], 2)/wssum) + ws['D14'] = '{:.2%}'.format(round(reporting_period_data['toppeaks'][0], 2) / wssum) \ + if wssum is not None and wssum != 0 else "0.00%" ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment @@ -319,7 +366,8 @@ def generate_excel(report, ws['D15'].font = title_font ws['D15'].alignment = c_c_alignment ws['D15'].border = f_border - ws['D15'] = '{:.2%}'.format(round(reporting_period_data['onpeaks'][0], 2)/wssum) + ws['D15'] = '{:.2%}'.format(round(reporting_period_data['onpeaks'][0], 2) / wssum) \ + if wssum is not None and wssum != 0 else "0.00%" ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment @@ -334,7 +382,8 @@ def generate_excel(report, ws['D16'].font = title_font ws['D16'].alignment = c_c_alignment ws['D16'].border = f_border - ws['D16'] = '{:.2%}'.format(round(reporting_period_data['midpeaks'][0], 2)/wssum) + ws['D16'] = '{:.2%}'.format(round(reporting_period_data['midpeaks'][0], 2) / wssum) \ + if wssum is not None and wssum != 0 else "0.00%" ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment @@ -349,10 +398,11 @@ def generate_excel(report, ws['D17'].font = title_font ws['D17'].alignment = c_c_alignment ws['D17'].border = f_border - ws['D17'] = '{:.2%}'.format(round(reporting_period_data['offpeaks'][0], 2)/wssum) + ws['D17'] = '{:.2%}'.format(round(reporting_period_data['offpeaks'][0], 2) / wssum) \ + if wssum is not None and wssum != 0 else "0.00%" 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) @@ -425,7 +475,8 @@ def generate_excel(report, 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) + ws['D' + str(current_row_number)] = '{:.2%}'.format(round(reporting_period_data['subtotals'][i], 2) / + wssum) if wssum is not None and wssum != 0 else "0.00%" current_row_number += 1 @@ -472,12 +523,18 @@ def generate_excel(report, reporting_period_data = report['reporting_period'] times = reporting_period_data['timestamps'] ca_len = len(report['reporting_period']['names']) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + 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 + detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 3 + current_row_number = detail_data_table_start_row_number time = times[0] has_data = False @@ -502,8 +559,8 @@ def generate_excel(report, 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)] = \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" ws[col + str(current_row_number)].border = f_border end_col = chr(ord(col) + 1) @@ -562,9 +619,12 @@ def generate_excel(report, # 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.title = '报告期成本 - ' + \ + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=detail_data_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] @@ -593,6 +653,190 @@ def generate_excel(report, for i in range(30, 69 + 1): current_row_number = 70 ws.row_dimensions[i].height = 0.1 + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index 5fb3e801..d86c46b6 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -4,13 +4,13 @@ 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -61,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -401,8 +447,6 @@ def generate_excel(report, 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+' 子空间能耗' @@ -460,7 +504,6 @@ def generate_excel(report, s1.dLbls.showVal = True # 数量显示 s1.dLbls.showPercent = True # 百分比显示 # s1 = CharacterProperties(sz=1800) # 图表中字体大小 *100 - chart_cell = '' if i % 2 == 0: chart_cell = 'B' + str(chart_start_row_number) else: @@ -489,7 +532,13 @@ def generate_excel(report, 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 + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + table_row = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 chart_start_row_number = current_row_number + 1 if "timestamps" not in reporting_period_data.keys() or \ reporting_period_data['timestamps'] is None or \ @@ -586,6 +635,191 @@ def generate_excel(report, chart_cell = chart_col + str(chart_start_row_number + 6*i) ws.add_chart(line, chart_cell) + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 321061a7..81f6ee1f 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -4,14 +4,13 @@ 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 - +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -62,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -334,18 +379,22 @@ def generate_excel(report, len(reporting_period_data['timestamps'][0]) == 0: has_timestamps_data = False + chart_start_row_number = current_row_number + 1 + if has_values_data and has_timestamps_data: ca_len = len(reporting_period_data['names']) time = reporting_period_data['timestamps'][0] + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 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 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + current_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 table_start_row_number = current_row_number ws.row_dimensions[current_row_number].height = 60 @@ -445,10 +494,194 @@ def generate_excel(report, line.dLbls.showVal = True line.dLbls.showPercent = False chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number + 6 * i) + ws.add_chart(line, chart_cell) + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 8803bd30..7f8b2302 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -9,6 +9,7 @@ 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 +import openpyxl.utils.cell as format_cell #################################################################################################################### @@ -59,6 +60,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -326,42 +373,48 @@ def generate_excel(report, len(reporting_period_data['timestamps']) == 0: has_timestamps_flag = False + timestamps = reporting_period_data['timestamps'][0] + names = reporting_period_data['names'] + ca_len = len(names) + time_len = len(timestamps) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + analysis_end_row_number = 12 + 3 * ca_len + current_row_number = analysis_end_row_number if has_timestamps_flag: - timestamps = reporting_period_data['timestamps'][0] - names = reporting_period_data['names'] - ca_len = len(names) - time_len = len(timestamps) - line_charts_row_number = 6 * ca_len - analysis_end_row_number = 12 + 3 * ca_len - detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 - ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' # table_title - ws['B' + str(detailed_start_row_number + 1)].fill = table_fill - ws['B' + str(detailed_start_row_number + 1)].font = name_font - ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "日期时间" - ws['B' + str(detailed_start_row_number + 1)].border = f_border + ws['B' + str(detail_data_table_start_row_number)].fill = table_fill + ws['B' + str(detail_data_table_start_row_number)].font = name_font + ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws['B' + str(detail_data_table_start_row_number)] = "日期时间" + ws['B' + str(detail_data_table_start_row_number)].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(detailed_start_row_number + 1)].font = name_font - ws[col_average + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws[col_average + str(detailed_start_row_number + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][ - i] + "/H)" - ws[col_average + str(detailed_start_row_number + 1)].border = f_border + ws[col_average + str(detail_data_table_start_row_number)].font = name_font + ws[col_average + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws[col_average + str(detail_data_table_start_row_number)] = \ + names[i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + ws[col_average + str(detail_data_table_start_row_number)].border = f_border - ws[col_maximum + str(detailed_start_row_number + 1)].font = name_font - ws[col_maximum + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws[col_maximum + str(detailed_start_row_number + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][ - i] + "/H)" - ws[col_maximum + str(detailed_start_row_number + 1)].border = f_border + ws[col_maximum + str(detail_data_table_start_row_number)].font = name_font + ws[col_maximum + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws[col_maximum + str(detail_data_table_start_row_number)] = \ + names[i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + ws[col_maximum + str(detail_data_table_start_row_number)].border = f_border # table_date for i in range(0, time_len): - rows = i + detailed_start_row_number + 2 + rows = i + detail_data_table_start_row_number + 1 ws['B' + str(rows)].font = name_font ws['B' + str(rows)].alignment = c_c_alignment @@ -404,10 +457,10 @@ def generate_excel(report, line.dLbls = DataLabelList() line.dLbls.dLblPos = 't' line.dLbls.showVal = True - times = Reference(ws, min_col=2, min_row=detailed_start_row_number + 2, - max_row=detailed_start_row_number + 2 + time_len) - line_data = Reference(ws, min_col=2 + 2 * (i + 1), min_row=detailed_start_row_number + 1, - max_row=detailed_start_row_number + 1 + time_len) + times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=detail_data_table_start_row_number + 1 + time_len) + line_data = Reference(ws, min_col=2 + 2 * (i + 1), min_row=detail_data_table_start_row_number, + max_row=detail_data_table_start_row_number + time_len) line.add_data(line_data, titles_from_data=True) line.set_categories(times) ser = line.series[0] @@ -417,6 +470,191 @@ def generate_excel(report, chart_cell = str(analysis_end_row_number + 6 * i) ws.add_chart(line, chart_col + chart_cell) + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = current_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index 0a9415b2..42c7f6a6 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -4,13 +4,14 @@ 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 +import openpyxl.utils.cell as format_cell + #################################################################################################################### # PROCEDURES @@ -61,6 +62,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -474,18 +521,23 @@ def generate_excel(report, len(reporting_period_data['timestamps'][0]) == 0: has_timestamps_data = False + current_row_number += 1 + chart_start_row_number = current_row_number if has_values_saving_data and has_timestamps_data: ca_len = len(reporting_period_data['names']) time = reporting_period_data['timestamps'][0] + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 - ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number - 1)].font = title_font + ws['B' + str(current_row_number - 1)] = name + ' 详细数据' - current_row_number += 1 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 - chart_start_row_number = current_row_number - - current_row_number += ca_len * 6 + current_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 table_start_row_number = current_row_number ws.row_dimensions[current_row_number].height = 60 @@ -585,10 +637,194 @@ def generate_excel(report, line.dLbls.showVal = True line.dLbls.showPercent = False chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number + 6 * i) + ws.add_chart(line, chart_cell) + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 522505d3..418d4894 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -9,7 +9,7 @@ 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 - +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -60,6 +60,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -99,19 +145,19 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -431,36 +477,42 @@ def generate_excel(report, len(reporting_period_data['timestamps']) == 0: has_timestamps_flag = False + timestamps = reporting_period_data['timestamps'][0] + names = reporting_period_data['names'] + ca_len = len(names) + time_len = len(timestamps) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + analysis_end_row_number = 12 + 3 * ca_len + current_row_number = analysis_end_row_number + values = reporting_period_data['values'] if has_timestamps_flag: - timestamps = reporting_period_data['timestamps'][0] - values = reporting_period_data['values'] - names = reporting_period_data['names'] - ca_len = len(names) - time_len = len(timestamps) - # title - line_charts_row_number = 6 * ca_len - analysis_end_row_number = 12 + 3 * ca_len - detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 - ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' # table_title - ws['B' + str(detailed_start_row_number+1)].fill = table_fill - ws['B' + str(detailed_start_row_number+1)].font = name_font - ws['B' + str(detailed_start_row_number+1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number+1)] = "时间" - ws['B' + str(detailed_start_row_number+1)].border = f_border + ws['B' + str(detail_data_table_start_row_number)].fill = table_fill + ws['B' + str(detail_data_table_start_row_number)].font = name_font + ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws['B' + str(detail_data_table_start_row_number)] = "时间" + ws['B' + str(detail_data_table_start_row_number)].border = f_border for i in range(0, ca_len): col = chr(ord('C') + i) - ws[col + str(detailed_start_row_number+1)].font = name_font - ws[col + str(detailed_start_row_number+1)].alignment = c_c_alignment - ws[col + str(detailed_start_row_number+1)] = names[i] + " - (" + reporting_period_data['units'][i] + ")" - ws[col + str(detailed_start_row_number+1)].border = f_border + ws[col + str(detail_data_table_start_row_number)].font = name_font + ws[col + str(detail_data_table_start_row_number)].alignment = c_c_alignment + ws[col + str(detail_data_table_start_row_number)] = \ + names[i] + " - (" + reporting_period_data['units'][i] + ")" + ws[col + str(detail_data_table_start_row_number)].border = f_border # table_date for i in range(0, time_len): - rows = i + detailed_start_row_number + 2 + rows = i + detail_data_table_start_row_number + 1 ws['B' + str(rows)].font = name_font ws['B' + str(rows)].alignment = c_c_alignment @@ -477,7 +529,7 @@ def generate_excel(report, ws[col + str(rows)].border = f_border # 小计 - row_subtotals = detailed_start_row_number + 2 + time_len + row_subtotals = detail_data_table_start_row_number + 1 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment ws['B' + str(row_subtotals)] = "小计" @@ -511,10 +563,10 @@ def generate_excel(report, line.dLbls = DataLabelList() line.dLbls.dLblPos = 't' line.dLbls.showVal = True - times = Reference(ws, min_col=2, min_row=detailed_start_row_number + 2, - max_row=detailed_start_row_number + 2 + time_len) - line_data = Reference(ws, min_col=3 + i, min_row=detailed_start_row_number + 1, - max_row=detailed_start_row_number + 1 + time_len) + times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=detail_data_table_start_row_number + 1 + time_len) + line_data = Reference(ws, min_col=3 + i, min_row=detail_data_table_start_row_number, + max_row=detail_data_table_start_row_number + time_len) line.add_data(line_data, titles_from_data=True) line.set_categories(times) ser = line.series[0] @@ -523,6 +575,191 @@ def generate_excel(report, chart_cell = str(analysis_end_row_number + 6 * i) ws.add_chart(line, chart_col + chart_cell) + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = current_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From 12665bc02acbc34744a5227d170c0032d348b051 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 19 Apr 2021 16:45:58 +0800 Subject: [PATCH 06/10] 2021/4/19 --- myems-api/excelexporters/storecost.py | 1 - .../excelexporters/storeenergycategory.py | 570 ++++++++++-------- myems-api/excelexporters/storeenergyitem.py | 268 +------- myems-api/excelexporters/storeload.py | 1 - myems-api/excelexporters/storesaving.py | 1 - myems-api/excelexporters/storestatistics.py | 1 - 6 files changed, 339 insertions(+), 503 deletions(-) diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 68b7894f..5fbf101c 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -617,7 +617,6 @@ def generate_excel(report, ########################################## has_parameters_names_and_timestamps_and_values_data = True - # 12 is the starting line number of the last line chart in the report period ca_len = len(report['reporting_period']['names']) current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index a8272847..dd6c00f4 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -4,6 +4,7 @@ import os from openpyxl.chart import ( PieChart, LineChart, + BarChart, Reference, ) from openpyxl.styles import PatternFill, Border, Side, Alignment, Font @@ -12,6 +13,7 @@ from openpyxl import Workbook from openpyxl.chart.label import DataLabelList import openpyxl.utils.cell as format_cell + #################################################################################################################### # PROCEDURES # Step 1: Validate the report data @@ -61,52 +63,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -118,7 +74,6 @@ 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 @@ -172,9 +127,9 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 # img = Image("myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 ws.add_image(img, 'B1') # Title @@ -202,7 +157,7 @@ def generate_excel(report, ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] + ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local ws.merge_cells("G3:H3") if "reporting_period" not in report.keys() or \ @@ -211,14 +166,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 @@ -229,14 +179,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 @@ -245,7 +194,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 @@ -253,12 +202,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 @@ -333,13 +280,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 \ @@ -350,7 +293,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 @@ -403,81 +345,314 @@ 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']) + real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) + ws['B' + str(current_row_number)].font = title_font + ws['B' + str(current_row_number)] = name + ' 详细数据' + + table_start_row_number = (current_row_number + 2) + ca_len * 6 + real_timestamps_len * 7 + 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_nchild_space_names_arrayames_array'][0]) == 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)].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)] = '子空间' 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 = 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['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].font = title_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 @@ -485,165 +660,42 @@ 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']) - parameters_names_len = len(report['parameters']['names']) - parameters_parameters_datas_len = 0 - for i in range(0, parameters_names_len): - if len(report['parameters']['timestamps'][i]) == 0: - continue - parameters_parameters_datas_len += 1 - table_row = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 - 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) - ########################################## + current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 + 1 has_parameters_names_and_timestamps_and_values_data = True - # 12 is the starting line number of the last line chart in the report period - - ca_len = len(report['reporting_period']['names']) - current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 if 'parameters' not in report.keys() or \ report['parameters'] is None or \ 'names' not in report['parameters'].keys() or \ @@ -664,7 +716,6 @@ def generate_excel(report, ############################### parameters_data = report['parameters'] - parameters_names_len = len(parameters_data['names']) parameters_ws = wb.create_sheet('相关参数') @@ -746,7 +797,7 @@ def generate_excel(report, parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + col = chr(ord(table_current_col_number) + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -764,7 +815,7 @@ def generate_excel(report, parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = chr(ord(col) + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -773,7 +824,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = chr(ord(table_current_col_number) + 3) ######################################################## # parameters chart and parameters table @@ -823,8 +874,33 @@ def generate_excel(report, current_sheet_parameters_row_number = chart_start_row_number current_sheet_parameters_row_number += 1 - + ########################################## filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) return filename + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index a2759eb2..321061a7 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -4,13 +4,14 @@ 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 -import openpyxl.utils.cell as format_cell + #################################################################################################################### # PROCEDURES @@ -30,7 +31,7 @@ def export(report, #################################################################################################################### if report is None: return None - print(report['reporting_period']) + print(report) #################################################################################################################### # Step 2: Generate excel file from the report data @@ -61,52 +62,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -363,7 +318,7 @@ def generate_excel(report, current_row_number += 1 - ####################### + ##################################### has_values_data = True has_timestamps_data = True @@ -379,24 +334,20 @@ def generate_excel(report, len(reporting_period_data['timestamps'][0]) == 0: has_timestamps_data = False - current_row_number += 1 - - chart_start_row_number = current_row_number if has_values_data and has_timestamps_data: ca_len = len(reporting_period_data['names']) time = reporting_period_data['timestamps'][0] - parameters_names_len = len(report['parameters']['names']) - parameters_parameters_datas_len = 0 - ws['B' + str(current_row_number - 1)].font = title_font - ws['B' + str(current_row_number - 1)] = name + ' 详细数据' + 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 - for i in range(0, parameters_names_len): - if len(report['parameters']['timestamps'][i]) == 0: - continue - parameters_parameters_datas_len += 1 - current_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 - detail_data_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 @@ -476,11 +427,9 @@ 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] + ")" - labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, - max_row=table_end_row_number) - line_data = Reference(ws, min_col=3 + i, min_row=detail_data_table_start_row_number, - max_row=table_end_row_number) + 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] @@ -496,195 +445,10 @@ def generate_excel(report, line.dLbls.showVal = True line.dLbls.showPercent = False chart_col = 'B' - chart_cell = chart_col + str(chart_start_row_number + 6 * i) - ws.add_chart(line, chart_cell) - - ########################################## - has_parameters_names_and_timestamps_and_values_data = True - # 12 is the starting line number of the last line chart in the report period - - ca_len = len(report['reporting_period']['names']) - current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 - if 'parameters' not in report.keys() or \ - report['parameters'] is None or \ - 'names' not in report['parameters'].keys() or \ - report['parameters']['names'] is None or \ - len(report['parameters']['names']) == 0 or \ - 'timestamps' not in report['parameters'].keys() or \ - report['parameters']['timestamps'] is None or \ - len(report['parameters']['timestamps']) == 0 or \ - 'values' not in report['parameters'].keys() or \ - report['parameters']['values'] is None or \ - len(report['parameters']['values']) == 0 or \ - timestamps_data_all_equal_0(report['parameters']['timestamps']): - has_parameters_names_and_timestamps_and_values_data = False - if has_parameters_names_and_timestamps_and_values_data: - - ############################### - # new worksheet - ############################### - - parameters_data = report['parameters'] - - parameters_names_len = len(parameters_data['names']) - - parameters_ws = wb.create_sheet('相关参数') - - parameters_timestamps_data_max_len = \ - get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) - - # Row height - parameters_ws.row_dimensions[1].height = 102 - for i in range(2, 7 + 1): - parameters_ws.row_dimensions[i].height = 42 - - for i in range(8, parameters_timestamps_data_max_len + 10): - parameters_ws.row_dimensions[i].height = 60 - - # Col width - parameters_ws.column_dimensions['A'].width = 1.5 - - parameters_ws.column_dimensions['B'].width = 25.0 - - for i in range(3, 12 + parameters_names_len * 3): - parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 - - # Img - img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - parameters_ws.add_image(img, 'B1') - - # Title - parameters_ws.row_dimensions[3].height = 60 - - parameters_ws['B3'].font = name_font - parameters_ws['B3'].alignment = b_r_alignment - parameters_ws['B3'] = 'Name:' - parameters_ws['C3'].border = b_border - parameters_ws['C3'].alignment = b_c_alignment - parameters_ws['C3'].font = name_font - parameters_ws['C3'] = name - - parameters_ws['D3'].font = name_font - parameters_ws['D3'].alignment = b_r_alignment - parameters_ws['D3'] = 'Period:' - parameters_ws['E3'].border = b_border - parameters_ws['E3'].alignment = b_c_alignment - parameters_ws['E3'].font = name_font - parameters_ws['E3'] = period_type - - parameters_ws['F3'].font = name_font - parameters_ws['F3'].alignment = b_r_alignment - parameters_ws['F3'] = 'Date:' - parameters_ws['G3'].border = b_border - parameters_ws['G3'].alignment = b_c_alignment - parameters_ws['G3'].font = name_font - parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - parameters_ws.merge_cells("G3:H3") - - parameters_ws_current_row_number = 6 - - parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' - - parameters_ws_current_row_number += 1 - - parameters_table_start_row_number = parameters_ws_current_row_number - - parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 - - parameters_ws_current_row_number += 1 - - table_current_col_number = 'B' - - for i in range(0, parameters_names_len): - - if len(parameters_data['timestamps'][i]) == 0: - continue - - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border - - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) - - parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border - parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font - parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment - parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] - - table_current_row_number = parameters_ws_current_row_number - - for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number - - parameters_ws[col + str(table_current_row_number)].border = f_border - parameters_ws[col + str(table_current_row_number)].font = title_font - parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment - parameters_ws[col + str(table_current_row_number)] = value - - col = decimal_to_column(column_to_decimal(col) + 1) - - parameters_ws[col + str(table_current_row_number)].border = f_border - parameters_ws[col + str(table_current_row_number)].font = title_font - parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment - parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) - - table_current_row_number += 1 - - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) - - ######################################################## - # parameters chart and parameters table - ######################################################## - - ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' - - current_sheet_parameters_row_number += 1 - - chart_start_row_number = current_sheet_parameters_row_number - - col_index = 0 - - for i in range(0, parameters_names_len): - - if len(parameters_data['timestamps'][i]) == 0: - continue - - line = LineChart() - data_col = 3 + col_index * 3 - labels_col = 2 + col_index * 3 - col_index += 1 - line.title = '相关参数 - ' + \ - parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value - labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, - max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) - line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, - max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False - 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) - current_sheet_parameters_row_number = chart_start_row_number - - current_sheet_parameters_row_number += 1 - filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index 9b686e5d..1afc28af 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -470,7 +470,6 @@ def generate_excel(report, ########################################## has_parameters_names_and_timestamps_and_values_data = True - # 12 is the starting line number of the last line chart in the report period ca_len = len(report['reporting_period']['names']) current_sheet_parameters_row_number = current_row_number + ca_len * 6 diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 783e3ad4..42c7f6a6 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -642,7 +642,6 @@ def generate_excel(report, ########################################## has_parameters_names_and_timestamps_and_values_data = True - # 12 is the starting line number of the last line chart in the report period ca_len = len(report['reporting_period']['names']) current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 510d8671..48d94465 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -578,7 +578,6 @@ def generate_excel(report, ########################################## has_parameters_names_and_timestamps_and_values_data = True - # 12 is the starting line number of the last line chart in the report period ca_len = len(report['reporting_period']['names']) current_sheet_parameters_row_number = current_row_number + ca_len * 6 From c81eb2464488a64b4fe69b12018bd62a21954a2b Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 19 Apr 2021 16:48:47 +0800 Subject: [PATCH 07/10] 2021/4/19 --- .../excelexporters/storeenergycategory.py | 485 ++++++------------ myems-api/excelexporters/storeenergyitem.py | 267 +++++++++- 2 files changed, 406 insertions(+), 346 deletions(-) diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index dd6c00f4..60df405d 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -4,7 +4,6 @@ import os from openpyxl.chart import ( PieChart, LineChart, - BarChart, Reference, ) from openpyxl.styles import PatternFill, Border, Side, Alignment, Font @@ -13,7 +12,6 @@ from openpyxl import Workbook from openpyxl.chart.label import DataLabelList import openpyxl.utils.cell as format_cell - #################################################################################################################### # PROCEDURES # Step 1: Validate the report data @@ -63,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -74,6 +118,7 @@ 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 @@ -127,9 +172,9 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 # img = Image("myems.png") + img.width = img.width * 1.06 + img.height = img.height * 1.06 ws.add_image(img, 'B1') # Title @@ -157,7 +202,7 @@ def generate_excel(report, 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['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] ws.merge_cells("G3:H3") if "reporting_period" not in report.keys() or \ @@ -166,9 +211,14 @@ 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 @@ -179,13 +229,14 @@ 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 @@ -194,7 +245,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 @@ -202,10 +253,12 @@ def generate_excel(report, ws['B10'] = '环比' ws['B10'].border = f_border - col = 'B' + col = '' 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 @@ -280,9 +333,13 @@ 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 \ @@ -293,6 +350,7 @@ 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 @@ -345,18 +403,21 @@ 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 = 6.6 + pie.height = 7.25 # cm 1.05*5 1.05cm = 30 pt 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.dLbls.showCatName = False # 标签显示 + s1.dLbls.showVal = True # 数量显示 + s1.dLbls.showPercent = True # 百分比显示 + # s1 = CharacterProperties(sz=1800) # 图表中字体大小 *100 + ws.add_chart(pie, "D13") else: @@ -364,338 +425,126 @@ def generate_excel(report, ws.row_dimensions[i].height = 0.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 + ################################################ 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 - - ############################################### - + reporting_period_data = report['reporting_period'] + times = reporting_period_data['timestamps'] has_detail_data_flag = True - - table_start_draw_flag = current_row_number + 1 - + ca_len = len(report['reporting_period']['names']) + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 0 + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + table_row = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 + 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: - reporting_period_data = report['reporting_period'] - times = reporting_period_data['timestamps'] - ca_len = len(report['reporting_period']['names']) - real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' - - table_start_row_number = (current_row_number + 2) + ca_len * 6 + real_timestamps_len * 7 - current_row_number = table_start_row_number + 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: - - 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 + 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 j in range(0, ca_len): - col = chr(ord('C') + j) + for i in range(0, ca_len): + # 38 title + 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['values'][j][i], 2) - ws[col + str(current_row_number)].border = f_border + 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 - current_row_number += 1 + # 39 data + time = times[i] + time_len = len(time) - table_end_row_number = current_row_number - 1 + 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)] = '小计' 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)] = round(reporting_period_data['subtotals'][i], 2) 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_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.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 + 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.showVal = True - line.dLbls.showPercent = False + # 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(table_start_draw_flag + 6 * i) + chart_cell = chart_col + str(chart_start_row_number + 6*i) ws.add_chart(line, chart_cell) - current_row_number += 2 - - ######################################## - - 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)].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)] = '子空间' - 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 = 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['energy_category_names'][i] + ' (' + child['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 = title_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 - 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 - 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 ########################################## - current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 + 1 has_parameters_names_and_timestamps_and_values_data = True + # 12 is the starting line number of the last line chart in the report period + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 if 'parameters' not in report.keys() or \ report['parameters'] is None or \ 'names' not in report['parameters'].keys() or \ @@ -716,6 +565,7 @@ def generate_excel(report, ############################### parameters_data = report['parameters'] + parameters_names_len = len(parameters_data['names']) parameters_ws = wb.create_sheet('相关参数') @@ -797,7 +647,7 @@ def generate_excel(report, parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border - col = chr(ord(table_current_col_number) + 1) + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -815,7 +665,7 @@ def generate_excel(report, parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = decimal_to_column(column_to_decimal(col) + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -824,7 +674,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) ######################################################## # parameters chart and parameters table @@ -874,33 +724,8 @@ def generate_excel(report, current_sheet_parameters_row_number = chart_start_row_number current_sheet_parameters_row_number += 1 - ########################################## + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) return filename - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_not_equal_0(lists): - number = 0 - for i, value in enumerate(list(lists)): - if len(value) > 0: - number += 1 - return number diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index 321061a7..4ec3a7b4 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -4,14 +4,13 @@ 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 - +import openpyxl.utils.cell as format_cell #################################################################################################################### # PROCEDURES @@ -31,7 +30,7 @@ def export(report, #################################################################################################################### if report is None: return None - print(report) + print(report['reporting_period']) #################################################################################################################### # Step 2: Generate excel file from the report data @@ -62,6 +61,52 @@ def export(report, return base64_message +def decimal_to_column(num=65): + string = '' + num = num - 64 + # The column number is not greater than 90 + if num <= 26: + return chr(num + 64) + # The column number is greater than 90 + while num // 26 > 0: + if num % 26 == 0: + string += 'Z' + num = num // 26 - 1 + else: + string += chr(num % 26 + 64) + num //= 26 + # Avoid conversion errors that might occur between 741 and 766 + if num > 0: + string += chr(num + 64) + + return string[::-1] + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + def generate_excel(report, name, reporting_start_datetime_local, @@ -318,7 +363,7 @@ def generate_excel(report, current_row_number += 1 - ##################################### + ####################### has_values_data = True has_timestamps_data = True @@ -334,20 +379,24 @@ def generate_excel(report, len(reporting_period_data['timestamps'][0]) == 0: has_timestamps_data = False + current_row_number += 1 + + chart_start_row_number = current_row_number if has_values_data and has_timestamps_data: ca_len = len(reporting_period_data['names']) time = reporting_period_data['timestamps'][0] + parameters_names_len = len(report['parameters']['names']) + parameters_parameters_datas_len = 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['B' + str(current_row_number - 1)].font = title_font + ws['B' + str(current_row_number - 1)] = name + ' 详细数据' + for i in range(0, parameters_names_len): + if len(report['parameters']['timestamps'][i]) == 0: + continue + parameters_parameters_datas_len += 1 + current_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 + detail_data_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 @@ -427,9 +476,11 @@ 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] + ")" - 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) + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, + max_row=table_end_row_number) + line_data = Reference(ws, min_col=3 + i, min_row=detail_data_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] @@ -445,10 +496,194 @@ def generate_excel(report, line.dLbls.showVal = True line.dLbls.showPercent = False chart_col = 'B' + chart_cell = chart_col + str(chart_start_row_number + 6 * i) + ws.add_chart(line, chart_cell) + + ########################################## + has_parameters_names_and_timestamps_and_values_data = True + + ca_len = len(report['reporting_period']['names']) + current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6 + if 'parameters' not in report.keys() or \ + report['parameters'] is None or \ + 'names' not in report['parameters'].keys() or \ + report['parameters']['names'] is None or \ + len(report['parameters']['names']) == 0 or \ + 'timestamps' not in report['parameters'].keys() or \ + report['parameters']['timestamps'] is None or \ + len(report['parameters']['timestamps']) == 0 or \ + 'values' not in report['parameters'].keys() or \ + report['parameters']['values'] is None or \ + len(report['parameters']['values']) == 0 or \ + timestamps_data_all_equal_0(report['parameters']['timestamps']): + has_parameters_names_and_timestamps_and_values_data = False + if has_parameters_names_and_timestamps_and_values_data: + + ############################### + # new worksheet + ############################### + + parameters_data = report['parameters'] + + parameters_names_len = len(parameters_data['names']) + + parameters_ws = wb.create_sheet('相关参数') + + parameters_timestamps_data_max_len = \ + get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) + + # Row height + parameters_ws.row_dimensions[1].height = 102 + for i in range(2, 7 + 1): + parameters_ws.row_dimensions[i].height = 42 + + for i in range(8, parameters_timestamps_data_max_len + 10): + parameters_ws.row_dimensions[i].height = 60 + + # Col width + parameters_ws.column_dimensions['A'].width = 1.5 + + parameters_ws.column_dimensions['B'].width = 25.0 + + for i in range(3, 12 + parameters_names_len * 3): + parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 + + # Img + img = Image("excelexporters/myems.png") + img.width = img.width * 0.85 + img.height = img.height * 0.85 + # img = Image("myems.png") + parameters_ws.add_image(img, 'B1') + + # Title + parameters_ws.row_dimensions[3].height = 60 + + parameters_ws['B3'].font = name_font + parameters_ws['B3'].alignment = b_r_alignment + parameters_ws['B3'] = 'Name:' + parameters_ws['C3'].border = b_border + parameters_ws['C3'].alignment = b_c_alignment + parameters_ws['C3'].font = name_font + parameters_ws['C3'] = name + + parameters_ws['D3'].font = name_font + parameters_ws['D3'].alignment = b_r_alignment + parameters_ws['D3'] = 'Period:' + parameters_ws['E3'].border = b_border + parameters_ws['E3'].alignment = b_c_alignment + parameters_ws['E3'].font = name_font + parameters_ws['E3'] = period_type + + parameters_ws['F3'].font = name_font + parameters_ws['F3'].alignment = b_r_alignment + parameters_ws['F3'] = 'Date:' + parameters_ws['G3'].border = b_border + parameters_ws['G3'].alignment = b_c_alignment + parameters_ws['G3'].font = name_font + parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + parameters_ws.merge_cells("G3:H3") + + parameters_ws_current_row_number = 6 + + parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数' + + parameters_ws_current_row_number += 1 + + parameters_table_start_row_number = parameters_ws_current_row_number + + parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 + + parameters_ws_current_row_number += 1 + + table_current_col_number = 'B' + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + + col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font + parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment + parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i] + + table_current_row_number = parameters_ws_current_row_number + + for j, value in enumerate(list(parameters_data['timestamps'][i])): + col = table_current_col_number + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = value + + col = decimal_to_column(column_to_decimal(col) + 1) + + parameters_ws[col + str(table_current_row_number)].border = f_border + parameters_ws[col + str(table_current_row_number)].font = title_font + parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment + parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2) + + table_current_row_number += 1 + + table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + + ######################################################## + # parameters chart and parameters table + ######################################################## + + ws['B' + str(current_sheet_parameters_row_number)].font = title_font + ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数' + + current_sheet_parameters_row_number += 1 + + chart_start_row_number = current_sheet_parameters_row_number + + col_index = 0 + + for i in range(0, parameters_names_len): + + if len(parameters_data['timestamps'][i]) == 0: + continue + + line = LineChart() + data_col = 3 + col_index * 3 + labels_col = 2 + col_index * 3 + col_index += 1 + line.title = '相关参数 - ' + \ + parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value + labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) + line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, + max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_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 = False + 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) + current_sheet_parameters_row_number = chart_start_row_number + + current_sheet_parameters_row_number += 1 + filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) From d36b37133f1c8e00658a0e1f30f58be5c225514a Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 26 Apr 2021 14:32:49 +0800 Subject: [PATCH 08/10] 2021/4/26 --- .../excelexporters/shopfloorenergycategory.py | 99 +------------------ 1 file changed, 2 insertions(+), 97 deletions(-) diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index d86c46b6..d0c1cd7d 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -423,103 +423,6 @@ def generate_excel(report, 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 - ################################################ - 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_nchild_space_names_arrayames_array'][0]) == 0: - - has_child_flag = False - - current_row_number = 19 - - if has_child_flag: - child = report['child_space'] - - ws['B19'].font = title_font - ws['B19'] = name+' 子空间能耗' - - ws.row_dimensions[20].height = 60 - ws['B20'].fill = table_fill - ws['B20'].border = f_border - ca_len = len(child['energy_category_names']) - - table_start_row_number = 20 - - 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] + ')' - - space_len = len(child['child_space_names_array'][0]) - - for i in range(0, space_len): - row = str(i + 21) - - 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 = 20 + space_len - chart_start_row_number = 20 + space_len + 1 - - 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.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.width = 8 - # 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 - 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: 能耗详情 @@ -528,6 +431,7 @@ def generate_excel(report, # current_row_number+1+ca_len*6: table title # current_row_number+1+ca_len*6~: table_data ################################################ + current_row_number = 19 reporting_period_data = report['reporting_period'] times = reporting_period_data['timestamps'] has_detail_data_flag = True @@ -824,3 +728,4 @@ def generate_excel(report, wb.save(filename) return filename + From 5557c64e1ff136e2c653dbb0f504fd6ecd1d6ff4 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 26 Apr 2021 17:51:13 +0800 Subject: [PATCH 09/10] Column Letter and Column Index Converter have been added to Excel Exporters --- .../excelexporters/combinedequipmentcost.py | 50 +++------- .../combinedequipmentenergycategory.py | 44 ++------- .../combinedequipmentenergyitem.py | 44 ++------- .../excelexporters/combinedequipmentincome.py | 45 ++------- .../excelexporters/combinedequipmentload.py | 45 ++------- .../excelexporters/combinedequipmentoutput.py | 45 ++------- .../excelexporters/combinedequipmentsaving.py | 45 ++------- .../combinedequipmentstatistics.py | 44 ++------- myems-api/excelexporters/equipmentcost.py | 16 +-- .../excelexporters/equipmentenergycategory.py | 16 +-- .../excelexporters/equipmentenergyitem.py | 16 +-- myems-api/excelexporters/equipmentincome.py | 16 +-- myems-api/excelexporters/equipmentload.py | 16 +-- myems-api/excelexporters/equipmentoutput.py | 16 +-- myems-api/excelexporters/equipmentsaving.py | 16 +-- .../excelexporters/equipmentstatistics.py | 16 +-- myems-api/excelexporters/metercost.py | 95 +++++++----------- myems-api/excelexporters/meterenergy.py | 95 +++++++----------- .../excelexporters/metersubmetersbalance.py | 95 +++++++----------- myems-api/excelexporters/metertrend.py | 97 +++++++------------ myems-api/excelexporters/shopfloorcost.py | 79 +++++---------- .../excelexporters/shopfloorenergycategory.py | 78 +++++---------- .../excelexporters/shopfloorenergyitem.py | 79 +++++---------- myems-api/excelexporters/shopfloorload.py | 79 +++++---------- myems-api/excelexporters/shopfloorsaving.py | 79 +++++---------- .../excelexporters/shopfloorstatistics.py | 87 +++++++---------- myems-api/excelexporters/spacecost.py | 16 +-- .../excelexporters/spaceenergycategory.py | 16 +-- myems-api/excelexporters/spaceenergyitem.py | 16 +-- myems-api/excelexporters/spaceincome.py | 16 +-- myems-api/excelexporters/spaceload.py | 16 +-- myems-api/excelexporters/spaceoutput.py | 16 +-- myems-api/excelexporters/spacesaving.py | 16 +-- myems-api/excelexporters/spacestatistics.py | 16 +-- myems-api/excelexporters/storecost.py | 79 +++++---------- .../excelexporters/storeenergycategory.py | 79 +++++---------- myems-api/excelexporters/storeenergyitem.py | 79 +++++---------- myems-api/excelexporters/storeload.py | 79 +++++---------- myems-api/excelexporters/storesaving.py | 79 +++++---------- myems-api/excelexporters/storestatistics.py | 79 +++++---------- myems-api/excelexporters/tenantcost.py | 16 +-- .../excelexporters/tenantenergycategory.py | 16 +-- myems-api/excelexporters/tenantenergyitem.py | 16 +-- myems-api/excelexporters/tenantload.py | 16 +-- myems-api/excelexporters/tenantsaving.py | 16 +-- myems-api/excelexporters/tenantstatistics.py | 16 +-- 46 files changed, 727 insertions(+), 1324 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index a24326b4..d68b58b4 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -418,8 +418,8 @@ 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)] = '{:.2%}'.format(round( - reporting_period_data['subtotals'][i], 2) / costsum) if costsum is not None and costsum != Decimal(0.0)\ - else " " + reporting_period_data['subtotals'][i], 2) / costsum) if \ + costsum is not None and costsum != Decimal(0.0) else " " current_row_number += 1 table_end_row_number = current_row_number - 1 @@ -753,17 +753,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -774,14 +776,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -790,7 +792,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -870,33 +872,3 @@ def timestamps_data_not_equal_0(lists): if len(value) > 0: number += 1 return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - diff --git a/myems-api/excelexporters/combinedequipmentenergycategory.py b/myems-api/excelexporters/combinedequipmentenergycategory.py index 10431f92..ae31e952 100644 --- a/myems-api/excelexporters/combinedequipmentenergycategory.py +++ b/myems-api/excelexporters/combinedequipmentenergycategory.py @@ -623,17 +623,18 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue + col = format_cell.get_column_letter(table_current_col_number) - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -644,14 +645,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -660,7 +661,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -741,32 +742,3 @@ def timestamps_data_not_equal_0(lists): number += 1 return number - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index 04908640..d250ebcc 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -583,17 +583,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -604,14 +606,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -620,7 +622,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -710,31 +712,3 @@ def timestamps_data_not_equal_0(lists): number += 1 return number - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index b39e694d..a8dd4cc9 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -624,17 +624,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -645,14 +647,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -661,7 +663,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -749,32 +751,3 @@ def timestamps_data_not_equal_0(lists): if len(value) > 0: number += 1 return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 diff --git a/myems-api/excelexporters/combinedequipmentload.py b/myems-api/excelexporters/combinedequipmentload.py index 52a4b29a..1bcb6e95 100644 --- a/myems-api/excelexporters/combinedequipmentload.py +++ b/myems-api/excelexporters/combinedequipmentload.py @@ -532,17 +532,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -553,14 +555,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -569,7 +571,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ################################################################################################################ # parameters chart and parameters table @@ -649,32 +651,3 @@ def timestamps_data_not_equal_0(lists): if len(value) > 0: number += 1 return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 diff --git a/myems-api/excelexporters/combinedequipmentoutput.py b/myems-api/excelexporters/combinedequipmentoutput.py index ef306405..dd05175d 100644 --- a/myems-api/excelexporters/combinedequipmentoutput.py +++ b/myems-api/excelexporters/combinedequipmentoutput.py @@ -523,17 +523,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -544,14 +546,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -560,7 +562,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -640,32 +642,3 @@ def timestamps_data_not_equal_0(lists): if len(value) > 0: number += 1 return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index 87f2cc82..d1915e39 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -713,17 +713,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -734,14 +736,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -750,7 +752,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ################################################################################################################ # parameters chart and parameters table @@ -839,32 +841,3 @@ def timestamps_data_not_equal_0(lists): if len(value) > 0: number += 1 return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 diff --git a/myems-api/excelexporters/combinedequipmentstatistics.py b/myems-api/excelexporters/combinedequipmentstatistics.py index 78e15f06..3ddc8178 100644 --- a/myems-api/excelexporters/combinedequipmentstatistics.py +++ b/myems-api/excelexporters/combinedequipmentstatistics.py @@ -563,17 +563,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -584,14 +586,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -600,7 +602,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ################################################################################################################ # parameters chart and parameters table @@ -681,31 +683,3 @@ def timestamps_data_not_equal_0(lists): number += 1 return number - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 diff --git a/myems-api/excelexporters/equipmentcost.py b/myems-api/excelexporters/equipmentcost.py index 9dc4cfd5..0e752072 100644 --- a/myems-api/excelexporters/equipmentcost.py +++ b/myems-api/excelexporters/equipmentcost.py @@ -616,17 +616,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -637,14 +639,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -653,7 +655,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentenergycategory.py b/myems-api/excelexporters/equipmentenergycategory.py index 0be50104..c7f2afa9 100644 --- a/myems-api/excelexporters/equipmentenergycategory.py +++ b/myems-api/excelexporters/equipmentenergycategory.py @@ -664,17 +664,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -685,14 +687,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -701,7 +703,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index b7a24c98..94cdc15c 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -527,17 +527,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -548,14 +550,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -564,7 +566,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index 769aa80f..e228f7ed 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -548,17 +548,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number-1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border @@ -569,14 +571,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -585,7 +587,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py index 27075171..f53d263a 100644 --- a/myems-api/excelexporters/equipmentload.py +++ b/myems-api/excelexporters/equipmentload.py @@ -469,17 +469,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -490,14 +492,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -506,7 +508,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentoutput.py b/myems-api/excelexporters/equipmentoutput.py index e03c8a93..0c98a3b4 100644 --- a/myems-api/excelexporters/equipmentoutput.py +++ b/myems-api/excelexporters/equipmentoutput.py @@ -466,17 +466,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -487,14 +489,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -503,7 +505,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index 5725e53e..ec2f59e0 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -653,17 +653,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -674,14 +676,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -690,7 +692,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 7abb27fa..3aeff0e9 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -502,17 +502,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -523,14 +525,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -539,7 +541,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index 53e8bc2d..1bf4d1ba 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -60,60 +60,6 @@ def export(report, name, reporting_start_datetime_local, reporting_end_datetime_ return base64_message -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_not_equal_0(lists): - number = 0 - for i, value in enumerate(list(lists)): - if len(value) > 0: - number += 1 - return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): wb = Workbook() @@ -516,17 +462,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -537,14 +485,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -553,7 +501,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -608,3 +556,28 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d wb.save(filename) return filename + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 560874cf..b8e32905 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -56,60 +56,6 @@ def export(result, name, reporting_start_datetime_local, reporting_end_datetime_ return base64_message -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_not_equal_0(lists): - number = 0 - for i, value in enumerate(list(lists)): - if len(value) > 0: - number += 1 - return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 -# The column number is not greater than 90 - if num <= 26: - return chr(num+64) -# The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 -# Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): wb = Workbook() @@ -534,17 +480,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -555,14 +503,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -571,7 +519,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -626,3 +574,28 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d wb.save(filename) return filename + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index c08272e5..f8c238e7 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -56,60 +56,6 @@ def export(result, name, reporting_start_datetime_local, reporting_end_datetime_ return base64_message -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_not_equal_0(lists): - number = 0 - for i, value in enumerate(list(lists)): - if len(value) > 0: - number += 1 - return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 -# The column number is not greater than 90 - if num <= 26: - return chr(num+64) -# The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 -# Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type): wb = Workbook() ws = wb.active @@ -474,17 +420,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -495,14 +443,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -511,7 +459,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -562,3 +510,28 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d wb.save(filename) return filename + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index ebdb35e9..972c4f91 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -63,60 +63,6 @@ def export(result, return base64_message -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_not_equal_0(lists): - number = 0 - for i, value in enumerate(list(lists)): - if len(value) > 0: - number += 1 - return number - - -def decimal_to_column(num=65): - string = '' - num = num - 64 -# The column number is not greater than 90 - if num <= 26: - return chr(num+64) -# The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 -# Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - def generate_excel(report, name, reporting_start_datetime_local, @@ -287,7 +233,7 @@ def generate_excel(report, for i in range(0, ca_len): # 38 title - col = chr(ord('C') + i) + col = format_cell.get_column_letter(3 + i) ws[col + str(start_detail_data_row_num - 1)].fill = table_fill ws[col + str(start_detail_data_row_num - 1)].font = title_font @@ -421,17 +367,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -442,14 +390,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -458,7 +406,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -513,3 +461,28 @@ def generate_excel(report, wb.save(filename) return filename + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_not_equal_0(lists): + number = 0 + for i, value in enumerate(list(lists)): + if len(value) > 0: + number += 1 + return number diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index 8a680175..441a31ed 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -62,52 +62,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -750,17 +704,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -771,14 +727,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -787,7 +743,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -842,3 +798,20 @@ def generate_excel(report, wb.save(filename) return filename + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index d0c1cd7d..1474d22e 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -61,52 +61,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -636,17 +590,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -657,14 +613,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -673,7 +629,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -729,3 +685,19 @@ def generate_excel(report, return filename + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 81f6ee1f..908c527c 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -61,52 +61,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -594,17 +548,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -615,14 +571,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -631,7 +587,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -695,3 +651,20 @@ def group_by_category(category_list): category_dict[value] = list() category_dict[value].append(i) return category_dict + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True \ No newline at end of file diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 7f8b2302..8b6e8806 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -60,52 +60,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -567,17 +521,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -588,14 +544,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -604,7 +560,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -659,3 +615,20 @@ def generate_excel(report, wb.save(filename) return filename + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index 42c7f6a6..9ad487db 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -62,52 +62,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -737,17 +691,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -758,14 +714,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -774,7 +730,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -838,3 +794,20 @@ def sum_list(lists): total += lists[i] return total + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 418d4894..0ac147c2 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -60,52 +60,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -672,17 +626,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -693,14 +649,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -709,7 +665,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -764,3 +720,28 @@ def generate_excel(report, wb.save(filename) return filename + + +def column_to_decimal(string='A'): + num = 0 + for index, key in enumerate(string[::-1]): + num += (ord(key) - 64) * (26 ** index) + + return num + 64 + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index cf1147a5..40bbe4d5 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -742,17 +742,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -763,14 +765,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -779,7 +781,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index dd6c00f4..7cf89805 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -787,17 +787,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -808,14 +810,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -824,7 +826,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index 60a2b974..8d9cdee7 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -634,17 +634,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -655,14 +657,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -671,7 +673,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index 6506fb70..83e205bb 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -674,17 +674,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -695,14 +697,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -711,7 +713,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index d9a8ad57..48425220 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -582,17 +582,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -603,14 +605,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -619,7 +621,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index 9d13a891..1114ecad 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -570,17 +570,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -591,14 +593,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -607,7 +609,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index 975a87e8..1346cd60 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -778,17 +778,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -799,14 +801,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -815,7 +817,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index 63cdca41..5d92d9c0 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -619,17 +619,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -640,14 +642,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -656,7 +658,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 5fbf101c..37fbf883 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -62,52 +62,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -712,17 +666,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -733,14 +689,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -749,7 +705,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -804,3 +760,20 @@ def generate_excel(report, wb.save(filename) return filename + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index 60df405d..85687a50 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -61,52 +61,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -637,17 +591,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -658,14 +614,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -674,7 +630,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -729,3 +685,20 @@ def generate_excel(report, wb.save(filename) return filename + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index 4ec3a7b4..64f570b0 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -61,52 +61,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -596,17 +550,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -617,14 +573,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -633,7 +589,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -697,3 +653,20 @@ def group_by_category(category_list): category_dict[value] = list() category_dict[value].append(i) return category_dict + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index 1afc28af..eeac2450 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -60,52 +60,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -565,17 +519,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -586,14 +542,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -602,7 +558,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -657,3 +613,20 @@ def generate_excel(report, wb.save(filename) return filename + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True \ No newline at end of file diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 42c7f6a6..9ad487db 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -62,52 +62,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -737,17 +691,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -758,14 +714,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -774,7 +730,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -838,3 +794,20 @@ def sum_list(lists): total += lists[i] return total + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 48d94465..ee3324de 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -61,52 +61,6 @@ def export(report, return base64_message -def decimal_to_column(num=65): - string = '' - num = num - 64 - # The column number is not greater than 90 - if num <= 26: - return chr(num + 64) - # The column number is greater than 90 - while num // 26 > 0: - if num % 26 == 0: - string += 'Z' - num = num // 26 - 1 - else: - string += chr(num % 26 + 64) - num //= 26 - # Avoid conversion errors that might occur between 741 and 766 - if num > 0: - string += chr(num + 64) - - return string[::-1] - - -def column_to_decimal(string='A'): - num = 0 - for index, key in enumerate(string[::-1]): - num += (ord(key) - 64) * (26 ** index) - - return num + 64 - - -def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): - max_len = 0 - for i, value in enumerate(list(parameters_timestamps_lists)): - if len(value) > max_len: - max_len = len(value) - - return max_len - - -def timestamps_data_all_equal_0(lists): - for i, value in enumerate(list(lists)): - if len(value) > 0: - return False - - return True - - def generate_excel(report, name, reporting_start_datetime_local, @@ -673,17 +627,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = decimal_to_column(column_to_decimal(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -694,14 +650,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = decimal_to_column(column_to_decimal(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -710,7 +666,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table @@ -765,3 +721,20 @@ def generate_excel(report, wb.save(filename) return filename + + +def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): + max_len = 0 + for i, value in enumerate(list(parameters_timestamps_lists)): + if len(value) > max_len: + max_len = len(value) + + return max_len + + +def timestamps_data_all_equal_0(lists): + for i, value in enumerate(list(lists)): + if len(value) > 0: + return False + + return True \ No newline at end of file diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index ded78239..8f94a588 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -647,17 +647,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -668,14 +670,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -684,7 +686,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/tenantenergycategory.py b/myems-api/excelexporters/tenantenergycategory.py index 29ffc0ca..3a2e684d 100644 --- a/myems-api/excelexporters/tenantenergycategory.py +++ b/myems-api/excelexporters/tenantenergycategory.py @@ -712,17 +712,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -733,14 +735,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -749,7 +751,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index 4efc125a..bd990495 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -543,17 +543,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -564,14 +566,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -580,7 +582,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index b6e4aaaf..0b6f1357 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -584,17 +584,19 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -605,14 +607,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -621,7 +623,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/tenantsaving.py b/myems-api/excelexporters/tenantsaving.py index 519290ca..efbff5f5 100644 --- a/myems-api/excelexporters/tenantsaving.py +++ b/myems-api/excelexporters/tenantsaving.py @@ -686,17 +686,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -707,14 +709,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -723,7 +725,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index c87aff6e..d7f34a99 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -618,17 +618,19 @@ def generate_excel(report, parameters_ws_current_row_number += 1 - table_current_col_number = 'B' + table_current_col_number = 2 for i in range(0, parameters_names_len): if len(parameters_data['timestamps'][i]) == 0: continue - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill - parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border + col = format_cell.get_column_letter(table_current_col_number) - col = chr(ord(table_current_col_number) + 1) + parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill + parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border + + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border @@ -639,14 +641,14 @@ def generate_excel(report, table_current_row_number = parameters_ws_current_row_number for j, value in enumerate(list(parameters_data['timestamps'][i])): - col = table_current_col_number + col = format_cell.get_column_letter(table_current_col_number) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment parameters_ws[col + str(table_current_row_number)] = value - col = chr(ord(col) + 1) + col = format_cell.get_column_letter(table_current_col_number + 1) parameters_ws[col + str(table_current_row_number)].border = f_border parameters_ws[col + str(table_current_row_number)].font = title_font @@ -655,7 +657,7 @@ def generate_excel(report, table_current_row_number += 1 - table_current_col_number = chr(ord(table_current_col_number) + 3) + table_current_col_number = table_current_col_number + 3 ######################################################## # parameters chart and parameters table From e2a4c63c8e409bdd196365857821a746cfc71efa Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 27 Apr 2021 15:15:17 +0800 Subject: [PATCH 10/10] fixed PEP8 warnings --- myems-api/excelexporters/shopfloorenergyitem.py | 2 +- myems-api/excelexporters/storeload.py | 2 +- myems-api/excelexporters/storestatistics.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 908c527c..7091c7c4 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -667,4 +667,4 @@ def timestamps_data_all_equal_0(lists): if len(value) > 0: return False - return True \ No newline at end of file + return True diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index eeac2450..b997d04c 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -629,4 +629,4 @@ def timestamps_data_all_equal_0(lists): if len(value) > 0: return False - return True \ No newline at end of file + return True diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index ee3324de..f8a32203 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -737,4 +737,4 @@ def timestamps_data_all_equal_0(lists): if len(value) > 0: return False - return True \ No newline at end of file + return True