Passed
Push — master ( d7d153...467911 )
by
unknown
12:37
created

excelexporters.virtualmetercomparison.export()   B

Complexity

Conditions 5

Size

Total Lines 37
Code Lines 23

Duplication

Lines 37
Ratio 100 %

Importance

Changes 0
Metric Value
eloc 23
dl 37
loc 37
rs 8.8613
c 0
b 0
f 0
cc 5
nop 7
1
"""
2
Virtual Meter Comparison Excel Exporter
3
4
This module provides functionality to export virtual meter comparison data to Excel format.
5
It generates comprehensive reports showing energy consumption comparison between
6
base period and reporting period for virtual meters.
7
8
Key Features:
9
- Virtual meter energy consumption comparison
10
- Base period vs reporting period analysis
11
- Detailed data with line charts
12
- Multi-language support
13
- Base64 encoding for file transmission
14
15
The exported Excel file includes:
16
- Virtual meter comparison summary
17
- Base period vs reporting period data
18
- Detailed time-series data with line charts
19
- Parameter data (if available)
20
"""
21
22
import base64
23
from core.utilities import get_translation
24
import os
25
import re
26
import uuid
27
import openpyxl.utils.cell as format_cell
28
from openpyxl import Workbook
29
from openpyxl.chart import LineChart, Reference
30
from openpyxl.drawing.image import Image
31
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
32
from core.utilities import round2
33
34
35
########################################################################################################################
36
# PROCEDURES
37
# Step 1: Validate the report data
38
# Step 2: Generate excel file from the report data
39
# Step 3: Encode the excel file to Base64
40
########################################################################################################################
41 View Code Duplication
def export(result, name1, name2, reporting_start_datetime_local, reporting_end_datetime_local, period_type, language):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
42
    ####################################################################################################################
43
    # Step 1: Validate the report data
44
    ####################################################################################################################
45
    if result is None:
46
        return None
47
48
    ####################################################################################################################
49
    # Step 2: Generate excel file from the report data
50
    ####################################################################################################################
51
    filename = generate_excel(result,
52
                              name1,
53
                              name2,
54
                              reporting_start_datetime_local,
55
                              reporting_end_datetime_local,
56
                              period_type,
57
                              language)
58
    ####################################################################################################################
59
    # Step 3: Encode the excel file to Base64
60
    ####################################################################################################################
61
    binary_file_data = b''
62
    try:
63
        with open(filename, 'rb') as binary_file:
64
            binary_file_data = binary_file.read()
65
    except IOError as ex:
66
        print(str(ex))
67
68
    # Base64 encode the bytes
69
    base64_encoded_data = base64.b64encode(binary_file_data)
70
    # get the Base64 encoded data using human-readable characters.
71
    base64_message = base64_encoded_data.decode('utf-8')
72
    # delete the file from server
73
    try:
74
        os.remove(filename)
75
    except NotImplementedError as ex:
76
        print(str(ex))
77
    return base64_message
78
79
80 View Code Duplication
def generate_excel(report, name1, name2, reporting_start_datetime_local, reporting_end_datetime_local, period_type,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
81
                   language):
82
    trans = get_translation(language)
83
    trans.install()
84
    _ = trans.gettext
85
86
    wb = Workbook()
87
    ws = wb.active
88
    ws.title = "VirtualMeterComparison"
89
    # Row height
90
    ws.row_dimensions[1].height = 102
91
    for i in range(2, 2000 + 1):
92
        ws.row_dimensions[i].height = 42
93
94
    # Col width
95
    ws.column_dimensions['A'].width = 1.5
96
97
    ws.column_dimensions['B'].width = 25.0
98
99
    for i in range(ord('C'), ord('L')):
100
        ws.column_dimensions[chr(i)].width = 15.0
101
102
    # Font
103
    name_font = Font(name='Arial', size=15, bold=True)
104
    title_font = Font(name='Arial', size=15, bold=True)
