Passed
Push — master ( 4d6f13...ccf8db )
by
unknown
11:59
created

excelexporters.equipmentcomparison.export()   B

Complexity

Conditions 5

Size

Total Lines 49
Code Lines 33

Duplication

Lines 49
Ratio 100 %

Importance

Changes 0
Metric Value
eloc 33
dl 49
loc 49
rs 8.6213
c 0
b 0
f 0
cc 5
nop 8

How to fix   Many Parameters   

Many Parameters

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

There are several approaches to avoid long parameter lists:

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