Issues (1577)

myems-api/excelexporters/metercomparison.py (7 issues)

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