added associated parameters data to combinedequipmentload in API

pull/31/head
13621160019@163.com 2021-04-06 17:21:23 +08:00
parent 3967ad5d08
commit db4f887975
1 changed files with 221 additions and 11 deletions

View File

@ -9,14 +9,15 @@ from openpyxl.chart.label import DataLabelList
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
from openpyxl.drawing.image import Image from openpyxl.drawing.image import Image
from openpyxl import Workbook from openpyxl import Workbook
import openpyxl.utils.cell as format_cell
#################################################################################################################### ########################################################################################################################
# PROCEDURES # PROCEDURES
# Step 1: Validate the report data # Step 1: Validate the report data
# Step 2: Generate excel file # Step 2: Generate excel file
# Step 3: Encode the excel file bytes to Base64 # Step 3: Encode the excel file bytes to Base64
#################################################################################################################### ########################################################################################################################
def export(report, def export(report,
@ -153,12 +154,12 @@ def generate_excel(report,
wb.save(filename) wb.save(filename)
return filename return filename
################################################# ####################################################################################################################
# First: 负荷分析 # First: 负荷分析
# 6: title # 6: title
# 7: table title # 7: table title
# 8~2*ca_len table_data # 8~2*ca_len table_data
################################################# ####################################################################################################################
reporting_period_data = report['reporting_period'] reporting_period_data = report['reporting_period']
has_energy_data_flag = True has_energy_data_flag = True
@ -254,12 +255,12 @@ def generate_excel(report,
if reporting_period_data['factors_increment_rate'][i] is not None else '0.00%' if reporting_period_data['factors_increment_rate'][i] is not None else '0.00%'
ws['E' + str(row + 1)].border = f_border ws['E' + str(row + 1)].border = f_border
######################################################## ####################################################################################################################
# Third: 详细数据 # Third: 详细数据
# analysis_end_row_number~ analysis_end_row_number + 6*cal_len: line # analysis_end_row_number~ analysis_end_row_number + 6*cal_len: line
# detailed_start_row_number: table title # detailed_start_row_number: table title
# detailed_start_row_number + 1~: table_data # detailed_start_row_number + 1~: table_data
######################################################## ####################################################################################################################
has_timestamps_flag = True has_timestamps_flag = True
if "timestamps" not in reporting_period_data.keys() or \ if "timestamps" not in reporting_period_data.keys() or \
reporting_period_data['timestamps'] is None or \ reporting_period_data['timestamps'] is None or \
@ -271,9 +272,10 @@ def generate_excel(report,
names = reporting_period_data['names'] names = reporting_period_data['names']
ca_len = len(names) ca_len = len(names)
time_len = len(timestamps) time_len = len(timestamps)
real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
line_charts_row_number = 6 * ca_len line_charts_row_number = 6 * ca_len
analysis_end_row_number = 9 + 2 * ca_len analysis_end_row_number = 9 + 2 * ca_len
detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + real_timestamps_len * 7
ws['B' + str(detailed_start_row_number)].font = title_font ws['B' + str(detailed_start_row_number)].font = title_font
ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' ws['B' + str(detailed_start_row_number)] = name + ' 详细数据'
@ -290,14 +292,14 @@ def generate_excel(report,
ws[col_average + str(detailed_start_row_number + 1)].font = name_font 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)].alignment = c_c_alignment
ws[col_average + str(detailed_start_row_number + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][ ws[col_average + str(detailed_start_row_number + 1)] = \
i] + "/H)" names[i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)"
ws[col_average + str(detailed_start_row_number + 1)].border = f_border ws[col_average + str(detailed_start_row_number + 1)].border = f_border
ws[col_maximum + str(detailed_start_row_number + 1)].font = name_font 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)].alignment = c_c_alignment
ws[col_maximum + str(detailed_start_row_number + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][ ws[col_maximum + str(detailed_start_row_number + 1)] = \
i] + "/H)" names[i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)"
ws[col_maximum + str(detailed_start_row_number + 1)].border = f_border ws[col_maximum + str(detailed_start_row_number + 1)].border = f_border
# table_date # table_date
for i in range(0, time_len): for i in range(0, time_len):
@ -435,7 +437,215 @@ def generate_excel(report,
ws[col_maximum + str(rows)].number_format = '0.00' ws[col_maximum + str(rows)].number_format = '0.00'
ws[col_maximum + str(rows)].border = f_border ws[col_maximum + str(rows)].border = f_border
####################################################################################################################
current_sheet_parameters_row_number = analysis_end_row_number + ca_len * 6 + 1
has_parameters_names_and_timestamps_and_values_data = True
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 = 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
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 = 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
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 = chr(ord(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' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)
return 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
def timestamps_data_not_equal_0(lists):
number = 0
for i, value in enumerate(list(lists)):
if len(value) > 0:
number += 1
return number