105
106
    table_fill = PatternFill(fill_type='solid', fgColor='90ee90')
107
    f_border = Border(left=Side(border_style='medium'),
108
                      right=Side(border_style='medium'),
109
                      bottom=Side(border_style='medium'),
110
                      top=Side(border_style='medium')
111
                      )
112
    b_border = Border(
113
        bottom=Side(border_style='medium'),
114
    )
115
116
    b_c_alignment = Alignment(vertical='bottom',
117
                              horizontal='center',
118
                              text_rotation=0,
119
                              wrap_text=True,
120
                              shrink_to_fit=False,
121
                              indent=0)
122
    c_c_alignment = Alignment(vertical='center',
123
                              horizontal='center',
124
                              text_rotation=0,
125
                              wrap_text=True,
126
                              shrink_to_fit=False,
127
                              indent=0)
128
    b_r_alignment = Alignment(vertical='bottom',
129
                              horizontal='right',
130
                              text_rotation=0,
131
                              wrap_text=True,
132
                              shrink_to_fit=False,
133
                              indent=0)
134
135
    # Img
136
    img = Image("excelexporters/myems.png")
137
    ws.add_image(img, 'A1')
138
139
    # Title
140
    ws['B3'].alignment = b_r_alignment
141
    ws['B3'] = _('Name') + '1:'
142
    ws['C3'].border = b_border
143
    ws['C3'].alignment = b_c_alignment
144
    ws['C3'] = name1
145
146
    ws['D3'].alignment = b_r_alignment
147
    ws['D3'] = _('Name') + '2:'
148
    ws['E3'].border = b_border
149
    ws['E3'].alignment = b_c_alignment
150
    ws['E3'] = name2
151
152
    ws['F3'].alignment = b_r_alignment
153
    ws['F3'] = _('Period Type') + ':'
154
    ws['G3'].border = b_border
155
    ws['G3'].alignment = b_c_alignment
156
    ws['G3'] = period_type
157
158
    ws['B4'].alignment = b_r_alignment
159
    ws['B4'] = _('Reporting Start Datetime') + ':'
160
    ws['C4'].border = b_border
161
    ws['C4'].alignment = b_c_alignment
162
    ws['C4'] = reporting_start_datetime_local
163
164
    ws['D4'].alignment = b_r_alignment
165
    ws['D4'] = _('Reporting End Datetime') + ':'
166
    ws['E4'].border = b_border
167
    ws['E4'].alignment = b_c_alignment
168
    ws['E4'] = reporting_end_datetime_local
169
170
    if "reporting_period1" not in report.keys() or \
171
            "values" not in report['reporting_period1'].keys() or len(report['reporting_period1']['values']) == 0:
172
        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...
173
        wb.save(filename)
174
175
        return filename
176
    ####################################################################################################################
177
    # First: Consumption
178
    # 6: virtualmeter1 title
179
    # 7: virtualmeter1 table title
180
    # 8~9 virtualmeter1 table_data
181
    # 10: virtualmeter2 title
182
    # 11: virtualmeter2 table title
183
    # 12~13: virtualmeter2 table_data
184
    ####################################################################################################################
185
    if "values" not in report['reporting_period1'].keys() or len(report['reporting_period1']['values']) == 0:
186
        for i in range(6, 9 + 1):
187
            ws.row_dimensions[i].height = 0.1
188
    else:
189
        reporting_period_data1 = report['reporting_period1']
190
191
        ws.row_dimensions[7].height = 60
192
        ws['B7'].font = title_font
193
        ws['B7'].alignment = c_c_alignment
194
        ws['B7'] = name1
195
        ws['B7'].fill = table_fill
196
        ws['B7'].border = f_border
197
198
        ws['B8'].font = title_font
199
        ws['B8'].alignment = c_c_alignment
200
        ws['B8'] = _('Consumption')
201
        ws['B8'].border = f_border
