Passed
Push — master ( 02289f...d6a19b )
by Guangyu
08:58 queued 15s
created

excelexporters.meterenergy.export()   B

Complexity

Conditions 5

Size

Total Lines 39
Code Lines 25

Duplication

Lines 39
Ratio 100 %

Importance

Changes 0
Metric Value
eloc 25
dl 39
loc 39
rs 8.8133
c 0
b 0
f 0
cc 5
nop 8

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
import base64
2
import gettext
3
import os
4
import re
5
import uuid
6
7
import openpyxl.utils.cell as format_cell
8
from openpyxl import Workbook
9
from openpyxl.chart import LineChart, Reference
10
from openpyxl.chart.label import DataLabelList
11
from openpyxl.drawing.image import Image
12
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
13
14
15
########################################################################################################################
16
# PROCEDURES
17
# Step 1: Validate the report data
18
# Step 2: Generate excel file from the report data
19
# Step 3: Encode the excel file to Base64
20
########################################################################################################################
21
22 View Code Duplication
def export(report, name, reporting_start_datetime_local, reporting_end_datetime_local, base_period_start_datetime,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
23
           base_period_end_datetime, period_type, language):
24
    ####################################################################################################################
25
    # Step 1: Validate the report data
26
    ####################################################################################################################
27
    if report is None:
28
        return None
29
30
    ####################################################################################################################
31
    # Step 2: Generate excel file from the report data
32
    ####################################################################################################################
33
    filename = generate_excel(report,
34
                              name,
35
                              reporting_start_datetime_local,
36
                              reporting_end_datetime_local,
37
                              base_period_start_datetime,
38
                              base_period_end_datetime,
39
                              period_type,
40
                              language)
41
    ####################################################################################################################
42
    # Step 3: Encode the excel file to Base64
43
    ####################################################################################################################
44
    binary_file_data = b''
45
    try:
46
        with open(filename, 'rb') as binary_file:
47
            binary_file_data = binary_file.read()
48
    except IOError as ex:
49
        print(str(ex))
50
51
    # Base64 encode the bytes
52
    base64_encoded_data = base64.b64encode(binary_file_data)
53
    # get the Base64 encoded data using human-readable characters.
54
    base64_message = base64_encoded_data.decode('utf-8')
55
    # delete the file from server
56
    try:
57
        os.remove(filename)
58
    except NotImplementedError as ex:
59
        print(str(ex))
60
    return base64_message
61
62
63
def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local,
64
                   base_period_start_datetime, base_period_end_datetime, period_type, language):
65
    locale_path = './i18n/'
66
    if language == 'zh_CN':
67
        trans = gettext.translation('myems', locale_path, languages=['zh_CN'])
68
    elif language == 'de':
69
        trans = gettext.translation('myems', locale_path, languages=['de'])
70
    elif language == 'en':
71
        trans = gettext.translation('myems', locale_path, languages=['en'])
72
    else:
73
        trans = gettext.translation('myems', locale_path, languages=['en'])
74
    trans.install()
75
    _ = trans.gettext
76
77
    wb = Workbook()
78
    ws = wb.active
79
    ws.title = "MeterEnergy"
80
81
    # Row height
82
    ws.row_dimensions[1].height = 102
83
    for i in range(2, 2000 + 1):
84
        ws.row_dimensions[i].height = 42
85
86
    # Col width
87
    ws.column_dimensions['A'].width = 1.5
88
89
    ws.column_dimensions['B'].width = 25.0
90
91
    for i in range(ord('C'), ord('L')):
92
        ws.column_dimensions[chr(i)].width = 15.0
93
94
    # Font
95
    name_font = Font(name='Arial', size=15, bold=True)
96
    title_font = Font(name='Arial', size=15, bold=True)
97
98
    table_fill = PatternFill(fill_type='solid', fgColor='90ee90')
99
    f_border = Border(left=Side(border_style='medium'),
100
                      right=Side(border_style='medium'),
101
                      bottom=Side(border_style='medium'),
102
                      top=Side(border_style='medium')
103
                      )
