Code Duplication    Length = 852-852 lines in 5 locations

myems-api/excelexporters/storecomparison.py 1 location

@@ 71-922 (lines=852) @@
68
    return base64_message
69
70
71
def generate_excel(
72
    report,
73
    store1_name,
74
    store2_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 = "StoreComparison"
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"] = _("Store") + "1:"
148
    ws["C3"].border = b_border
149
    ws["C3"].alignment = b_c_alignment
150
    ws["C3"] = store1_name
151
152
    ws["D3"].alignment = b_r_alignment
153
    ws["D3"] = _("Store") + "2:"
154
    ws["E3"].border = b_border
155
    ws["E3"].alignment = b_c_alignment
156
    ws["E3"] = store2_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"
188
        wb.save(filename)
189
190
        return filename
191
    ####################################################################################################################
192
    # First: Consumption
193
    # 6: store1 title
194
    # 7: store1 table title
195
    # 8~9 store1 table_data
196
    # 10: store2 title
197
    # 11: store2 table title
198
    # 12~13: store2 table_data
199
    ####################################################################################################################
200
    if (
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"] = store1_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
    if (
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"] = store2_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"] = store1_name + " and " + store2_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)
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
                store1_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
                store2_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
    if (
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
    if (
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"] = _("Store") + "1:"
538
        parameters_ws["C3"].border = b_border
539
        parameters_ws["C3"].alignment = b_c_alignment
540
        parameters_ws["C3"] = store1_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
            store1_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\\storecomparison: " + 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"] = _("Store") + "2:"
679
        parameters_ws["C3"].border = b_border
680
        parameters_ws["C3"].alignment = b_c_alignment
681
        parameters_ws["C3"] = store2_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
            store2_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\\storecomparison: " + 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
            store1_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
            store2_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):

myems-api/excelexporters/shopfloorcomparison.py 1 location

@@ 71-922 (lines=852) @@
68
    return base64_message
69
70
71
def generate_excel(
72
    report,
73
    shopfloor1_name,
74
    shopfloor2_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 = "ShopfloorComparison"
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"] = _("Shopfloor") + "1:"
148
    ws["C3"].border = b_border
149
    ws["C3"].alignment = b_c_alignment
150
    ws["C3"] = shopfloor1_name
151
152
    ws["D3"].alignment = b_r_alignment
153
    ws["D3"] = _("Shopfloor") + "2:"
154
    ws["E3"].border = b_border
155
    ws["E3"].alignment = b_c_alignment
156
    ws["E3"] = shopfloor2_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"
188
        wb.save(filename)
189
190
        return filename
191
    ####################################################################################################################
192
    # First: Consumption
193
    # 6: shopfloor1 title
194
    # 7: shopfloor1 table title
195
    # 8~9 shopfloor1 table_data
196
    # 10: shopfloor2 title
197
    # 11: shopfloor2 table title
198
    # 12~13: shopfloor2 table_data
199
    ####################################################################################################################
200
    if (
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"] = shopfloor1_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
    if (
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"] = shopfloor2_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"] = shopfloor1_name + " and " + shopfloor2_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)
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
                shopfloor1_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
                shopfloor2_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
    if (
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
    if (
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"] = _("Shopfloor") + "1:"
538
        parameters_ws["C3"].border = b_border
539
        parameters_ws["C3"].alignment = b_c_alignment
540
        parameters_ws["C3"] = shopfloor1_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
            shopfloor1_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\\shopfloorcomparison: " + 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"] = _("Shopfloor") + "2:"
679
        parameters_ws["C3"].border = b_border
680
        parameters_ws["C3"].alignment = b_c_alignment
681
        parameters_ws["C3"] = shopfloor2_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
            shopfloor2_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\\shopfloorcomparison: " + 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
            shopfloor1_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
            shopfloor2_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):

myems-api/excelexporters/combinedequipmentcomparison.py 1 location

@@ 71-922 (lines=852) @@
68
    return base64_message
69
70
71
def generate_excel(
72
    report,
73
    combined_equipment1_name,
74
    combined_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 = "CombinedEquipmentComparison"
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"] = _("Combined Equipment") + "1:"
148
    ws["C3"].border = b_border
149
    ws["C3"].alignment = b_c_alignment
150
    ws["C3"] = combined_equipment1_name
151
152
    ws["D3"].alignment = b_r_alignment
153
    ws["D3"] = _("Combined Equipment") + "2:"
154
    ws["E3"].border = b_border
155
    ws["E3"].alignment = b_c_alignment
156
    ws["E3"] = combined_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"
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
    if (
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"] = combined_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
    if (
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"] = combined_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"] = combined_equipment1_name + " and " + combined_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)
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
                combined_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
                combined_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
    if (
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
    if (
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"] = _("Combined Equipment") + "1:"
538
        parameters_ws["C3"].border = b_border
539
        parameters_ws["C3"].alignment = b_c_alignment
540
        parameters_ws["C3"] = combined_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
            combined_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\\combinedequipmentcomparison: " + 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"] = _("Combined Equipment") + "2:"
679
        parameters_ws["C3"].border = b_border
680
        parameters_ws["C3"].alignment = b_c_alignment
681
        parameters_ws["C3"] = combined_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
            combined_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\\combinedequipmentcomparison: " + 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
            combined_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
            combined_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):

myems-api/excelexporters/tenantcomparison.py 1 location

@@ 71-922 (lines=852) @@
68
    return base64_message
69
70
71
def generate_excel(
72
    report,
73
    tenant1_name,
74
    tenant2_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 = "TenantComparison"
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"] = _("Tenant") + "1:"
148
    ws["C3"].border = b_border
149
    ws["C3"].alignment = b_c_alignment
150
    ws["C3"] = tenant1_name
151
152
    ws["D3"].alignment = b_r_alignment
153
    ws["D3"] = _("Tenant") + "2:"
154
    ws["E3"].border = b_border
155
    ws["E3"].alignment = b_c_alignment
156
    ws["E3"] = tenant2_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"
188
        wb.save(filename)
189
190
        return filename
191
    ####################################################################################################################
192
    # First: Consumption
193
    # 6: tenant1 title
194
    # 7: tenant1 table title
195
    # 8~9 tenant1 table_data
196
    # 10: tenant2 title
197
    # 11: tenant2 table title
198
    # 12~13: tenant2 table_data
199
    ####################################################################################################################
200
    if (
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"] = tenant1_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
    if (
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"] = tenant2_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"] = tenant1_name + " and " + tenant2_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)
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
                tenant1_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
                tenant2_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
    if (
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
    if (
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"] = _("Tenant") + "1:"
538
        parameters_ws["C3"].border = b_border
539
        parameters_ws["C3"].alignment = b_c_alignment
540
        parameters_ws["C3"] = tenant1_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
            tenant1_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\\tenantcomparison: " + 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"] = _("Tenant") + "2:"
679
        parameters_ws["C3"].border = b_border
680
        parameters_ws["C3"].alignment = b_c_alignment
681
        parameters_ws["C3"] = tenant2_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
            tenant2_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\\tenantcomparison: " + 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
            tenant1_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
            tenant2_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):

myems-api/excelexporters/equipmentcomparison.py 1 location

@@ 71-922 (lines=852) @@
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"
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
    if (
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
    if (
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)
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
    if (
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
    if (
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):