202
203
        ws['C7'].fill = table_fill
204
        ws['C7'].font = name_font
205
        ws['C7'].alignment = c_c_alignment
206
        ws['C7'] = report['virtualmeter1']['energy_category_name'] + " (" + report['virtualmeter1']['unit_of_measure'] + ")"
207
        ws['C7'].border = f_border
208
209
        ws['C8'].font = name_font
210
        ws['C8'].alignment = c_c_alignment
211
        ws['C8'] = round2(reporting_period_data1['total_in_category'], 2)
212
        ws['C8'].border = f_border
213
214
    if "values" not in report['reporting_period2'].keys() or len(report['reporting_period2']['values']) == 0:
215
        for i in range(11, 14 + 1):
216
            ws.row_dimensions[i].height = 0.1
217
    else:
218
        reporting_period_data2 = report['reporting_period2']
219
220
        ws.row_dimensions[12].height = 60
221
        ws['B11'].font = title_font
222
        ws['B11'].alignment = c_c_alignment
223
        ws['B11'].fill = table_fill
224
        ws['B11'].border = f_border
225
        ws['B11'] = name2
226
227
        ws['B12'].font = title_font
228
        ws['B12'].alignment = c_c_alignment
229
        ws['B12'] = _('Consumption')
230
        ws['B12'].border = f_border
231
232
        ws['C11'].fill = table_fill
233
        ws['C11'].font = name_font
234
        ws['C11'].alignment = c_c_alignment
235
        ws['C11'] = report['virtualmeter2']['energy_category_name'] + " (" + report['virtualmeter2']['unit_of_measure'] + ")"
236
        ws['C11'].border = f_border
237
238
        ws['C12'].font = name_font
239
        ws['C12'].alignment = c_c_alignment
240
        ws['C12'] = round2(reporting_period_data2['total_in_category'], 2)
241
        ws['C12'].border = f_border
242
243
    ####################################################################################################################
244
    # Second: Detailed Data
245
    # 15: title
246
    # 12 ~ 16: chart
247
    # 18 + 6 * parameterlen + : table title
248
    # 19 + 6 * parameterlen~18 + 6 * parameterlen + timestamps_len: table_data
249
    # parameter_len: len(report['parameters1']['names']) + len(report['parameters1']['names'])
250
    # timestamps_len: reporting_period_data1['timestamps']
251
    ####################################################################################################################
252
    times = report['reporting_period1']['timestamps']
253
254
    if "values" not in report['reporting_period1'].keys() or \
255
            len(report['reporting_period1']['values']) == 0 or \
256
            "values" not in report['reporting_period2'].keys() or \
257
            len(report['reporting_period2']['values']) == 0:
258
        for i in range(11, 43 + 1):
259
            ws.row_dimensions[i].height = 0.0
260
    else:
261
        reporting_period_data1 = report['reporting_period1']
262
        reporting_period_data2 = report['reporting_period2']
263
        diff_data = report['diff']
264
        parameters_names_len = len(report['parameters1']['names'])
265
        parameters_data = report['parameters1']
266
        parameters_parameters_datas_len = 0
267
        for i in range(0, parameters_names_len):
268
            if len(parameters_data['timestamps'][i]) == 0:
269
                continue
270
            parameters_parameters_datas_len += 1
271
        parameters_names_len = len(report['parameters2']['names'])
272
        parameters_data = report['parameters2']
273
        for i in range(0, parameters_names_len):
274
            if len(parameters_data['timestamps'][i]) == 0:
275
                continue
276
            parameters_parameters_datas_len += 1
277
        start_detail_data_row_num = 15 + (parameters_parameters_datas_len + 1 + 1) * 6
278
        ws['B14'].font = title_font
279
        ws['B14'] = name1 + ' and ' + name2 + _('Detailed Data')
280
281
        ws.row_dimensions[start_detail_data_row_num].height = 60