104
    b_border = Border(
105
        bottom=Side(border_style='medium'),
106
    )
107
108
    b_c_alignment = Alignment(vertical='bottom',
109
                              horizontal='center',
110
                              text_rotation=0,
111
                              wrap_text=True,
112
                              shrink_to_fit=False,
113
                              indent=0)
114
    c_c_alignment = Alignment(vertical='center',
115
                              horizontal='center',
116
                              text_rotation=0,
117
                              wrap_text=True,
118
                              shrink_to_fit=False,
119
                              indent=0)
120
    b_r_alignment = Alignment(vertical='bottom',
121
                              horizontal='right',
122
                              text_rotation=0,
123
                              wrap_text=True,
124
                              shrink_to_fit=False,
125
                              indent=0)
126
127
    # Img
128
    img = Image("excelexporters/myems.png")
129
    ws.add_image(img, 'A1')
130
131
    # Title
132
    ws['B3'].alignment = b_r_alignment
133
    ws['B3'] = _('Name') + ':'
134
    ws['C3'].border = b_border
135
    ws['C3'].alignment = b_c_alignment
136
    ws['C3'] = name
137
138
    ws['D3'].alignment = b_r_alignment
139
    ws['D3'] = _('Period Type') + ':'
140
    ws['E3'].border = b_border
141
    ws['E3'].alignment = b_c_alignment
142
    ws['E3'] = period_type
143
144
    ws['B4'].alignment = b_r_alignment
145
    ws['B4'] = _('Reporting Start Datetime') + ':'
146
    ws['C4'].border = b_border
147
    ws['C4'].alignment = b_c_alignment
148
    ws['C4'] = reporting_start_datetime_local
149
150
    ws['D4'].alignment = b_r_alignment
151
    ws['D4'] = _('Reporting End Datetime') + ':'
152
    ws['E4'].border = b_border
153
    ws['E4'].alignment = b_c_alignment
154
    ws['E4'] = reporting_end_datetime_local
155
156
    is_base_period_timestamp_exists_flag = is_base_period_timestamp_exists(report['base_period'])
157
158
    if is_base_period_timestamp_exists_flag:
159
        ws['B5'].alignment = b_r_alignment
160
        ws['B5'] = _('Base Period Start Datetime') + ':'
161
        ws['C5'].border = b_border
162
        ws['C5'].alignment = b_c_alignment
163
        ws['C5'] = base_period_start_datetime
164
165
        ws['D5'].alignment = b_r_alignment
166
        ws['D5'] = _('Base Period End Datetime') + ':'
167
        ws['E5'].border = b_border
168
        ws['E5'].alignment = b_c_alignment
169
        ws['E5'] = base_period_end_datetime
170
171
    if "reporting_period" not in report.keys() or \
172
            "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
173
        filename = str(uuid.uuid4()) + '.xlsx'
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable str does not seem to be defined.
Loading history...
174
        wb.save(filename)
175
176
        return filename
177
    ####################################################################################################################
178
    # First: Consumption
179
    # 6: title
180
    # 7: table title
181
    # 8~9 table_data
182
    ####################################################################################################################
183
    if "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
184
        for i in range(6, 9 + 1):
185
            ws.row_dimensions[i].height = 0.1
186
    else:
187
        reporting_period_data = report['reporting_period']
188
189
        ws.row_dimensions[7].height = 60
190
191
        ws['B7'].font = title_font
192
        ws['B7'].alignment = c_c_alignment
193
        ws['B7'].fill = table_fill
194
        ws['B7'].border = f_border
195
        ws['B7'] = name
196
197
        ws['B8'].font = title_font
198
        ws['B8'].alignment = c_c_alignment
199
        ws['B8'] = _('Consumption')
200
        ws['B8'].border = f_border
201
202
        ws['B9'].font = title_font
203
        ws['B9'].alignment = c_c_alignment
204
        ws['B9'] = _('Increment Rate')
205
        ws['B9'].border = f_border
206
207
        ws['C7'].fill = table_fill
208
        ws['C7'].font = name_font
