excelexporters.virtualmetercomparison   F
last analyzed

Complexity

Total Complexity 81

Size/Duplication

Total Lines 776
Duplicated Lines 91.24 %

Importance

Changes 0
Metric Value
wmc 81
eloc 534
dl 708
loc 776
rs 2
c 0
b 0
f 0

5 Functions

Rating   Name   Duplication   Size   Complexity  
B export() 37 37 5
A get_parameters_timestamps_lists_max_len() 0 7 3
A timestamps_data_not_equal_0() 0 6 3
F generate_excel() 671 671 67
A timestamps_data_all_equal_0() 0 6 3

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like excelexporters.virtualmetercomparison often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

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_parameters_datas_len = 0
265
        start_detail_data_row_num = 15 + (parameters_parameters_datas_len + 1 + 1) * 6-4
266
        ws['B14'].font = title_font
267
        ws['B14'] = name1 + ' and ' + name2 + _('Detailed Data')
268
269
        ws.row_dimensions[start_detail_data_row_num].height = 60
270
271
        ws['B' + str(start_detail_data_row_num)].fill = table_fill
272
        ws['B' + str(start_detail_data_row_num)].font = title_font
273
        ws['B' + str(start_detail_data_row_num)].border = f_border
274
        ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment
275
        ws['B' + str(start_detail_data_row_num)] = _('Datetime')
276
        time = times
277
        has_data = False
278
        max_row = 0
279
        if len(time) > 0:
280
            has_data = True
281
            max_row = start_detail_data_row_num + len(time)
282
283
        if has_data:
284
            for i in range(0, len(time)):
285
                col = 'B'
286
                row = str(start_detail_data_row_num + 1 + i)
287
                # col = chr(ord('B') + i)
288
                ws[col + row].font = title_font
289
                ws[col + row].alignment = c_c_alignment
290
                ws[col + row] = time[i]
291
                ws[col + row].border = f_border
292
293
            # table_title
294
            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 284 is not entered. Are you sure this can never be the case?
Loading history...
295
296
            ws[col + str(start_detail_data_row_num)].fill = table_fill
297
            ws[col + str(start_detail_data_row_num)].font = title_font
298
            ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
299
            ws[col + str(start_detail_data_row_num)] = name1 + report['virtualmeter1']['energy_category_name'] + \
300
                " (" + report['virtualmeter1']['unit_of_measure'] + ")"
301
            ws[col + str(start_detail_data_row_num)].border = f_border
302
303
            # table_data
304
            time = times
305
            time_len = len(time)
306
307
            for j in range(0, time_len):
308
                row = str(start_detail_data_row_num + 1 + j)
309
                # col = chr(ord('B') + i)
310
                ws[col + row].font = title_font
311
                ws[col + row].alignment = c_c_alignment
312
                ws[col + row] = round2(reporting_period_data1['values'][j], 2)
313
                ws[col + row].border = f_border
314
315
            # table_title
316
            col = chr(ord(col) + 1)
317
318
            ws[col + str(start_detail_data_row_num)].fill = table_fill
319
            ws[col + str(start_detail_data_row_num)].font = title_font
320
            ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
321
            ws[col + str(start_detail_data_row_num)] = name2 + report['virtualmeter2']['energy_category_name'] + \
322
                " (" + report['virtualmeter2']['unit_of_measure'] + ")"
323
            ws[col + str(start_detail_data_row_num)].border = f_border
324
325
            # table_data
326
            time = times
327
            time_len = len(time)
328
329
            for j in range(0, time_len):
330
                row = str(start_detail_data_row_num + 1 + j)
331
                # col = chr(ord('B') + i)
332
                ws[col + row].font = title_font
333
                ws[col + row].alignment = c_c_alignment
334
                ws[col + row] = round2(reporting_period_data2['values'][j], 2)
335
                ws[col + row].border = f_border
336
337
            # table_title
338
            col = chr(ord(col) + 1)
339
340
            ws[col + str(start_detail_data_row_num)].fill = table_fill