282
283
        ws['B' + str(start_detail_data_row_num)].fill = table_fill
284
        ws['B' + str(start_detail_data_row_num)].font = title_font
285
        ws['B' + str(start_detail_data_row_num)].border = f_border
286
        ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment
287
        ws['B' + str(start_detail_data_row_num)] = _('Datetime')
288
        time = times
289
        has_data = False
290
        max_row = 0
291
        if len(time) > 0:
292
            has_data = True
293
            max_row = start_detail_data_row_num + len(time)
294
295
        if has_data:
296
            for i in range(0, len(time)):
297
                col = 'B'
298
                row = str(start_detail_data_row_num + 1 + i)
299
                # col = chr(ord('B') + i)
300
                ws[col + row].font = title_font
301
                ws[col + row].alignment = c_c_alignment
302
                ws[col + row] = time[i]
303
                ws[col + row].border = f_border
304
305
            # table_title
306
            col = chr(ord(col) + 1)
0 ignored issues
show
introduced by
The variable col does not seem to be defined in case the for loop on line 296 is not entered. Are you sure this can never be the case?
Loading history...
307
308
            ws[col + str(start_detail_data_row_num)].fill = table_fill
309
            ws[col + str(start_detail_data_row_num)].font = title_font
310
            ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
311
            ws[col + str(start_detail_data_row_num)] = name1 + report['virtualmeter1']['energy_category_name'] + \
312
                " (" + report['virtualmeter1']['unit_of_measure'] + ")"
313
            ws[col + str(start_detail_data_row_num)].border = f_border
314
315
            # table_data
316
            time = times
317
            time_len = len(time)
318
319
            for j in range(0, time_len):
320
                row = str(start_detail_data_row_num + 1 + j)
321
                # col = chr(ord('B') + i)
322
                ws[col + row].font = title_font
323
                ws[col + row].alignment = c_c_alignment
324
                ws[col + row] = round2(reporting_period_data1['values'][j], 2)
325
                ws[col + row].border = f_border
326
327
            # table_title
328
            col = chr(ord(col) + 1)
329
330
            ws[col + str(start_detail_data_row_num)].fill = table_fill
331
            ws[col + str(start_detail_data_row_num)].font = title_font
332
            ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
333
            ws[col + str(start_detail_data_row_num)] = name2 + report['virtualmeter2']['energy_category_name'] + \
334
                " (" + report['virtualmeter2']['unit_of_measure'] + ")"
335
            ws[col + str(start_detail_data_row_num)].border = f_border
336
337
            # table_data
338
            time = times
339
            time_len = len(time)
340
341
            for j in range(0, time_len):
342
                row = str(start_detail_data_row_num + 1 + j)
343
                # col = chr(ord('B') + i)
344
                ws[col + row].font = title_font
345
                ws[col + row].alignment = c_c_alignment
346
                ws[col + row] = round2(reporting_period_data2['values'][j], 2)
347
                ws[col + row].border = f_border
348
349
            # table_title
350
            col = chr(ord(col) + 1)
351
352
            ws[col + str(start_detail_data_row_num)].fill = table_fill
353
            ws[col + str(start_detail_data_row_num)].font = title_font
354
            ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
355
            ws[col + str(start_detail_data_row_num)] = _('Difference')
356
            ws[col + str(start_detail_data_row_num)].border = f_border
357
358
            # table_data
359
            time = times
360
            time_len = len(time)
361
362
            for j in range(0, time_len):
363
                row = str(start_detail_data_row_num + 1 + j)
364
                # col = chr(ord('B') + i)
365
                ws[col + row].font = title_font
366
                ws[col + row].alignment = c_c_alignment
367
                ws[col + row] = round2(diff_data['values'][j], 2)
368
                ws[col + row].border = f_border
369
            # line
370
            # 15~: line
371
            line = LineChart()
372
            line.title = _('Reporting Period Consumption')