209
        ws['C7'].alignment = c_c_alignment
210
        ws['C7'] = report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")"
211
        ws['C7'].border = f_border
212
213
        ws['C8'].font = name_font
214
        ws['C8'].alignment = c_c_alignment
215
        ws['C8'] = round(reporting_period_data['total_in_category'], 2)
216
        ws['C8'].border = f_border
217
218
        ws['C9'].font = name_font
219
        ws['C9'].alignment = c_c_alignment
220
        ws['C9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
221
            if reporting_period_data['increment_rate'] is not None else "-"
222
        ws['C9'].border = f_border
223
224
        # TCE
225
        ws['D7'].fill = table_fill
226
        ws['D7'].font = name_font
227
        ws['D7'].alignment = c_c_alignment
228
        ws['D7'] = _('Ton of Standard Coal') + '(TCE)'
229
        ws['D7'].border = f_border
230
231
        ws['D8'].font = name_font
232
        ws['D8'].alignment = c_c_alignment
233
        ws['D8'] = round(reporting_period_data['total_in_kgce'] / 1000, 2)
234
        ws['D8'].border = f_border
235
236
        ws['D9'].font = name_font
237
        ws['D9'].alignment = c_c_alignment
238
        ws['D9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
239
            if reporting_period_data['increment_rate'] is not None else "-"
240
        ws['D9'].border = f_border
241
242
        # TCO2E
243
        ws['E7'].fill = table_fill
244
        ws['E7'].font = name_font
245
        ws['E7'].alignment = c_c_alignment
246
        ws['E7'] = _('Ton of Carbon Dioxide Emissions') + '(TCO2E)'
247
        ws['E7'].border = f_border
248
249
        ws['E8'].font = name_font
250
        ws['E8'].alignment = c_c_alignment
251
        ws['E8'] = round(reporting_period_data['total_in_kgco2e'] / 1000, 2)
252
        ws['E8'].border = f_border
253
254
        ws['E9'].font = name_font
255
        ws['E9'].alignment = c_c_alignment
256
        ws['E9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
257
            if reporting_period_data['increment_rate'] is not None else "-"
258
        ws['E9'].border = f_border
259
260
    ####################################################################################################################
261
    # Second: Detailed Data
262
    # 11: title
263
    # 12 ~ 16: chart
264
    # 18: table title
265
    # 19~43: table_data
266
    ####################################################################################################################
267
    if "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
268
        for i in range(11, 43 + 1):
269
            ws.row_dimensions[i].height = 0.0
270
    else:
271
        reporting_period_data = report['reporting_period']
272
        parameters_names_len = len(report['parameters']['names'])
273
        parameters_parameters_datas_len = parameters_names_len
274
        start_detail_data_row_num = 13 + (parameters_parameters_datas_len + 1) * 6
275
        ws['B11'].font = title_font
276
        ws['B11'] = name + _('Detailed Data')
277
278
        ws.row_dimensions[start_detail_data_row_num].height = 60
279
280
        if not is_base_period_timestamp_exists_flag:
281
            ws['B' + str(start_detail_data_row_num)].fill = table_fill
282
            ws['B' + str(start_detail_data_row_num)].font = title_font
283
            ws['B' + str(start_detail_data_row_num)].border = f_border
284
            ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment
285
            ws['B' + str(start_detail_data_row_num)] = _('Datetime')
286
        else:
287
            ws['B' + str(start_detail_data_row_num)].fill = table_fill
288
            ws['B' + str(start_detail_data_row_num)].font = title_font
289
            ws['B' + str(start_detail_data_row_num)].border = f_border
290
            ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment
291
            ws['B' + str(start_detail_data_row_num)] = _('Base Period') + ' - ' + _('Datetime')
292
293
            ws['D' + str(start_detail_data_row_num)].fill = table_fill
294
            ws['D' + str(start_detail_data_row_num)].font = title_font
295
            ws['D' + str(start_detail_data_row_num)].border = f_border
296
            ws['D' + str(start_detail_data_row_num)].alignment = c_c_alignment
297
            ws['D' + str(start_detail_data_row_num)] = _('Reporting Period') + ' - ' + _('Datetime')
298
299
        has_data = False
300
        max_row = 0
301
        if len(reporting_period_data['timestamps']) > 0:
302
            has_data = True
303
            max_row = start_detail_data_row_num + len(reporting_period_data['timestamps'])
304
305
        if has_data:
306
            if not is_base_period_timestamp_exists_flag:
307
                for i in range(0, len(reporting_period_data['timestamps'])):
308
                    col = 'B'
309
                    row = str(start_detail_data_row_num + 1 + i)
310
                    # col = chr(ord('B') + i)
311
                    ws[col + row].font = title_font
312
                    ws[col + row].alignment = c_c_alignment
313
                    ws[col + row] = reporting_period_data['timestamps'][i]
314
                    ws[col + row].border = f_border
315
            else:
316
                for i in range(0, len(reporting_period_data['timestamps'])):
317
                    col = 'B'
318
                    row = str(start_detail_data_row_num + 1 + i)
319
                    # col = chr(ord('B') + i)
320
                    ws[col + row].font = title_font
321
                    ws[col + row].alignment = c_c_alignment
322
                    ws[col + row] = report['base_period']['timestamps'][i] \
323
                        if i < len(report['base_period']['timestamps']) else None
324
                    ws[col + row].border = f_border
325
326
                    col = 'D'
327
                    row = str(start_detail_data_row_num + 1 + i)
328
                    # col = chr(ord('B') + i)
329
                    ws[col + row].font = title_font
330
                    ws[col + row].alignment = c_c_alignment
331
                    ws[col + row] = reporting_period_data['timestamps'][i]
332
                    ws[col + row].border = f_border
333
334
            if not is_base_period_timestamp_exists_flag:
335
                ws['C' + str(start_detail_data_row_num)].fill = table_fill
336
                ws['C' + str(start_detail_data_row_num)].font = title_font
337
                ws['C' + str(start_detail_data_row_num)].alignment = c_c_alignment
338
                ws['C' + str(start_detail_data_row_num)] = report['meter']['energy_category_name'] + \
339
                    " (" + report['meter']['unit_of_measure'] + ")"
340
                ws['C' + str(start_detail_data_row_num)].border = f_border
341
            else:
342
                ws['C' + str(start_detail_data_row_num)].fill = table_fill
343
                ws['C' + str(start_detail_data_row_num)].font = title_font
344
                ws['C' + str(start_detail_data_row_num)].alignment = c_c_alignment
345
                ws['C' + str(start_detail_data_row_num)] = _('Base Period') + ' - ' + \
346
                    report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")"
347
                ws['C' + str(start_detail_data_row_num)].border = f_border
348
349
                ws['E' + str(start_detail_data_row_num)].fill = table_fill
350
                ws['E' + str(start_detail_data_row_num)].font = title_font
351
                ws['E' + str(start_detail_data_row_num)].alignment = c_c_alignment
352
                ws['E' + str(start_detail_data_row_num)] = _('Reporting Period') + ' - ' + \
353
                    report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")"
354
                ws['E' + str(start_detail_data_row_num)].border = f_border
355
356
            # 13 data
357
            if not is_base_period_timestamp_exists_flag:
358
                for j in range(0, len(reporting_period_data['timestamps'])):
359
                    row = str(start_detail_data_row_num + 1 + j)
360
                    ws['C' + row].font = title_font
361
                    ws['C' + row].alignment = c_c_alignment
362
                    ws['C' + row] = round(reporting_period_data['values'][j], 2)
363
                    ws['C' + row].border = f_border
364
                # line
365
                # 13~: line
366
                line = LineChart()
367
                line.title = _('Reporting Period Consumption') + ' - ' + report['meter']['energy_category_name'] + \
368
                    " (" + report['meter']['unit_of_measure'] + ")"
369
                labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num + 1, max_row=max_row)
370
                line_data = Reference(ws, min_col=3, min_row=start_detail_data_row_num, max_row=max_row)
371
                line.add_data(line_data, titles_from_data=True)
372
                line.set_categories(labels)
373
                line_data = line.series[0]
374
                line_data.marker.symbol = "circle"
375
                line_data.smooth = True
376
                line.x_axis.crosses = 'min'
377
                line.height = 8.25
378
                line.width = 24
379
                line.dLbls = DataLabelList()
380
                line.dLbls.dLblPos = 't'
381
                line.dLbls.showVal = True
382
                line.dLbls.showPercent = False
383
                ws.add_chart(line, "B12")
384
            else:
385
                for j in range(0, len(reporting_period_data['timestamps'])):
386
                    row = str(start_detail_data_row_num + 1 + j)
387
                    ws['C' + row].font = title_font
388
                    ws['C' + row].alignment = c_c_alignment
389
                    ws['C' + row] = round(report['base_period']['values'][j], 2) \
390
                        if j < len(report['base_period']['values']) else None
391
                    ws['C' + row].border = f_border
392
393
                    ws['E' + row].font = title_font
394
                    ws['E' + row].alignment = c_c_alignment
395
                    ws['E' + row] = round(reporting_period_data['values'][j], 2)
396
                    ws['E' + row].border = f_border
397
                # line
398
                # 13~: line
399
                line = LineChart()
400
                line.title = _('Reporting Period Consumption') + ' - ' + report['meter']['energy_category_name'] + \
401
                    " (" + report['meter']['unit_of_measure'] + ")"
402
                labels = Reference(ws, min_col=4, min_row=start_detail_data_row_num + 1, max_row=max_row)
403
                base_line_data = Reference(ws, min_col=3, min_row=start_detail_data_row_num, max_row=max_row)
404
                reporting_data = Reference(ws, min_col=5, min_row=start_detail_data_row_num, max_row=max_row)
405
                line.add_data(base_line_data, titles_from_data=True)
406
                line.add_data(reporting_data, titles_from_data=True)
407
                line.set_categories(labels)
408
                line_data = line.series[0]
409
                line_data.marker.symbol = "circle"
410
                line_data.smooth = True
411
                line.x_axis.crosses = 'min'
412
                line.height = 8.25
413
                line.width = 24
414
                line.dLbls = DataLabelList()
415
                line.dLbls.dLblPos = 't'
416
                line.dLbls.showVal = True
417
                line.dLbls.showPercent = False
418
                ws.add_chart(line, "B12")
419
420
            row = str(start_detail_data_row_num + 1 + len(reporting_period_data['timestamps']))
421
422
            if not is_base_period_timestamp_exists_flag:
423
                ws['B' + row].font = title_font
424
                ws['B' + row].alignment = c_c_alignment
425
                ws['B' + row] = _('Total')
426
                ws['B' + row].border = f_border
427
428
                ws['C' + row].font = title_font
429
                ws['C' + row].alignment = c_c_alignment
430
                ws['C' + row] = round(reporting_period_data['total_in_category'], 2)
431
                ws['C' + row].border = f_border
432
            else:
433
                ws['B' + row].font = title_font
434
                ws['B' + row].alignment = c_c_alignment
435
                ws['B' + row] = _('Total')
436
                ws['B' + row].border = f_border
437
438
                ws['C' + row].font = title_font
439
                ws['C' + row].alignment = c_c_alignment
440
                ws['C' + row] = round(report['base_period']['total_in_category'], 2)
441
                ws['C' + row].border = f_border
442
443
                ws['D' + row].font = title_font
444
                ws['D' + row].alignment = c_c_alignment
445
                ws['D' + row] = _('Total')
446
                ws['D' + row].border = f_border
447
448
                ws['E' + row].font = title_font
449
                ws['E' + row].alignment = c_c_alignment
450
                ws['E' + row] = round(reporting_period_data['total_in_category'], 2)
451
                ws['E' + row].border = f_border
452
453
    ##########################################
454
    # 12 is the starting line number of the last line chart in the report period
455
    current_sheet_parameters_row_number = 12 + 1 * 6
456 View Code Duplication
    if 'parameters' not in report.keys() or \
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
457
            report['parameters'] is None or \
458
            'names' not in report['parameters'].keys() or \
459
            report['parameters']['names'] is None or \
460
            len(report['parameters']['names']) == 0 or \
461
            'timestamps' not in report['parameters'].keys() or \
462
            report['parameters']['timestamps'] is None or \
463
            len(report['parameters']['timestamps']) == 0 or \
464
            'values' not in report['parameters'].keys() or \
465
            report['parameters']['values'] is None or \
466
            len(report['parameters']['values']) == 0 or \
467
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
468
        pass
469
    else:
470
        ################################################################################################################
471
        # new worksheet
472
        ################################################################################################################
473
474
        parameters_data = report['parameters']
475
476
        parameters_names_len = len(parameters_data['names'])
477
478
        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
479
        parameters_ws = wb.create_sheet(file_name + _('Parameters'))
480
481
        parameters_timestamps_data_max_len = \
482
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))
483
484
        # Row height