341
            ws[col + str(start_detail_data_row_num)].font = title_font
342
            ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
343
            ws[col + str(start_detail_data_row_num)] = _('Difference')
344
            ws[col + str(start_detail_data_row_num)].border = f_border
345
346
            # table_data
347
            time = times
348
            time_len = len(time)
349
350
            for j in range(0, time_len):
351
                row = str(start_detail_data_row_num + 1 + j)
352
                # col = chr(ord('B') + i)
353
                ws[col + row].font = title_font
354
                ws[col + row].alignment = c_c_alignment
355
                ws[col + row] = round2(diff_data['values'][j], 2)
356
                ws[col + row].border = f_border
357
            # line
358
            # 15~: line
359
            line = LineChart()
360
            line.title = _('Reporting Period Consumption')
361
            labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num + 1, max_row=max_row)
362
            line_data = Reference(ws, min_col=3, max_col=2 + 1 + 1,
363
                                  min_row=start_detail_data_row_num, max_row=max_row)
364
            line.add_data(line_data, titles_from_data=True)
365
            line.set_categories(labels)
366
            for j in range(0, len(line.series)):
367
                line.series[j].marker.symbol = "auto"
368
                line.series[j].smooth = True
369
            line.x_axis.crosses = 'min'
370
            line.height = 8.25
371
            line.width = 24
372
            ws.add_chart(line, "B15")
373
374
            col = 'B'
375
            row = str(start_detail_data_row_num + 1 + len(time))
376
377
            ws[col + row].font = title_font
378
            ws[col + row].alignment = c_c_alignment
379
            ws[col + row] = _('Total')
380
            ws[col + row].border = f_border
381
382
            col = chr(ord(col) + 1)
383
            ws[col + row].font = title_font
384
            ws[col + row].alignment = c_c_alignment
385
            ws[col + row] = round2(reporting_period_data1['total_in_category'], 2)
386
            ws[col + row].border = f_border
387
388
            col = chr(ord(col) + 1)
389
            ws[col + row].font = title_font
390
            ws[col + row].alignment = c_c_alignment
391
            ws[col + row] = round2(reporting_period_data2['total_in_category'], 2)
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(diff_data['total_in_category'], 2)
398
            ws[col + row].border = f_border
399
400
    ####################################################################################################################
401
    has_parameters_names_and_timestamps_and_values_data = True
402
    # 12 is the starting line number of the last line chart in the report period
403
    current_sheet_parameters_row_number = 10 + (1 + 1) * 6
404
    if 'parameters1' not in report.keys() or \
405
            report['parameters1'] is None or \
406
            'names' not in report['parameters1'].keys() or \
407
            report['parameters1']['names'] is None or \
408
            len(report['parameters1']['names']) == 0 or \
409
            'timestamps' not in report['parameters1'].keys() or \
410
            report['parameters1']['timestamps'] is None or \
411
            len(report['parameters1']['timestamps']) == 0 or \
412
            'values' not in report['parameters1'].keys() or \
413
            report['parameters1']['values'] is None or \
414
            len(report['parameters1']['values']) == 0 or \
415
            timestamps_data_all_equal_0(report['parameters1']['timestamps']):
416
        has_parameters_names_and_timestamps_and_values_data = False
417
418
    if 'parameters2' not in report.keys() or \
419
            report['parameters2'] is None or \
420
            'names' not in report['parameters2'].keys() or \
421
            report['parameters2']['names'] is None or \
422
            len(report['parameters2']['names']) == 0 or \
423
            'timestamps' not in report['parameters2'].keys() or \
424
            report['parameters2']['timestamps'] is None or \
425
            len(report['parameters2']['timestamps']) == 0 or \
426
            'values' not in report['parameters2'].keys() or \
427
            report['parameters2']['values'] is None or \
428
            len(report['parameters2']['values']) == 0 or \
429
            timestamps_data_all_equal_0(report['parameters2']['timestamps']):
430
        has_parameters_names_and_timestamps_and_values_data = False
431
432
    if has_parameters_names_and_timestamps_and_values_data:
433
434
        parameters_data1 = report['parameters1']
435
436
        parameters_names_len = len(parameters_data1['names'])
437
438
        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
439
        parameters_ws = wb.create_sheet(file_name + 'Parameters1')
440
441
        parameters_timestamps_data_max_len = \
442
            get_parameters_timestamps_lists_max_len(list(parameters_data1['timestamps']))
443
444
        # Row height
445
        parameters_ws.row_dimensions[1].height = 102
446
        for i in range(2, 7 + 1):
447
            parameters_ws.row_dimensions[i].height = 42
448
449
        for i in range(8, parameters_timestamps_data_max_len + 10):
450
            parameters_ws.row_dimensions[i].height = 60
451
452
        # Col width
453
        parameters_ws.column_dimensions['A'].width = 1.5
454
455
        parameters_ws.column_dimensions['B'].width = 25.0
456
457
        for i in range(3, 12 + parameters_names_len * 3):
458
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
459
460
        # Img
461
        img = Image("excelexporters/myems.png")
462
        parameters_ws.add_image(img, 'A1')
463
464
        # Title
465
        parameters_ws['B3'].alignment = b_r_alignment
466
        parameters_ws['B3'] = _('Name') + ':'
467
        parameters_ws['C3'].border = b_border
468
        parameters_ws['C3'].alignment = b_c_alignment
469
        parameters_ws['C3'] = name1
470
471
        parameters_ws['D3'].alignment = b_r_alignment
472
        parameters_ws['D3'] = _('Period Type') + ':'
473
        parameters_ws['E3'].border = b_border
474
        parameters_ws['E3'].alignment = b_c_alignment
475
        parameters_ws['E3'] = period_type
476
477
        parameters_ws['B4'].alignment = b_r_alignment
478
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
479
        parameters_ws['C4'].border = b_border
480
        parameters_ws['C4'].alignment = b_c_alignment
481
        parameters_ws['C4'] = reporting_start_datetime_local
482
483
        parameters_ws['D4'].alignment = b_r_alignment
484
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
485
        parameters_ws['E4'].border = b_border
486
        parameters_ws['E4'].alignment = b_c_alignment
487
        parameters_ws['E4'] = reporting_end_datetime_local
488
489
        parameters_ws_current_row_number = 6
490
491
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
492
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name1 + ' ' + _('Parameters')
493
494
        parameters_ws_current_row_number += 1
495
496
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
497
498
        parameters_ws_current_row_number += 1
499
500
        table_current_col_number = 2
501
502
        for i in range(0, parameters_names_len):
503
504
            if len(parameters_data1['timestamps'][i]) == 0:
505
                continue
506
507
            col = format_cell.get_column_letter(table_current_col_number)
508
509
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
510
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
511
512
            col = format_cell.get_column_letter(table_current_col_number + 1)
513
514
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
515
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
516
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
517
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
518
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data1['names'][i]
519
520
            table_current_row_number = parameters_ws_current_row_number
521
522
            for j, value in enumerate(list(parameters_data1['timestamps'][i])):
523
                col = format_cell.get_column_letter(table_current_col_number)
524
525
                parameters_ws[col + str(table_current_row_number)].border = f_border
526
                parameters_ws[col + str(table_current_row_number)].font = title_font
527
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
528
                parameters_ws[col + str(table_current_row_number)] = value
529
530
                col = format_cell.get_column_letter(table_current_col_number + 1)
531
532
                parameters_ws[col + str(table_current_row_number)].border = f_border
533
                parameters_ws[col + str(table_current_row_number)].font = title_font
534
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
535
                try:
536
                    parameters_ws[col + str(table_current_row_number)] = round2(parameters_data1['values'][i][j], 2)
537
                except Exception as e:
538
                    print('error 1 in excelexporters\\virtualmetercomparison: ' + str(e))
539
540
                table_current_row_number += 1
541
542
            table_current_col_number = table_current_col_number + 3
543
544
        parameters_data2 = report['parameters2']
545
546
        parameters_names_len = len(parameters_data2['names'])