373
            labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num + 1, max_row=max_row)
374
            line_data = Reference(ws, min_col=3, max_col=2 + 1 + 1,
375
                                  min_row=start_detail_data_row_num, max_row=max_row)
376
            line.add_data(line_data, titles_from_data=True)
377
            line.set_categories(labels)
378
            for j in range(0, len(line.series)):
379
                line.series[j].marker.symbol = "auto"
380
                line.series[j].smooth = True
381
            line.x_axis.crosses = 'min'
382
            line.height = 8.25
383
            line.width = 24
384
            ws.add_chart(line, "B15")
385
386
            col = 'B'
387
            row = str(start_detail_data_row_num + 1 + len(time))
388
389
            ws[col + row].font = title_font
390
            ws[col + row].alignment = c_c_alignment
391
            ws[col + row] = _('Total')
392
            ws[col + row].border = f_border
393
394
            col = chr(ord(col) + 1)
395
            ws[col + row].font = title_font
396
            ws[col + row].alignment = c_c_alignment
397
            ws[col + row] = round2(reporting_period_data1['total_in_category'], 2)
398
            ws[col + row].border = f_border
399
400
            col = chr(ord(col) + 1)
401
            ws[col + row].font = title_font
402
            ws[col + row].alignment = c_c_alignment
403
            ws[col + row] = round2(reporting_period_data2['total_in_category'], 2)
404
            ws[col + row].border = f_border
405
406
            col = chr(ord(col) + 1)
407
            ws[col + row].font = title_font
408
            ws[col + row].alignment = c_c_alignment
409
            ws[col + row] = round2(diff_data['total_in_category'], 2)
410
            ws[col + row].border = f_border
411
412
    ####################################################################################################################
413
    has_parameters_names_and_timestamps_and_values_data = True
414
    # 12 is the starting line number of the last line chart in the report period
415
    current_sheet_parameters_row_number = 10 + (1 + 1) * 6
416
    if 'parameters1' not in report.keys() or \
417
            report['parameters1'] is None or \
418
            'names' not in report['parameters1'].keys() or \
419
            report['parameters1']['names'] is None or \
420
            len(report['parameters1']['names']) == 0 or \
421
            'timestamps' not in report['parameters1'].keys() or \
422
            report['parameters1']['timestamps'] is None or \
423
            len(report['parameters1']['timestamps']) == 0 or \
424
            'values' not in report['parameters1'].keys() or \
425
            report['parameters1']['values'] is None or \
426
            len(report['parameters1']['values']) == 0 or \
427
            timestamps_data_all_equal_0(report['parameters1']['timestamps']):
428
        has_parameters_names_and_timestamps_and_values_data = False
429
430
    if 'parameters2' not in report.keys() or \
431
            report['parameters2'] is None or \
432
            'names' not in report['parameters2'].keys() or \
433
            report['parameters2']['names'] is None or \
434
            len(report['parameters2']['names']) == 0 or \
435
            'timestamps' not in report['parameters2'].keys() or \
436
            report['parameters2']['timestamps'] is None or \
437
            len(report['parameters2']['timestamps']) == 0 or \
438
            'values' not in report['parameters2'].keys() or \
439
            report['parameters2']['values'] is None or \
440
            len(report['parameters2']['values']) == 0 or \
441
            timestamps_data_all_equal_0(report['parameters2']['timestamps']):
442
        has_parameters_names_and_timestamps_and_values_data = False
443
444
    if has_parameters_names_and_timestamps_and_values_data:
445
446
        parameters_data1 = report['parameters1']
447
448
        parameters_names_len = len(parameters_data1['names'])
449
450
        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
451
        parameters_ws = wb.create_sheet(file_name + 'Parameters1')
452
453
        parameters_timestamps_data_max_len = \
454
            get_parameters_timestamps_lists_max_len(list(parameters_data1['timestamps']))
455
456
        # Row height