485
        parameters_ws.row_dimensions[1].height = 102
486
        for i in range(2, 7 + 1):
487
            parameters_ws.row_dimensions[i].height = 42
488
489
        for i in range(8, parameters_timestamps_data_max_len + 10):
490
            parameters_ws.row_dimensions[i].height = 60
491
492
        # Col width
493
        parameters_ws.column_dimensions['A'].width = 1.5
494
495
        parameters_ws.column_dimensions['B'].width = 25.0
496
497
        for i in range(3, 12 + parameters_names_len * 3):
498
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
499
500
        # Img
501
        img = Image("excelexporters/myems.png")
502
        parameters_ws.add_image(img, 'A1')
503
504
        # Title
505
        parameters_ws['B3'].alignment = b_r_alignment
506
        parameters_ws['B3'] = _('Name') + ':'
507
        parameters_ws['C3'].border = b_border
508
        parameters_ws['C3'].alignment = b_c_alignment
509
        parameters_ws['C3'] = name
510
511
        parameters_ws['D3'].alignment = b_r_alignment
512
        parameters_ws['D3'] = _('Period Type') + ':'
513
        parameters_ws['E3'].border = b_border
514
        parameters_ws['E3'].alignment = b_c_alignment
515
        parameters_ws['E3'] = period_type
