Code Duplication    Length = 671-671 lines in 2 locations

myems-api/excelexporters/virtualmetercomparison.py 1 location

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

myems-api/excelexporters/metercomparison.py 1 location

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