547
548
        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
549
        parameters_ws = wb.create_sheet(file_name + 'Parameters2')
550
551
        parameters_timestamps_data_max_len = \
552
            get_parameters_timestamps_lists_max_len(list(parameters_data2['timestamps']))
553
554
        # Row height
555
        parameters_ws.row_dimensions[1].height = 102
556
        for i in range(2, 7 + 1):
557
            parameters_ws.row_dimensions[i].height = 42
558
559
        for i in range(8, parameters_timestamps_data_max_len + 10):
560
            parameters_ws.row_dimensions[i].height = 60
561
562
        # Col width
563
        parameters_ws.column_dimensions['A'].width = 1.5
564
565
        parameters_ws.column_dimensions['B'].width = 25.0
566
567
        for i in range(3, 12 + parameters_names_len * 3):
568
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
569
570
        # Img
571
        img = Image("excelexporters/myems.png")
572
        parameters_ws.add_image(img, 'A1')
573
574
        # Title
575
        parameters_ws['B3'].alignment = b_r_alignment
576
        parameters_ws['B3'] = _('Name') + ':'
577
        parameters_ws['C3'].border = b_border
578
        parameters_ws['C3'].alignment = b_c_alignment
579
        parameters_ws['C3'] = name2
580
581
        parameters_ws['D3'].alignment = b_r_alignment
582
        parameters_ws['D3'] = _('Period Type') + ':'
583
        parameters_ws['E3'].border = b_border
584
        parameters_ws['E3'].alignment = b_c_alignment
585
        parameters_ws['E3'] = period_type
586
587
        parameters_ws['B4'].alignment = b_r_alignment
588
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
589
        parameters_ws['C4'].border = b_border
590
        parameters_ws['C4'].alignment = b_c_alignment
591
        parameters_ws['C4'] = reporting_start_datetime_local
592
593
        parameters_ws['D4'].alignment = b_r_alignment
594
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
595
        parameters_ws['E4'].border = b_border
596
        parameters_ws['E4'].alignment = b_c_alignment
597
        parameters_ws['E4'] = reporting_end_datetime_local
598
599
        parameters_ws_current_row_number = 6
600
601
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
602
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name2 + ' ' + _('Parameters')
603
604
        parameters_ws_current_row_number += 1
605
606
        parameters_table_start_row_number = parameters_ws_current_row_number
607
608
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
609
610
        parameters_ws_current_row_number += 1
611
612
        table_current_col_number = 2
613
614
        for i in range(0, parameters_names_len):
615
616
            if len(parameters_data2['timestamps'][i]) == 0:
617
                continue
618
619
            col = format_cell.get_column_letter(table_current_col_number)
620
621
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
622
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
623
624
            col = format_cell.get_column_letter(table_current_col_number + 1)
625
626
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
627
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
628
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
629
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
630
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data2['names'][i]
631
632
            table_current_row_number = parameters_ws_current_row_number
633
634
            for j, value in enumerate(list(parameters_data2['timestamps'][i])):
635
                col = format_cell.get_column_letter(table_current_col_number)
636
637
                parameters_ws[col + str(table_current_row_number)].border = f_border
638
                parameters_ws[col + str(table_current_row_number)].font = title_font
639
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
640
                parameters_ws[col + str(table_current_row_number)] = value
641
642
                col = format_cell.get_column_letter(table_current_col_number + 1)
643
644
                parameters_ws[col + str(table_current_row_number)].border = f_border
645
                parameters_ws[col + str(table_current_row_number)].font = title_font
646
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
647
                try:
648
                    parameters_ws[col + str(table_current_row_number)] = round2(parameters_data2['values'][i][j], 2)
649
                except Exception as e:
650
                    print('error 1 in excelexporters\\virtualmetercomparison: ' + str(e))
651
652
                table_current_row_number += 1
653
654
            table_current_col_number = table_current_col_number + 3
655
656
        ################################################################################################################
657
        # parameters chart and parameters table
658
        ################################################################################################################