516
517
        parameters_ws['B4'].alignment = b_r_alignment
518
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
519
        parameters_ws['C4'].border = b_border
520
        parameters_ws['C4'].alignment = b_c_alignment
521
        parameters_ws['C4'] = reporting_start_datetime_local
522
523
        parameters_ws['D4'].alignment = b_r_alignment
524
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
525
        parameters_ws['E4'].border = b_border
526
        parameters_ws['E4'].alignment = b_c_alignment
527
        parameters_ws['E4'] = reporting_end_datetime_local
528
529
        parameters_ws_current_row_number = 6
530
531
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
532
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + _('Parameters')
533
534
        parameters_ws_current_row_number += 1
535
536
        parameters_table_start_row_number = parameters_ws_current_row_number
537
538
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
539
540
        parameters_ws_current_row_number += 1
541
542
        table_current_col_number = 2
543
544
        for i in range(0, parameters_names_len):
545
            col = format_cell.get_column_letter(table_current_col_number)
546
547
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
548
            col = format_cell.get_column_letter(table_current_col_number + 1)
549
550
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
551
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
552
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
553
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]
554
555
            table_current_col_number = table_current_col_number + 3
556
557
        ################################################################################################################
558
        # Optimized insert parameter data
559
        ################################################################################################################
560
561
        timestamps_list = parameters_data['timestamps']
