Parameter Data is added to Excel Exporter of All Shopfloor Reports

pull/35/head
Caozhenhui 2021-04-19 16:25:01 +08:00
parent 001412323e
commit 14c87ea613
6 changed files with 1525 additions and 103 deletions

View File

@ -2,15 +2,16 @@ import base64
import uuid import uuid
import os import os
from openpyxl.chart import ( from openpyxl.chart import (
PieChart, PieChart,
LineChart, LineChart,
BarChart, Reference,
Reference, )
)
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
from openpyxl.chart.label import DataLabelList from openpyxl.chart.label import DataLabelList
import openpyxl.utils.cell as format_cell
#################################################################################################################### ####################################################################################################################
# PROCEDURES # PROCEDURES
@ -61,12 +62,57 @@ def export(report,
return base64_message 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, def generate_excel(report,
name, name,
reporting_start_datetime_local, reporting_start_datetime_local,
reporting_end_datetime_local, reporting_end_datetime_local,
period_type): period_type):
wb = Workbook() wb = Workbook()
ws = wb.active ws = wb.active
@ -182,7 +228,7 @@ def generate_excel(report,
if has_energy_data_flag: if has_energy_data_flag:
ws['B6'].font = title_font ws['B6'].font = title_font
ws['B6'] = name+' 报告期成本' ws['B6'] = name + ' 报告期成本'
category = reporting_period_data['names'] category = reporting_period_data['names']
ca_len = len(category) ca_len = len(category)
@ -232,7 +278,7 @@ def generate_excel(report,
if reporting_period_data['increment_rates'][i] is not None else "-" if reporting_period_data['increment_rates'][i] is not None else "-"
ws[col + '10'].border = f_border 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'].fill = table_fill
ws[end_col + '7'].font = name_font ws[end_col + '7'].font = name_font
ws[end_col + '7'].alignment = c_c_alignment ws[end_col + '7'].alignment = c_c_alignment
@ -269,7 +315,7 @@ def generate_excel(report,
if has_ele_peak_flag: if has_ele_peak_flag:
ws['B12'].font = title_font ws['B12'].font = title_font
ws['B12'] = name+'分时用电成本' ws['B12'] = name + '分时用电成本'
ws['B13'].fill = table_fill ws['B13'].fill = table_fill
ws['B13'].font = name_font ws['B13'].font = name_font
@ -288,8 +334,8 @@ def generate_excel(report,
ws['D13'].border = f_border ws['D13'].border = f_border
ws['D13'] = '分时用电成本占比' ws['D13'] = '分时用电成本占比'
wssum = round(reporting_period_data['toppeaks'][0], 2)+round(reporting_period_data['onpeaks'][0], 2)\ wssum = round(reporting_period_data['toppeaks'][0], 2) + round(reporting_period_data['onpeaks'][0], 2) + round(
+ round(reporting_period_data['midpeaks'][0], 2)+round(reporting_period_data['offpeaks'][0], 2) reporting_period_data['midpeaks'][0], 2) + round(reporting_period_data['offpeaks'][0], 2)
ws['B14'].font = title_font ws['B14'].font = title_font
ws['B14'].alignment = c_c_alignment ws['B14'].alignment = c_c_alignment
@ -304,7 +350,8 @@ def generate_excel(report,
ws['D14'].font = title_font ws['D14'].font = title_font
ws['D14'].alignment = c_c_alignment ws['D14'].alignment = c_c_alignment
ws['D14'].border = f_border 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'].font = title_font
ws['B15'].alignment = c_c_alignment ws['B15'].alignment = c_c_alignment
@ -319,7 +366,8 @@ def generate_excel(report,
ws['D15'].font = title_font ws['D15'].font = title_font
ws['D15'].alignment = c_c_alignment ws['D15'].alignment = c_c_alignment
ws['D15'].border = f_border 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'].font = title_font
ws['B16'].alignment = c_c_alignment ws['B16'].alignment = c_c_alignment
@ -334,7 +382,8 @@ def generate_excel(report,
ws['D16'].font = title_font ws['D16'].font = title_font
ws['D16'].alignment = c_c_alignment ws['D16'].alignment = c_c_alignment
ws['D16'].border = f_border 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'].font = title_font
ws['B17'].alignment = c_c_alignment ws['B17'].alignment = c_c_alignment
@ -349,10 +398,11 @@ def generate_excel(report,
ws['D17'].font = title_font ws['D17'].font = title_font
ws['D17'].alignment = c_c_alignment ws['D17'].alignment = c_c_alignment
ws['D17'].border = f_border 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 = PieChart()
pie.title = name+'分时用电成本' pie.title = name + '分时用电成本'
labels = Reference(ws, min_col=2, min_row=14, max_row=17) 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_data = Reference(ws, min_col=3, min_row=13, max_row=17)
pie.add_data(pie_data, titles_from_data=True) 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)].font = title_font
ws['D' + str(current_row_number)].alignment = c_c_alignment 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)].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 current_row_number += 1
@ -472,12 +523,18 @@ def generate_excel(report,
reporting_period_data = report['reporting_period'] reporting_period_data = report['reporting_period']
times = reporting_period_data['timestamps'] times = reporting_period_data['timestamps']
ca_len = len(report['reporting_period']['names']) 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)].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 detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 3
current_row_number = table_start_row_number current_row_number = detail_data_table_start_row_number
time = times[0] time = times[0]
has_data = False 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)].fill = table_fill
ws[col + str(current_row_number)].font = title_font 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)].alignment = c_c_alignment
ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ ws[col + str(current_row_number)] = \
" (" + reporting_period_data['units'][i] + ")" reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)].border = f_border
end_col = chr(ord(col) + 1) end_col = chr(ord(col) + 1)
@ -562,9 +619,12 @@ def generate_excel(report,
# line # line
line = LineChart() line = LineChart()
line.title = '报告期成本 - ' + ws.cell(column=3+i, row=table_start_row_number).value line.title = '报告期成本 - ' + \
labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
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.add_data(line_data, titles_from_data=True)
line.set_categories(labels) line.set_categories(labels)
line_data = line.series[0] line_data = line.series[0]
@ -593,6 +653,190 @@ def generate_excel(report,
for i in range(30, 69 + 1): for i in range(30, 69 + 1):
current_row_number = 70 current_row_number = 70
ws.row_dimensions[i].height = 0.1 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' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)

View File

@ -4,13 +4,13 @@ import os
from openpyxl.chart import ( from openpyxl.chart import (
PieChart, PieChart,
LineChart, LineChart,
BarChart,
Reference, Reference,
) )
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
from openpyxl.chart.label import DataLabelList from openpyxl.chart.label import DataLabelList
import openpyxl.utils.cell as format_cell
#################################################################################################################### ####################################################################################################################
# PROCEDURES # PROCEDURES
@ -61,6 +61,52 @@ def export(report,
return base64_message 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, def generate_excel(report,
name, name,
reporting_start_datetime_local, reporting_start_datetime_local,
@ -401,8 +447,6 @@ def generate_excel(report,
if has_child_flag: if has_child_flag:
child = report['child_space'] 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'].font = title_font
ws['B19'] = name+' 子空间能耗' ws['B19'] = name+' 子空间能耗'
@ -460,7 +504,6 @@ def generate_excel(report,
s1.dLbls.showVal = True # 数量显示 s1.dLbls.showVal = True # 数量显示
s1.dLbls.showPercent = True # 百分比显示 s1.dLbls.showPercent = True # 百分比显示
# s1 = CharacterProperties(sz=1800) # 图表中字体大小 *100 # s1 = CharacterProperties(sz=1800) # 图表中字体大小 *100
chart_cell = ''
if i % 2 == 0: if i % 2 == 0:
chart_cell = 'B' + str(chart_start_row_number) chart_cell = 'B' + str(chart_start_row_number)
else: else:
@ -489,7 +532,13 @@ def generate_excel(report,
times = reporting_period_data['timestamps'] times = reporting_period_data['timestamps']
has_detail_data_flag = True has_detail_data_flag = True
ca_len = len(report['reporting_period']['names']) 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 chart_start_row_number = current_row_number + 1
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 \
@ -586,6 +635,191 @@ def generate_excel(report,
chart_cell = chart_col + str(chart_start_row_number + 6*i) chart_cell = chart_col + str(chart_start_row_number + 6*i)
ws.add_chart(line, chart_cell) 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' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)

View File

@ -4,14 +4,13 @@ import os
from openpyxl.chart import ( from openpyxl.chart import (
PieChart, PieChart,
LineChart, LineChart,
BarChart,
Reference, Reference,
) )
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
from openpyxl.chart.label import DataLabelList from openpyxl.chart.label import DataLabelList
import openpyxl.utils.cell as format_cell
#################################################################################################################### ####################################################################################################################
# PROCEDURES # PROCEDURES
@ -62,6 +61,52 @@ def export(report,
return base64_message 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, def generate_excel(report,
name, name,
reporting_start_datetime_local, reporting_start_datetime_local,
@ -334,18 +379,22 @@ def generate_excel(report,
len(reporting_period_data['timestamps'][0]) == 0: len(reporting_period_data['timestamps'][0]) == 0:
has_timestamps_data = False has_timestamps_data = False
chart_start_row_number = current_row_number + 1
if has_values_data and has_timestamps_data: if has_values_data and has_timestamps_data:
ca_len = len(reporting_period_data['names']) ca_len = len(reporting_period_data['names'])
time = reporting_period_data['timestamps'][0] 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)].font = title_font
ws['B' + str(current_row_number)] = name + ' 详细数据' ws['B' + str(current_row_number)] = name + ' 详细数据'
current_row_number += 1 for i in range(0, parameters_names_len):
if len(report['parameters']['timestamps'][i]) == 0:
chart_start_row_number = current_row_number continue
parameters_parameters_datas_len += 1
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 table_start_row_number = current_row_number
ws.row_dimensions[current_row_number].height = 60 ws.row_dimensions[current_row_number].height = 60
@ -445,10 +494,194 @@ def generate_excel(report,
line.dLbls.showVal = True line.dLbls.showVal = True
line.dLbls.showPercent = False line.dLbls.showPercent = False
chart_col = 'B' 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_cell = chart_col + str(chart_start_row_number)
chart_start_row_number += 6 chart_start_row_number += 6
ws.add_chart(line, chart_cell) 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)

View File

@ -9,6 +9,7 @@ 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
#################################################################################################################### ####################################################################################################################
@ -59,6 +60,52 @@ def export(report,
return base64_message 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, def generate_excel(report,
name, name,
reporting_start_datetime_local, reporting_start_datetime_local,
@ -326,42 +373,48 @@ def generate_excel(report,
len(reporting_period_data['timestamps']) == 0: len(reporting_period_data['timestamps']) == 0:
has_timestamps_flag = False 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: if has_timestamps_flag:
timestamps = reporting_period_data['timestamps'][0] for i in range(0, parameters_names_len):
names = reporting_period_data['names'] if len(report['parameters']['timestamps'][i]) == 0:
ca_len = len(names) continue
time_len = len(timestamps) parameters_parameters_datas_len += 1
line_charts_row_number = 6 * ca_len detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2
analysis_end_row_number = 12 + 3 * ca_len
detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1
ws['B' + str(detailed_start_row_number)].font = title_font ws['B' + str(current_row_number)].font = title_font
ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' ws['B' + str(current_row_number)] = name + ' 详细数据'
# table_title # table_title
ws['B' + str(detailed_start_row_number + 1)].fill = table_fill ws['B' + str(detail_data_table_start_row_number)].fill = table_fill
ws['B' + str(detailed_start_row_number + 1)].font = name_font ws['B' + str(detail_data_table_start_row_number)].font = name_font
ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment
ws['B' + str(detailed_start_row_number + 1)] = "日期时间" ws['B' + str(detail_data_table_start_row_number)] = "日期时间"
ws['B' + str(detailed_start_row_number + 1)].border = f_border ws['B' + str(detail_data_table_start_row_number)].border = f_border
for i in range(0, ca_len): for i in range(0, ca_len):
col_average = chr(ord('C') + 2 * i) col_average = chr(ord('C') + 2 * i)
col_maximum = chr(ord('D') + 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(detail_data_table_start_row_number)].font = name_font
ws[col_average + str(detailed_start_row_number + 1)].alignment = c_c_alignment ws[col_average + str(detail_data_table_start_row_number)].alignment = c_c_alignment
ws[col_average + str(detailed_start_row_number + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][ ws[col_average + str(detail_data_table_start_row_number)] = \
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(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(detail_data_table_start_row_number)].font = name_font
ws[col_maximum + str(detailed_start_row_number + 1)].alignment = c_c_alignment ws[col_maximum + str(detail_data_table_start_row_number)].alignment = c_c_alignment
ws[col_maximum + str(detailed_start_row_number + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][ ws[col_maximum + str(detail_data_table_start_row_number)] = \
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(detail_data_table_start_row_number)].border = f_border
# table_date # table_date
for i in range(0, time_len): 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)].font = name_font
ws['B' + str(rows)].alignment = c_c_alignment ws['B' + str(rows)].alignment = c_c_alignment
@ -404,10 +457,10 @@ def generate_excel(report,
line.dLbls = DataLabelList() line.dLbls = DataLabelList()
line.dLbls.dLblPos = 't' line.dLbls.dLblPos = 't'
line.dLbls.showVal = True line.dLbls.showVal = True
times = Reference(ws, min_col=2, min_row=detailed_start_row_number + 2, times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1,
max_row=detailed_start_row_number + 2 + time_len) max_row=detail_data_table_start_row_number + 1 + time_len)
line_data = Reference(ws, min_col=2 + 2 * (i + 1), min_row=detailed_start_row_number + 1, line_data = Reference(ws, min_col=2 + 2 * (i + 1), min_row=detail_data_table_start_row_number,
max_row=detailed_start_row_number + 1 + time_len) max_row=detail_data_table_start_row_number + time_len)
line.add_data(line_data, titles_from_data=True) line.add_data(line_data, titles_from_data=True)
line.set_categories(times) line.set_categories(times)
ser = line.series[0] ser = line.series[0]
@ -417,6 +470,191 @@ def generate_excel(report,
chart_cell = str(analysis_end_row_number + 6 * i) chart_cell = str(analysis_end_row_number + 6 * i)
ws.add_chart(line, chart_col + chart_cell) 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' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)

View File

@ -4,13 +4,14 @@ import os
from openpyxl.chart import ( from openpyxl.chart import (
PieChart, PieChart,
LineChart, LineChart,
BarChart,
Reference, Reference,
) )
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
from openpyxl.chart.label import DataLabelList from openpyxl.chart.label import DataLabelList
import openpyxl.utils.cell as format_cell
#################################################################################################################### ####################################################################################################################
# PROCEDURES # PROCEDURES
@ -61,6 +62,52 @@ def export(report,
return base64_message 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, def generate_excel(report,
name, name,
reporting_start_datetime_local, reporting_start_datetime_local,
@ -474,18 +521,23 @@ def generate_excel(report,
len(reporting_period_data['timestamps'][0]) == 0: len(reporting_period_data['timestamps'][0]) == 0:
has_timestamps_data = False has_timestamps_data = False
current_row_number += 1
chart_start_row_number = current_row_number
if has_values_saving_data and has_timestamps_data: if has_values_saving_data and has_timestamps_data:
ca_len = len(reporting_period_data['names']) ca_len = len(reporting_period_data['names'])
time = reporting_period_data['timestamps'][0] 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 - 1)].font = title_font
ws['B' + str(current_row_number)] = name + ' 详细数据' 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 = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2
current_row_number += ca_len * 6
table_start_row_number = current_row_number table_start_row_number = current_row_number
ws.row_dimensions[current_row_number].height = 60 ws.row_dimensions[current_row_number].height = 60
@ -585,10 +637,194 @@ def generate_excel(report,
line.dLbls.showVal = True line.dLbls.showVal = True
line.dLbls.showPercent = False line.dLbls.showPercent = False
chart_col = 'B' 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_cell = chart_col + str(chart_start_row_number)
chart_start_row_number += 6 chart_start_row_number += 6
ws.add_chart(line, chart_cell) 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)

View File

@ -9,7 +9,7 @@ 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
@ -60,6 +60,52 @@ def export(report,
return base64_message 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, def generate_excel(report,
name, name,
reporting_start_datetime_local, reporting_start_datetime_local,
@ -99,19 +145,19 @@ def generate_excel(report,
b_c_alignment = Alignment(vertical='bottom', b_c_alignment = Alignment(vertical='bottom',
horizontal='center', horizontal='center',
text_rotation=0, text_rotation=0,
wrap_text=False, wrap_text=True,
shrink_to_fit=False, shrink_to_fit=False,
indent=0) indent=0)
c_c_alignment = Alignment(vertical='center', c_c_alignment = Alignment(vertical='center',
horizontal='center', horizontal='center',
text_rotation=0, text_rotation=0,
wrap_text=False, wrap_text=True,
shrink_to_fit=False, shrink_to_fit=False,
indent=0) indent=0)
b_r_alignment = Alignment(vertical='bottom', b_r_alignment = Alignment(vertical='bottom',
horizontal='right', horizontal='right',
text_rotation=0, text_rotation=0,
wrap_text=False, wrap_text=True,
shrink_to_fit=False, shrink_to_fit=False,
indent=0) indent=0)
@ -431,36 +477,42 @@ def generate_excel(report,
len(reporting_period_data['timestamps']) == 0: len(reporting_period_data['timestamps']) == 0:
has_timestamps_flag = False 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: if has_timestamps_flag:
timestamps = reporting_period_data['timestamps'][0] for i in range(0, parameters_names_len):
values = reporting_period_data['values'] if len(report['parameters']['timestamps'][i]) == 0:
names = reporting_period_data['names'] continue
ca_len = len(names) parameters_parameters_datas_len += 1
time_len = len(timestamps) detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2
# 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
ws['B' + str(detailed_start_row_number)].font = title_font ws['B' + str(current_row_number)].font = title_font
ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' ws['B' + str(current_row_number)] = name + ' 详细数据'
# table_title # table_title
ws['B' + str(detailed_start_row_number+1)].fill = table_fill ws['B' + str(detail_data_table_start_row_number)].fill = table_fill
ws['B' + str(detailed_start_row_number+1)].font = name_font ws['B' + str(detail_data_table_start_row_number)].font = name_font
ws['B' + str(detailed_start_row_number+1)].alignment = c_c_alignment ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment
ws['B' + str(detailed_start_row_number+1)] = "时间" ws['B' + str(detail_data_table_start_row_number)] = "时间"
ws['B' + str(detailed_start_row_number+1)].border = f_border ws['B' + str(detail_data_table_start_row_number)].border = f_border
for i in range(0, ca_len): for i in range(0, ca_len):
col = chr(ord('C') + i) col = chr(ord('C') + i)
ws[col + str(detailed_start_row_number+1)].font = name_font ws[col + str(detail_data_table_start_row_number)].font = name_font
ws[col + str(detailed_start_row_number+1)].alignment = c_c_alignment ws[col + str(detail_data_table_start_row_number)].alignment = c_c_alignment
ws[col + str(detailed_start_row_number+1)] = names[i] + " - (" + reporting_period_data['units'][i] + ")" ws[col + str(detail_data_table_start_row_number)] = \
ws[col + str(detailed_start_row_number+1)].border = f_border names[i] + " - (" + reporting_period_data['units'][i] + ")"
ws[col + str(detail_data_table_start_row_number)].border = f_border
# table_date # table_date
for i in range(0, time_len): 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)].font = name_font
ws['B' + str(rows)].alignment = c_c_alignment ws['B' + str(rows)].alignment = c_c_alignment
@ -477,7 +529,7 @@ def generate_excel(report,
ws[col + str(rows)].border = f_border 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)].font = name_font
ws['B' + str(row_subtotals)].alignment = c_c_alignment ws['B' + str(row_subtotals)].alignment = c_c_alignment
ws['B' + str(row_subtotals)] = "小计" ws['B' + str(row_subtotals)] = "小计"
@ -511,10 +563,10 @@ def generate_excel(report,
line.dLbls = DataLabelList() line.dLbls = DataLabelList()
line.dLbls.dLblPos = 't' line.dLbls.dLblPos = 't'
line.dLbls.showVal = True line.dLbls.showVal = True
times = Reference(ws, min_col=2, min_row=detailed_start_row_number + 2, times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1,
max_row=detailed_start_row_number + 2 + time_len) max_row=detail_data_table_start_row_number + 1 + time_len)
line_data = Reference(ws, min_col=3 + i, min_row=detailed_start_row_number + 1, line_data = Reference(ws, min_col=3 + i, min_row=detail_data_table_start_row_number,
max_row=detailed_start_row_number + 1 + time_len) max_row=detail_data_table_start_row_number + time_len)
line.add_data(line_data, titles_from_data=True) line.add_data(line_data, titles_from_data=True)
line.set_categories(times) line.set_categories(times)
ser = line.series[0] ser = line.series[0]
@ -523,6 +575,191 @@ def generate_excel(report,
chart_cell = str(analysis_end_row_number + 6 * i) chart_cell = str(analysis_end_row_number + 6 * i)
ws.add_chart(line, chart_col + chart_cell) 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' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)