457
        parameters_ws.row_dimensions[1].height = 102
458
        for i in range(2, 7 + 1):
459
            parameters_ws.row_dimensions[i].height = 42
460
461
        for i in range(8, parameters_timestamps_data_max_len + 10):
462
            parameters_ws.row_dimensions[i].height = 60
463
464
        # Col width
465
        parameters_ws.column_dimensions['A'].width = 1.5
466
467
        parameters_ws.column_dimensions['B'].width = 25.0
468
469
        for i in range(3, 12 + parameters_names_len * 3):
470
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
471
472
        # Img
473
        img = Image("excelexporters/myems.png")
474
        parameters_ws.add_image(img, 'A1')
475
476
        # Title
477
        parameters_ws['B3'].alignment = b_r_alignment
478
        parameters_ws['B3'] = _('Name') + ':'
479
        parameters_ws['C3'].border = b_border
480
        parameters_ws['C3'].alignment = b_c_alignment
481
        parameters_ws['C3'] = name1
482
483
        parameters_ws['D3'].alignment = b_r_alignment
484
        parameters_ws['D3'] = _('Period Type') + ':'
485
        parameters_ws['E3'].border = b_border
486
        parameters_ws['E3'].alignment = b_c_alignment
487
        parameters_ws['E3'] = period_type
488
489
        parameters_ws['B4'].alignment = b_r_alignment
490
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
491
        parameters_ws['C4'].border = b_border
492
        parameters_ws['C4'].alignment = b_c_alignment
493
        parameters_ws['C4'] = reporting_start_datetime_local
494
495
        parameters_ws['D4'].alignment = b_r_alignment
496
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
497
        parameters_ws['E4'].border = b_border
498
        parameters_ws['E4'].alignment = b_c_alignment
499
        parameters_ws['E4'] = reporting_end_datetime_local
500
501
        parameters_ws_current_row_number = 6
502
503
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
504
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name1 + ' ' + _('Parameters')
505
506
        parameters_ws_current_row_number += 1
507
508
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
509
510
        parameters_ws_current_row_number += 1
511
512
        table_current_col_number = 2
513
514
        for i in range(0, parameters_names_len):
515
516
            if len(parameters_data1['timestamps'][i]) == 0:
517
                continue
518
519
            col = format_cell.get_column_letter(table_current_col_number)
520
521
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
522
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
523
524
            col = format_cell.get_column_letter(table_current_col_number + 1)
525
526
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
527
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
528
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
529
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
530
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data1['names'][i]
531
532
            table_current_row_number = parameters_ws_current_row_number
533
534
            for j, value in enumerate(list(parameters_data1['timestamps'][i])):
535
                col = format_cell.get_column_letter(table_current_col_number)
536
537
                parameters_ws[col + str(table_current_row_number)].border = f_border
538
                parameters_ws[col + str(table_current_row_number)].font = title_font
539
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
540
                parameters_ws[col + str(table_current_row_number)] = value
541
542
                col = format_cell.get_column_letter(table_current_col_number + 1)
543
544
                parameters_ws[col + str(table_current_row_number)].border = f_border
545
                parameters_ws[col + str(table_current_row_number)].font = title_font
546
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
547
                try:
548
                    parameters_ws[col + str(table_current_row_number)] = round2(parameters_data1['values'][i][j], 2)
549
                except Exception as e:
550
                    print('error 1 in excelexporters\\virtualmetercomparison: ' + str(e))
551
552
                table_current_row_number += 1
553
554
            table_current_col_number = table_current_col_number + 3
555
556
        parameters_data2 = report['parameters2']
557
558
        parameters_names_len = len(parameters_data2['names'])
559
560
        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
561
        parameters_ws = wb.create_sheet(file_name + 'Parameters2')
562
563
        parameters_timestamps_data_max_len = \
564
            get_parameters_timestamps_lists_max_len(list(parameters_data2['timestamps']))