562
        values_list = parameters_data['values']
563
564
        timestamps_data_temp_save_start_row = parameters_timestamps_data_max_len + 10
565
566
        values_data_temp_save_start_row = parameters_timestamps_data_max_len * 2 + 10 + 1
567
568
        parameters_ws["A" + str(timestamps_data_temp_save_start_row)] = ""
569
        for i in range(parameters_timestamps_data_max_len):
570
            temp_list = []
571
            for j in range(len(timestamps_list)):
572
                try:
573
                    temp_list.append(timestamps_list[j][i])
574
                except IndexError:
575
                    temp_list.append("")
576
            parameters_ws.append(temp_list)
577
578
        parameters_ws["A" + str(values_data_temp_save_start_row)] = ""
579
        for i in range(parameters_timestamps_data_max_len):
580
            temp_list = []
581
            for j in range(len(values_list)):
582
                try:
583
                    temp_list.append(values_list[j][i])
584
                except IndexError:
585
                    temp_list.append("")
586
            parameters_ws.append(temp_list)
587
588
        parameter_current_col_number = 1
589
590
        for i in range(len(timestamps_list)):
591
            col = format_cell.get_column_letter(parameter_current_col_number)
592
            parameters_ws.move_range(
593
                "{}{}:{}{}".format(col, timestamps_data_temp_save_start_row + 1, col,
594
                                   timestamps_data_temp_save_start_row + parameters_timestamps_data_max_len),
595
                (- timestamps_data_temp_save_start_row + (parameters_ws_current_row_number - 1)), (i * 2) + 1)