659
660
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
661
        ws['B' + str(current_sheet_parameters_row_number)] = name1 + ' ' + _('Parameters')
662
        parameters_names_len = len(report['parameters1']['names'])
663
        parameters_ws = wb[file_name + 'Parameters1']
664
665
        current_sheet_parameters_row_number += 1
666
667
        chart_start_row_number = current_sheet_parameters_row_number
668
669
        col_index = 0
670
671
        for i in range(0, parameters_names_len):
672
673
            if len(parameters_data1['timestamps'][i]) == 0:
674
                continue
675
676
            line = LineChart()
677
            data_col = 3 + col_index * 3
678
            labels_col = 2 + col_index * 3
679
            col_index += 1
680
            line.title = _('Parameters') + ' - ' + \
681
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
682
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
683
                               max_row=(len(parameters_data1['timestamps'][i]) + parameters_table_start_row_number))
684
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
685
                                  max_row=(len(parameters_data1['timestamps'][i]) + parameters_table_start_row_number))
686
            line.add_data(line_data, titles_from_data=True)
687
            line.set_categories(labels)
688
            line_data = line.series[0]
689
            line_data.marker.symbol = "auto"
690
            line_data.smooth = True
691
            line.x_axis.crosses = 'min'
692
            line.height = 8.25
693
            line.width = 24
694
            chart_col = 'B'
695
            chart_cell = chart_col + str(chart_start_row_number)
696
            chart_start_row_number += 6
697
            ws.add_chart(line, chart_cell)
698
699
        current_sheet_parameters_row_number = chart_start_row_number
700
701
        current_sheet_parameters_row_number += 1
702
703
        parameters_ws = wb[file_name + 'Parameters2']
704
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
705
        ws['B' + str(current_sheet_parameters_row_number)] = name2 + ' ' + _('Parameters')
706
707
        current_sheet_parameters_row_number += 1
708
709
        chart_start_row_number = current_sheet_parameters_row_number
710
711
        col_index = 0
712
713
        parameters_names_len = len(report['parameters2']['names'])
714
715
        for i in range(0, parameters_names_len):
716
717
            if len(parameters_data2['timestamps'][i]) == 0:
718
                continue
719
            print(parameters_data1['timestamps'])
720
            line = LineChart()
721
            data_col = 3 + col_index * 3
722
            labels_col = 2 + col_index * 3
723
            col_index += 1
724
            line.title = _('Parameters') + ' - ' + \
725
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
726
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
727
                               max_row=(len(parameters_data2['timestamps'][i]) + parameters_table_start_row_number))
728
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
729
                                  max_row=(len(parameters_data2['timestamps'][i]) + parameters_table_start_row_number))
730
            line.add_data(line_data, titles_from_data=True)
731
            line.set_categories(labels)
732
            line_data = line.series[0]
733
            line_data.marker.symbol = "auto"
734
            line_data.smooth = True
735
            line.x_axis.crosses = 'min'
736
            line.height = 8.25
737
            line.width = 24
738
            chart_col = 'B'
739
            chart_cell = chart_col + str(chart_start_row_number)
740
            chart_start_row_number += 6
741
            ws.add_chart(line, chart_cell)
742
743
        current_sheet_parameters_row_number = chart_start_row_number
744
745
        current_sheet_parameters_row_number += 1
746
747
    filename = str(uuid.uuid4()) + '.xlsx'
748
    wb.save(filename)
749
750
    return filename
751
752
753
def timestamps_data_all_equal_0(lists):
754
    for i, value in enumerate(list(lists)):
755
        if len(value) > 0:
756
            return False
757
758
    return True
759
760
761
def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists):
762
    max_len = 0
763
    for i, value in enumerate(list(parameters_timestamps_lists)):
764
        if len(value) > max_len:
765
            max_len = len(value)
766
767
    return max_len
768
769
770
def timestamps_data_not_equal_0(lists):
771
    number = 0
772
    for i, value in enumerate(list(lists)):
773
        if len(value) > 0:
774
            number += 1
775
    return number