565
566
        # Row height
567
        parameters_ws.row_dimensions[1].height = 102
568
        for i in range(2, 7 + 1):
569
            parameters_ws.row_dimensions[i].height = 42
570
571
        for i in range(8, parameters_timestamps_data_max_len + 10):
572
            parameters_ws.row_dimensions[i].height = 60
573
574
        # Col width
575
        parameters_ws.column_dimensions['A'].width = 1.5
576
577
        parameters_ws.column_dimensions['B'].width = 25.0
578
579
        for i in range(3, 12 + parameters_names_len * 3):
580
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
581
582
        # Img
583
        img = Image("excelexporters/myems.png")
584
        parameters_ws.add_image(img, 'A1')
585
586
        # Title
587
        parameters_ws['B3'].alignment = b_r_alignment
588
        parameters_ws['B3'] = _('Name') + ':'
589
        parameters_ws['C3'].border = b_border
590
        parameters_ws['C3'].alignment = b_c_alignment
591
        parameters_ws['C3'] = name2
592
593
        parameters_ws['D3'].alignment = b_r_alignment
594
        parameters_ws['D3'] = _('Period Type') + ':'
595
        parameters_ws['E3'].border = b_border
596
        parameters_ws['E3'].alignment = b_c_alignment
597
        parameters_ws['E3'] = period_type
598
599
        parameters_ws['B4'].alignment = b_r_alignment
600
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
601
        parameters_ws['C4'].border = b_border
602
        parameters_ws['C4'].alignment = b_c_alignment
603
        parameters_ws['C4'] = reporting_start_datetime_local
604
605
        parameters_ws['D4'].alignment = b_r_alignment
606
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
607
        parameters_ws['E4'].border = b_border
608
        parameters_ws['E4'].alignment = b_c_alignment
609
        parameters_ws['E4'] = reporting_end_datetime_local
610
611
        parameters_ws_current_row_number = 6
612
613
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
614
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name2 + ' ' + _('Parameters')
615
616
        parameters_ws_current_row_number += 1
617
618
        parameters_table_start_row_number = parameters_ws_current_row_number
619
620
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
621
622
        parameters_ws_current_row_number += 1
623
624
        table_current_col_number = 2
625
626
        for i in range(0, parameters_names_len):
627
628
            if len(parameters_data2['timestamps'][i]) == 0:
629
                continue
630
631
            col = format_cell.get_column_letter(table_current_col_number)
632
633
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
634
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
635
636
            col = format_cell.get_column_letter(table_current_col_number + 1)
637
638
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
639
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
640
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
641
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
642
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data2['names'][i]
643
644
            table_current_row_number = parameters_ws_current_row_number
645
646
            for j, value in enumerate(list(parameters_data2['timestamps'][i])):
647
                col = format_cell.get_column_letter(table_current_col_number)
648
649
                parameters_ws[col + str(table_current_row_number)].border = f_border
650
                parameters_ws[col + str(table_current_row_number)].font = title_font
651
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
652
                parameters_ws[col + str(table_current_row_number)] = value
653
654
                col = format_cell.get_column_letter(table_current_col_number + 1)
655
656
                parameters_ws[col + str(table_current_row_number)].border = f_border
657
                parameters_ws[col + str(table_current_row_number)].font = title_font
658
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
659
                try:
660
                    parameters_ws[col + str(table_current_row_number)] = round2(parameters_data2['values'][i][j], 2)
661
                except Exception as e:
662
                    print('error 1 in excelexporters\\virtualmetercomparison: ' + str(e))
663
664
                table_current_row_number += 1
665
666
            table_current_col_number = table_current_col_number + 3
667
668
        ################################################################################################################
669
        # parameters chart and parameters table
670
        ################################################################################################################
671
672
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
673
        ws['B' + str(current_sheet_parameters_row_number)] = name1 + ' ' + _('Parameters')