596
            parameters_ws.move_range(
597
                "{}{}:{}{}".format(col, values_data_temp_save_start_row + 1, col,
598
                                   values_data_temp_save_start_row + parameters_timestamps_data_max_len),
599
                (- values_data_temp_save_start_row + (parameters_ws_current_row_number - 1)), (i * 2) + 2)
600
601
            parameter_current_col_number += 1
602
603
        ################################################################################################################
604
        # parameters chart and parameters table
605
        ################################################################################################################
606
607
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
608
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + _('Parameters')
609
610
        current_sheet_parameters_row_number += 1
611
612
        chart_start_row_number = current_sheet_parameters_row_number
613
614
        col_index = 0
615
616
        for i in range(0, parameters_names_len):
617
            line = LineChart()
618
            data_col = 3 + col_index * 3
619
            labels_col = 2 + col_index * 3
620
            col_index += 1
621
            line.title = _('Parameters') + ' - ' + \
622
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
623
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
624
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
625
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
626
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
627
            line.add_data(line_data, titles_from_data=True)
628
            line.set_categories(labels)
629
            line_data = line.series[0]
630
            line_data.marker.symbol = "circle"
631
            line_data.smooth = True
632
            line.x_axis.crosses = 'min'
633
            line.height = 8.25
634
            line.width = 24
635
            line.dLbls = DataLabelList()
636
            line.dLbls.dLblPos = 't'
637
            line.dLbls.showVal = False
638
            line.dLbls.showPercent = False
639
            chart_col = 'B'
640
            chart_cell = chart_col + str(chart_start_row_number)
641
            chart_start_row_number += 6
642
            ws.add_chart(line, chart_cell)
643
644
        current_sheet_parameters_row_number = chart_start_row_number
645
646
        current_sheet_parameters_row_number += 1
647
648
    filename = str(uuid.uuid4()) + '.xlsx'
649
    wb.save(filename)
650
651
    return filename
652
653
654
def timestamps_data_all_equal_0(lists):
655
    for i, value in enumerate(list(lists)):
656
        if len(value) > 0:
657
            return False
658
659
    return True
660
661
662
def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists):
663
    max_len = 0
664
    for i, value in enumerate(list(parameters_timestamps_lists)):
665
        if len(value) > max_len:
666
            max_len = len(value)
667
668
    return max_len
669
670
671
def timestamps_data_not_equal_0(lists):
672
    number = 0
673
    for i, value in enumerate(list(lists)):
674
        if len(value) > 0:
675
            number += 1
676
    return number
677
678
679 View Code Duplication
def is_base_period_timestamp_exists(base_period_data):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
680
    timestamps = base_period_data['timestamps']
681
682
    if len(timestamps) == 0:
683
        return False
684
685
    for timestamp in timestamps:
686
        if len(timestamp) > 0:
687
            return True
688
689
    return False
690