674
        parameters_names_len = len(report['parameters1']['names'])
675
        parameters_ws = wb[file_name + 'Parameters1']
676
677
        current_sheet_parameters_row_number += 1
678
679
        chart_start_row_number = current_sheet_parameters_row_number
680
681
        col_index = 0
682
683
        for i in range(0, parameters_names_len):
684
685
            if len(parameters_data1['timestamps'][i]) == 0:
686
                continue
687
688
            line = LineChart()
689
            data_col = 3 + col_index * 3
690
            labels_col = 2 + col_index * 3
691
            col_index += 1
692
            line.title = _('Parameters') + ' - ' + \
693
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
694
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
695
                               max_row=(len(parameters_data1['timestamps'][i]) + parameters_table_start_row_number))
696
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
697
                                  max_row=(len(parameters_data1['timestamps'][i]) + parameters_table_start_row_number))
698
            line.add_data(line_data, titles_from_data=True)
699
            line.set_categories(labels)
700
            line_data = line.series[0]
701
            line_data.marker.symbol = "auto"
702
            line_data.smooth = True
703
            line.x_axis.crosses = 'min'
704
            line.height = 8.25
705
            line.width = 24
706
            chart_col = 'B'
707
            chart_cell = chart_col + str(chart_start_row_number)
708
            chart_start_row_number += 6
709
            ws.add_chart(line, chart_cell)
710
711
        current_sheet_parameters_row_number = chart_start_row_number
712
713
        current_sheet_parameters_row_number += 1
714
715
        parameters_ws = wb[file_name + 'Parameters2']
716
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
717
        ws['B' + str(current_sheet_parameters_row_number)] = name2 + ' ' + _('Parameters')
718
719
        current_sheet_parameters_row_number += 1
720
721
        chart_start_row_number = current_sheet_parameters_row_number
722
723
        col_index = 0
724
725
        parameters_names_len = len(report['parameters2']['names'])
726
727
        for i in range(0, parameters_names_len):
728
729
            if len(parameters_data2['timestamps'][i]) == 0:
730
                continue
731
            print(parameters_data1['timestamps'])
732
            line = LineChart()
733
            data_col = 3 + col_index * 3
734
            labels_col = 2 + col_index * 3
735
            col_index += 1
736
            line.title = _('Parameters') + ' - ' + \
737
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
738
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
739
                               max_row=(len(parameters_data2['timestamps'][i]) + parameters_table_start_row_number))
740
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
741
                                  max_row=(len(parameters_data2['timestamps'][i]) + parameters_table_start_row_number))
742
            line.add_data(line_data, titles_from_data=True)
743
            line.set_categories(labels)
744
            line_data = line.series[0]
745
            line_data.marker.symbol = "auto"
746
            line_data.smooth = True
747
            line.x_axis.crosses = 'min'
748
            line.height = 8.25
749
            line.width = 24
750
            chart_col = 'B'
751
            chart_cell = chart_col + str(chart_start_row_number)
752
            chart_start_row_number += 6
753
            ws.add_chart(line, chart_cell)
754
755
        current_sheet_parameters_row_number = chart_start_row_number
756
757
        current_sheet_parameters_row_number += 1
758
759
    filename = str(uuid.uuid4()) + '.xlsx'
760
    wb.save(filename)
761
762
    return filename
763
764
765
def timestamps_data_all_equal_0(lists):
766
    for i, value in enumerate(list(lists)):
767
        if len(value) > 0:
768
            return False
769
770
    return True
771
772
773
def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists):
774
    max_len = 0
775
    for i, value in enumerate(list(parameters_timestamps_lists)):
776
        if len(value) > max_len:
777
            max_len = len(value)
778
779
    return max_len
780
781
782
def timestamps_data_not_equal_0(lists):
783
    number = 0
784
    for i, value in enumerate(list(lists)):
785
        if len(value) > 0:
786
            number += 1
787
    return number