Passed
Push — master ( cb7407...efe87e )
by Guangyu
16:55 queued 12s
created

timestamps_data_not_equal_0()   A

Complexity

Conditions 3

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 3
nop 1
1
import base64
2
import uuid
3
import os
4
from openpyxl.chart import (
5
    PieChart,
6
    LineChart,
7
    BarChart,
8
    Reference,
9
)
10
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
11
from openpyxl.drawing.image import Image
12
from openpyxl import Workbook
13
from openpyxl.chart.label import DataLabelList
14
import openpyxl.utils.cell as format_cell
15
16
17
####################################################################################################################
18
# PROCEDURES
19
# Step 1: Validate the report data
20
# Step 2: Generate excel file
21
# Step 3: Encode the excel file bytes to Base64
22
####################################################################################################################
23
24
25 View Code Duplication
def export(report,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
26
           name,
27
           reporting_start_datetime_local,
28
           reporting_end_datetime_local,
29
           period_type):
30
    ####################################################################################################################
31
    # Step 1: Validate the report data
32
    ####################################################################################################################
33
    if report is None:
34
        return None
35
    print(report)
36
37
    ####################################################################################################################
38
    # Step 2: Generate excel file from the report data
39
    ####################################################################################################################
40
    filename = generate_excel(report,
41
                              name,
42
                              reporting_start_datetime_local,
43
                              reporting_end_datetime_local,
44
                              period_type)
45
    ####################################################################################################################
46
    # Step 3: Encode the excel file to Base64
47
    ####################################################################################################################
48
    try:
49
        with open(filename, 'rb') as binary_file:
50
            binary_file_data = binary_file.read()
51
    except IOError as ex:
52
        pass
53
54
    # Base64 encode the bytes
55
    base64_encoded_data = base64.b64encode(binary_file_data)
0 ignored issues
show
introduced by
The variable binary_file_data does not seem to be defined for all execution paths.
Loading history...
56
    # get the Base64 encoded data using human-readable characters.
57
    base64_message = base64_encoded_data.decode('utf-8')
58
    # delete the file from server
59
    try:
60
        os.remove(filename)
61
    except NotImplementedError as ex:
62
        pass
63
    return base64_message
64
65
66
def generate_excel(report,
67
                   name,
68
                   reporting_start_datetime_local,
69
                   reporting_end_datetime_local,
70
                   period_type):
71
    wb = Workbook()
72
    ws = wb.active
73
74
    # Row height
75
    ws.row_dimensions[1].height = 102
76
    for i in range(2, 2000 + 1):
77
        ws.row_dimensions[i].height = 42
78
79
    # Col width
80
    ws.column_dimensions['A'].width = 1.5
81
82
    ws.column_dimensions['B'].width = 25.0
83
84
    for i in range(ord('C'), ord('L')):
85
        ws.column_dimensions[chr(i)].width = 15.0
86
87
    # Font
88
    name_font = Font(name='Constantia', size=15, bold=True)
89
    title_font = Font(name='宋体', size=15, bold=True)
90
    data_font = Font(name='Franklin Gothic Book', size=11)
91
92
    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
93
    f_border = Border(left=Side(border_style='medium', color='00000000'),
94
                      right=Side(border_style='medium', color='00000000'),
95
                      bottom=Side(border_style='medium', color='00000000'),
96
                      top=Side(border_style='medium', color='00000000')
97
                      )
98
    b_border = Border(
99
        bottom=Side(border_style='medium', color='00000000'),
100
    )
101
102
    b_c_alignment = Alignment(vertical='bottom',
103
                              horizontal='center',
104
                              text_rotation=0,
105
                              wrap_text=True,
106
                              shrink_to_fit=False,
107
                              indent=0)
108
    c_c_alignment = Alignment(vertical='center',
109
                              horizontal='center',
110
                              text_rotation=0,
111
                              wrap_text=True,
112
                              shrink_to_fit=False,
113
                              indent=0)
114
    b_r_alignment = Alignment(vertical='bottom',
115
                              horizontal='right',
116
                              text_rotation=0,
117
                              wrap_text=True,
118
                              shrink_to_fit=False,
119
                              indent=0)
120
    c_r_alignment = Alignment(vertical='bottom',
121
                              horizontal='center',
122
                              text_rotation=0,
123
                              wrap_text=True,
124
                              shrink_to_fit=False,
125
                              indent=0)
126
127
    # Img
128
    img = Image("excelexporters/myems.png")
129
    img.width = img.width * 0.85
130
    img.height = img.height * 0.85
131
    # img = Image("myems.png")
132
    ws.add_image(img, 'B1')
133
134
    # Title
135
    ws.row_dimensions[3].height = 60
136
137
    ws['B3'].font = name_font
138
    ws['B3'].alignment = b_r_alignment
139
    ws['B3'] = 'Name:'
140
    ws['C3'].border = b_border
141
    ws['C3'].alignment = b_c_alignment
142
    ws['C3'].font = name_font
143
    ws['C3'] = name
144
145
    ws['D3'].font = name_font
146
    ws['D3'].alignment = b_r_alignment
147
    ws['D3'] = 'Period:'
148
    ws['E3'].border = b_border
149
    ws['E3'].alignment = b_c_alignment
150
    ws['E3'].font = name_font
151
    ws['E3'] = period_type
152
153
    ws['F3'].font = name_font
154
    ws['F3'].alignment = b_r_alignment
155
    ws['F3'] = 'Date:'
156
    ws['G3'].border = b_border
157
    ws['G3'].alignment = b_c_alignment
158
    ws['G3'].font = name_font
159
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
160
    ws.merge_cells("G3:H3")
161
162
    if "reporting_period" not in report.keys() or \
163
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
164
        filename = str(uuid.uuid4()) + '.xlsx'
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable str does not seem to be defined.
Loading history...
165
        wb.save(filename)
166
167
        return filename
168
169
    ##################################
170
171
    reporting_period_data = report['reporting_period']
172
173
    has_cost_data_flag = True
174
175
    if "names" not in reporting_period_data.keys() or \
176
            reporting_period_data['names'] is None or \
177
            len(reporting_period_data['names']) == 0:
178
        has_cost_data_flag = False
179
180 View Code Duplication
    if has_cost_data_flag:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
181
        ws['B6'].font = title_font
182
        ws['B6'] = name + ' 报告期成本'
183
184
        category = reporting_period_data['names']
185
        ca_len = len(category)
186
187
        ws.row_dimensions[7].height = 60
188
        ws['B7'].fill = table_fill
189
        ws['B7'].border = f_border
190
191
        ws['B8'].font = title_font
192
        ws['B8'].alignment = c_c_alignment
193
        ws['B8'] = '成本'
194
        ws['B8'].border = f_border
195
196
        ws['B9'].font = title_font
197
        ws['B9'].alignment = c_c_alignment
198
        ws['B9'] = '单位面积值'
199
        ws['B9'].border = f_border
200
201
        ws['B10'].font = title_font
202
        ws['B10'].alignment = c_c_alignment
203
        ws['B10'] = '环比'
204
        ws['B10'].border = f_border
205
206
        col = ''
207
208
        for i in range(0, ca_len):
209
            col = chr(ord('C') + i)
210
211
            ws[col + '7'].fill = table_fill
212
            ws[col + '7'].font = name_font
213
            ws[col + '7'].alignment = c_c_alignment
214
            ws[col + '7'] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
215
            ws[col + '7'].border = f_border
216
217
            ws[col + '8'].font = name_font
218
            ws[col + '8'].alignment = c_c_alignment
219
            ws[col + '8'] = round(reporting_period_data['subtotals'][i], 2)
220
            ws[col + '8'].border = f_border
221
222
            ws[col + '9'].font = name_font
223
            ws[col + '9'].alignment = c_c_alignment
224
            ws[col + '9'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2)
225
            ws[col + '9'].border = f_border
226
227
            ws[col + '10'].font = name_font
228
            ws[col + '10'].alignment = c_c_alignment
229
            ws[col + '10'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \
230
                if reporting_period_data['increment_rates'][i] is not None else "-"
231
            ws[col + '10'].border = f_border
232
233
        col = chr(ord(col) + 1)
234
235
        ws[col + '7'].fill = table_fill
236
        ws[col + '7'].font = name_font
237
        ws[col + '7'].alignment = c_c_alignment
238
        ws[col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")"
239
        ws[col + '7'].border = f_border
240
241
        ws[col + '8'].font = name_font
242
        ws[col + '8'].alignment = c_c_alignment
243
        ws[col + '8'] = round(reporting_period_data['total'], 2)
244
        ws[col + '8'].border = f_border
245
246
        ws[col + '9'].font = name_font
247
        ws[col + '9'].alignment = c_c_alignment
248
        ws[col + '9'] = round(reporting_period_data['total_per_unit_area'], 2)
249
        ws[col + '9'].border = f_border
250
251
        ws[col + '10'].font = name_font
252
        ws[col + '10'].alignment = c_c_alignment
253
        ws[col + '10'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \
254
            if reporting_period_data['total_increment_rate'] is not None else "-"
255
        ws[col + '10'].border = f_border
256
257
    else:
258
        for i in range(6, 10 + 1):
259
            ws.row_dimensions[i].height = 0.1
260
261
    ##############################
262
263
    has_ele_peak_flag = True
264
    if "toppeaks" not in reporting_period_data.keys() or \
265
            reporting_period_data['toppeaks'] is None or \
266
            len(reporting_period_data['toppeaks']) == 0:
267
        has_ele_peak_flag = False
268
269
    if has_ele_peak_flag:
270
        ws['B12'].font = title_font
271
        ws['B12'] = name + ' 分时用电成本'
272
273
        ws.row_dimensions[13].height = 60
274
        ws['B13'].fill = table_fill
275
        ws['B13'].font = name_font
276
        ws['B13'].alignment = c_c_alignment
277
        ws['B13'].border = f_border
278
279
        ws['C13'].fill = table_fill
280
        ws['C13'].font = name_font
281
        ws['C13'].alignment = c_c_alignment
282
        ws['C13'].border = f_border
283
        ws['C13'] = '分时用电成本'
284
285
        ws['B14'].font = title_font
286
        ws['B14'].alignment = c_c_alignment
287
        ws['B14'] = '尖'
288
        ws['B14'].border = f_border
289
290
        ws['C14'].font = title_font
291
        ws['C14'].alignment = c_c_alignment
292
        ws['C14'].border = f_border
293
        ws['C14'] = round(reporting_period_data['toppeaks'][0], 2)
294
295
        ws['B15'].font = title_font
296
        ws['B15'].alignment = c_c_alignment
297
        ws['B15'] = '峰'
298
        ws['B15'].border = f_border
299
300
        ws['C15'].font = title_font
301
        ws['C15'].alignment = c_c_alignment
302
        ws['C15'].border = f_border
303
        ws['C15'] = round(reporting_period_data['onpeaks'][0], 2)
304
305
        ws['B16'].font = title_font
306
        ws['B16'].alignment = c_c_alignment
307
        ws['B16'] = '平'
308
        ws['B16'].border = f_border
309
310
        ws['C16'].font = title_font
311
        ws['C16'].alignment = c_c_alignment
312
        ws['C16'].border = f_border
313
        ws['C16'] = round(reporting_period_data['midpeaks'][0], 2)
314
315
        ws['B17'].font = title_font
316
        ws['B17'].alignment = c_c_alignment
317
        ws['B17'] = '谷'
318
        ws['B17'].border = f_border
319
320
        ws['C17'].font = title_font
321
        ws['C17'].alignment = c_c_alignment
322
        ws['C17'].border = f_border
323
        ws['C17'] = round(reporting_period_data['offpeaks'][0], 2)
324
325
        pie = PieChart()
326
        pie.title = name + '分时用电成本'
327
        labels = Reference(ws, min_col=2, min_row=14, max_row=17)
328
        pie_data = Reference(ws, min_col=3, min_row=13, max_row=17)
329
        pie.add_data(pie_data, titles_from_data=True)
330
        pie.set_categories(labels)
331
        pie.height = 7.25
332
        pie.width = 9
333
        s1 = pie.series[0]
334
        s1.dLbls = DataLabelList()
335
        s1.dLbls.showCatName = False
336
        s1.dLbls.showVal = True
337
        s1.dLbls.showPercent = True
338
339
        ws.add_chart(pie, "D13")
340
341
    else:
342
        for i in range(12, 18 + 1):
343
            ws.row_dimensions[i].height = 0.1
344
345
    ##################################
346
347
    current_row_number = 19
348
349
    has_subtotals_data_flag = True
350
351
    if 'subtotals' not in reporting_period_data.keys() or \
352
            reporting_period_data['subtotals'] is None:
353
        has_subtotals_data_flag = False
354
355 View Code Duplication
    if has_subtotals_data_flag:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
356
        ws['B' + str(current_row_number)].font = title_font
357
        ws['B' + str(current_row_number)] = name + ' 成本占比'
358
359
        current_row_number += 1
360
        table_start_row_number = current_row_number
361
362
        ws['B' + str(current_row_number)].fill = table_fill
363
        ws['B' + str(current_row_number)].font = name_font
364
        ws['B' + str(current_row_number)].alignment = c_c_alignment
365
        ws['B' + str(current_row_number)].border = f_border
366
367
        ws['C' + str(current_row_number)].fill = table_fill
368
        ws['C' + str(current_row_number)].font = name_font
369
        ws['C' + str(current_row_number)].alignment = c_c_alignment
370
        ws['C' + str(current_row_number)].border = f_border
371
        ws['C' + str(current_row_number)] = '成本占比'
372
373
        current_row_number += 1
374
375
        category = reporting_period_data['names']
376
        ca_len = len(category)
377
378
        for i in range(0, ca_len):
379
            ws['B' + str(current_row_number)].font = title_font
380
            ws['B' + str(current_row_number)].alignment = c_c_alignment
381
            ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + \
382
                ' (' + reporting_period_data['units'][i] + ')'
383
            ws['B' + str(current_row_number)].border = f_border
384
385
            ws['C' + str(current_row_number)].font = title_font
386
            ws['C' + str(current_row_number)].alignment = c_c_alignment
387
            ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 3)
388
            ws['C' + str(current_row_number)].border = f_border
389
390
            current_row_number += 1
391
392
        table_end_row_number = current_row_number - 1
393
394
        pie = PieChart()
395
        pie.title = name + ' 成本占比'
396
        labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
397
        pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number)
398
        pie.add_data(pie_data, titles_from_data=True)
399
        pie.set_categories(labels)
400
        pie.height = 6.6
401
        pie.width = 9
402
        s1 = pie.series[0]
403
        s1.dLbls = DataLabelList()
404
        s1.dLbls.showCatName = False
405
        s1.dLbls.showVal = True
406
        s1.dLbls.showPercent = True
407
408
        ws.add_chart(pie, 'D' + str(table_start_row_number))
409
410
        if ca_len < 4:
411
            current_row_number = current_row_number - ca_len + 4
412
413
        current_row_number += 1
414
415
    #####################################
416
417
    reporting_period_data = report['reporting_period']
418
    times = reporting_period_data['timestamps']
419
    has_detail_data_flag = True
420
    ca_len = len(report['reporting_period']['names'])
421
    real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
422
    table_row = (current_row_number + 1) + ca_len * 6 + real_timestamps_len * 7
423
    current_end_row_number = (current_row_number + 1) + ca_len * 6 + len(times[0]) + 3 + real_timestamps_len * 7
424
    if "timestamps" not in reporting_period_data.keys() or \
425
            reporting_period_data['timestamps'] is None or \
426
            len(reporting_period_data['timestamps']) == 0:
427
        has_detail_data_flag = False
428
429
    if has_detail_data_flag:
430
        ws['B' + str(current_row_number)].font = title_font
431
        ws['B' + str(current_row_number)] = name + ' 详细数据'
432
433
        ws.row_dimensions[table_row].height = 60
434
        ws['B' + str(table_row)].fill = table_fill
435
        ws['B' + str(table_row)].font = title_font
436
        ws['B' + str(table_row)].border = f_border
437
        ws['B' + str(table_row)].alignment = c_c_alignment
438
        ws['B' + str(table_row)] = '日期时间'
439
        time = times[0]
440
        has_data = False
441
        max_row = 0
442
        if len(time) > 0:
443
            has_data = True
444
            max_row = table_row + len(time)
445
446
        if has_data:
447
            for i in range(0, len(time)):
448
                col = 'B'
449
                row = str(table_row + 1 + i)
450
                ws[col + row].font = title_font
451
                ws[col + row].alignment = c_c_alignment
452
                ws[col + row] = time[i]
453
                ws[col + row].border = f_border
454
455
            for i in range(0, ca_len):
456
457
                col = chr(ord('C') + i)
458
459
                ws[col + str(table_row)].fill = table_fill
460
                ws[col + str(table_row)].font = title_font
461
                ws[col + str(table_row)].alignment = c_c_alignment
462
                ws[col + str(table_row)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][
463
                    i] + ")"
464
                ws[col + str(table_row)].border = f_border
465
466
                # 39 data
467
                time = times[i]
468
                time_len = len(time)
469
470
                for j in range(0, time_len):
471
                    row = str(table_row + 1 + j)
472
                    ws[col + row].font = title_font
473
                    ws[col + row].alignment = c_c_alignment
474
                    ws[col + row] = round(reporting_period_data['values'][i][j], 2)
475
                    ws[col + row].border = f_border
476
477
                line = LineChart()
478
                line.title = \
479
                    '报告期成本 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
480
                labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row)
481
                line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row)
482
                line.add_data(line_data, titles_from_data=True)
483
                line.set_categories(labels)
484
                line_data = line.series[0]
485
                line_data.marker.symbol = "circle"
486
                line_data.smooth = True
487
                line.x_axis.crosses = 'min'
488
                line.height = 8.25
489
                line.width = 24
490
                line.dLbls = DataLabelList()
491
                line.dLbls.dLblPos = 't'
492
                line.dLbls.showVal = True
493
                line.dLbls.showPercent = False
494
                chart_col = 'B'
495
                chart_cell = chart_col + str(current_row_number + 1 + 6 * i)
496
                table_start_draw_flag = current_row_number
497
                ws.add_chart(line, chart_cell)
498
499
            row = str(max_row + 1)
500
501
            ws['B' + row].font = title_font
502
            ws['B' + row].alignment = c_c_alignment
503
            ws['B' + row] = '小计'
504
            ws['B' + row].border = f_border
505
506
            col = ''
507
508
            for i in range(0, ca_len):
509
                col = chr(ord('C') + i)
510
                row = str(max_row + 1)
511
                ws[col + row].font = title_font
512
                ws[col + row].alignment = c_c_alignment
513
                ws[col + row] = round(reporting_period_data['subtotals'][i], 2)
514
                ws[col + row].border = f_border
515
516
            col = chr(ord(col) + 1)
517
518
            ws[col + str(table_row)].fill = table_fill
519
            ws[col + str(table_row)].font = title_font
520
            ws[col + str(table_row)].alignment = c_c_alignment
521
            ws[col + str(table_row)] = '总计 (' + report['reporting_period']['total_unit'] + ')'
522
            ws[col + str(table_row)].border = f_border
523
524
            total_sum = 0
525
526
            for j in range(0, len(time)):
527
                row = str(table_row + 1 + j)
528
                ws[col + row].font = title_font
529
                ws[col + row].alignment = c_c_alignment
530
                every_day_sum = reporting_period_values_every_day_sum(reporting_period_data, j, ca_len)
531
                total_sum += every_day_sum
532
                ws[col + row] = round(every_day_sum, 2)
533
                ws[col + row].border = f_border
534
535
            row = str(table_row + 1 + len(time))
536
            ws[col + row].font = title_font
537
            ws[col + row].alignment = c_c_alignment
538
            ws[col + row] = round(total_sum, 2)
539
            ws[col + row].border = f_border
540
541
        current_row_number = current_end_row_number
542
543
    ########################################
544
545
    has_child_flag = True
546
547
    if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \
548
            len(report['child_space']["energy_category_names"]) == 0 \
549
            or 'child_space_names_array' not in report['child_space'].keys() \
550
            or report['child_space']['energy_category_names'] is None \
551
            or len(report['child_space']['child_space_names_array']) == 0 \
552
            or len(report['child_space']['child_space_names_array'][0]) == 0:
553
        has_child_flag = False
554
555 View Code Duplication
    if has_child_flag:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
556
        child = report['child_space']
557
558
        ws['B' + str(current_row_number)].font = title_font
559
        ws['B' + str(current_row_number)] = name + ' 子空间数据'
560
561
        current_row_number += 1
562
        table_start_row_number = current_row_number
563
564
        ws.row_dimensions[current_row_number].height = 60
565
        ws['B' + str(current_row_number)].fill = table_fill
566
        ws['B' + str(current_row_number)].font = name_font
567
        ws['B' + str(current_row_number)].alignment = c_c_alignment
568
        ws['B' + str(current_row_number)].border = f_border
569
        ws['B' + str(current_row_number)] = '子空间'
570
        ca_len = len(child['energy_category_names'])
571
572
        col = ''
573
574
        for i in range(0, ca_len):
575
            col = chr(ord('C') + i)
576
            ws[col + str(current_row_number)].fill = table_fill
577
            ws[col + str(current_row_number)].font = name_font
578
            ws[col + str(current_row_number)].alignment = c_c_alignment
579
            ws[col + str(current_row_number)].border = f_border
580
            ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')'
581
582
        col = chr(ord(col) + 1)
583
        ws[col + str(current_row_number)].fill = table_fill
584
        ws[col + str(current_row_number)].font = name_font
585
        ws[col + str(current_row_number)].alignment = c_c_alignment
586
        ws[col + str(current_row_number)].border = f_border
587
        ws[col + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')'
588
589
        space_len = len(child['child_space_names_array'][0])
590
591
        for i in range(0, space_len):
592
            current_row_number += 1
593
            row = str(current_row_number)
594
595
            ws['B' + row].font = title_font
596
            ws['B' + row].alignment = c_c_alignment
597
            ws['B' + row] = child['child_space_names_array'][0][i]
598
            ws['B' + row].border = f_border
599
600
            col = ''
601
            every_day_sum = 0
602
603
            for j in range(0, ca_len):
604
                col = chr(ord('C') + j)
605
                ws[col + row].font = name_font
606
                ws[col + row].alignment = c_c_alignment
607
                every_day_sum += child['subtotals_array'][j][i]
608
                ws[col + row] = round(child['subtotals_array'][j][i], 2)
609
                ws[col + row].border = f_border
610
611
            col = chr(ord(col) + 1)
612
            ws[col + row].font = name_font
613
            ws[col + row].alignment = c_c_alignment
614
            ws[col + row] = round(every_day_sum, 2)
615
            ws[col + row].border = f_border
616
617
        table_end_row_number = current_row_number
618
        current_row_number += 1
619
        chart_start_row_number = current_row_number
620
621
        # Pie
622
        for i in range(0, ca_len):
623
            pie = PieChart()
624
            labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
625
            pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number,
626
                                 max_row=table_end_row_number)
627
            pie.add_data(pie_data, titles_from_data=True)
628
            pie.set_categories(labels)
629
            pie.height = 6.6
630
            pie.width = 8
631
            pie.title = ws.cell(column=3 + i, row=table_start_row_number).value
632
            s1 = pie.series[0]
633
            s1.dLbls = DataLabelList()
634
            s1.dLbls.showCatName = False
635
            s1.dLbls.showVal = True
636
            s1.dLbls.showPercent = True
637
            chart_cell = ''
638
            if i % 2 == 0:
639
                chart_cell = 'B' + str(chart_start_row_number)
640
            else:
641
                chart_cell = 'E' + str(chart_start_row_number)
642
                chart_start_row_number += 5
643
            ws.add_chart(pie, chart_cell)
644
645
        current_row_number = chart_start_row_number
646
647
        if ca_len % 2 == 1:
648
            current_row_number += 5
649
650
        current_row_number += 1
651
    ##########################################
652
    current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 + 1
0 ignored issues
show
introduced by
The variable table_start_draw_flag does not seem to be defined for all execution paths.
Loading history...
653
    has_parameters_names_and_timestamps_and_values_data = True
654
    if 'parameters' not in report.keys() or \
655
            report['parameters'] is None or \
656
            'names' not in report['parameters'].keys() or \
657
            report['parameters']['names'] is None or \
658
            len(report['parameters']['names']) == 0 or \
659
            'timestamps' not in report['parameters'].keys() or \
660
            report['parameters']['timestamps'] is None or \
661
            len(report['parameters']['timestamps']) == 0 or \
662
            'values' not in report['parameters'].keys() or \
663
            report['parameters']['values'] is None or \
664
            len(report['parameters']['values']) == 0 or \
665
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
666
        has_parameters_names_and_timestamps_and_values_data = False
667
    if has_parameters_names_and_timestamps_and_values_data:
668
669
        ###############################
670
        # new worksheet
671
        ###############################
672
673
        parameters_data = report['parameters']
674
        parameters_names_len = len(parameters_data['names'])
675
676
        parameters_ws = wb.create_sheet('相关参数')
677
678
        parameters_timestamps_data_max_len = \
679
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))
680
681
        # Row height
682
        parameters_ws.row_dimensions[1].height = 102
683
        for i in range(2, 7 + 1):
684
            parameters_ws.row_dimensions[i].height = 42
685
686
        for i in range(8, parameters_timestamps_data_max_len + 10):
687
            parameters_ws.row_dimensions[i].height = 60
688
689
        # Col width
690
        parameters_ws.column_dimensions['A'].width = 1.5
691
692
        parameters_ws.column_dimensions['B'].width = 25.0
693
694
        for i in range(3, 12 + parameters_names_len * 3):
695
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
696
697
        # Img
698
        img = Image("excelexporters/myems.png")
699
        img.width = img.width * 0.85
700
        img.height = img.height * 0.85
701
        # img = Image("myems.png")
702
        parameters_ws.add_image(img, 'B1')
703
704
        # Title
705
        parameters_ws.row_dimensions[3].height = 60
706
707
        parameters_ws['B3'].font = name_font
708
        parameters_ws['B3'].alignment = b_r_alignment
709
        parameters_ws['B3'] = 'Name:'
710
        parameters_ws['C3'].border = b_border
711
        parameters_ws['C3'].alignment = b_c_alignment
712
        parameters_ws['C3'].font = name_font
713
        parameters_ws['C3'] = name
714
715
        parameters_ws['D3'].font = name_font
716
        parameters_ws['D3'].alignment = b_r_alignment
717
        parameters_ws['D3'] = 'Period:'
718
        parameters_ws['E3'].border = b_border
719
        parameters_ws['E3'].alignment = b_c_alignment
720
        parameters_ws['E3'].font = name_font
721
        parameters_ws['E3'] = period_type
722
723
        parameters_ws['F3'].font = name_font
724
        parameters_ws['F3'].alignment = b_r_alignment
725
        parameters_ws['F3'] = 'Date:'
726
        parameters_ws['G3'].border = b_border
727
        parameters_ws['G3'].alignment = b_c_alignment
728
        parameters_ws['G3'].font = name_font
729
        parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
730
        parameters_ws.merge_cells("G3:H3")
731
732
        parameters_ws_current_row_number = 6
733
734
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
735
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数'
736
737
        parameters_ws_current_row_number += 1
738
739
        parameters_table_start_row_number = parameters_ws_current_row_number
740
741
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
742
743
        parameters_ws_current_row_number += 1
744
745
        table_current_col_number = 'B'
746
747
        for i in range(0, parameters_names_len):
748
749
            if len(parameters_data['timestamps'][i]) == 0:
750
                continue
751
752
            parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill
753
            parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border
754
755
            col = chr(ord(table_current_col_number) + 1)
756
757
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
758
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
759
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
760
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
761
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]
762
763
            table_current_row_number = parameters_ws_current_row_number
764
765
            for j, value in enumerate(list(parameters_data['timestamps'][i])):
766
                col = table_current_col_number
767
768
                parameters_ws[col + str(table_current_row_number)].border = f_border
769
                parameters_ws[col + str(table_current_row_number)].font = title_font
770
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
771
                parameters_ws[col + str(table_current_row_number)] = value
772
773
                col = chr(ord(col) + 1)
774
775
                parameters_ws[col + str(table_current_row_number)].border = f_border
776
                parameters_ws[col + str(table_current_row_number)].font = title_font
777
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
778
                parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2)
779
780
                table_current_row_number += 1
781
782
            table_current_col_number = chr(ord(table_current_col_number) + 3)
783
784
        ########################################################
785
        # parameters chart and parameters table
786
        ########################################################
787
788
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
789
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'
790
791
        current_sheet_parameters_row_number += 1
792
793
        chart_start_row_number = current_sheet_parameters_row_number
794
795
        col_index = 0
796
797
        for i in range(0, parameters_names_len):
798
799
            if len(parameters_data['timestamps'][i]) == 0:
800
                continue
801
802
            line = LineChart()
803
            data_col = 3 + col_index * 3
804
            labels_col = 2 + col_index * 3
805
            col_index += 1
806
            line.title = '相关参数 - ' + \
807
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
808
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
809
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
810
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
811
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
812
            line.add_data(line_data, titles_from_data=True)
813
            line.set_categories(labels)
814
            line_data = line.series[0]
815
            line_data.marker.symbol = "circle"
816
            line_data.smooth = True
817
            line.x_axis.crosses = 'min'
818
            line.height = 8.25
819
            line.width = 24
820
            line.dLbls = DataLabelList()
821
            line.dLbls.dLblPos = 't'
822
            line.dLbls.showVal = False
823
            line.dLbls.showPercent = False
824
            chart_col = 'B'
825
            chart_cell = chart_col + str(chart_start_row_number)
826
            chart_start_row_number += 6
827
            ws.add_chart(line, chart_cell)
828
829
        current_sheet_parameters_row_number = chart_start_row_number
830
831
        current_sheet_parameters_row_number += 1
832
    ##########################################
833
    filename = str(uuid.uuid4()) + '.xlsx'
834
    wb.save(filename)
835
836
    return filename
837
838
839
def reporting_period_values_every_day_sum(reporting_period_data, every_day_index, ca_len):
840
    every_day_sum = 0
841
    for i in range(0, ca_len):
842
        every_day_sum += reporting_period_data['values'][i][every_day_index]
843
844
    return every_day_sum
845
846
847
def timestamps_data_all_equal_0(lists):
848
    for i, value in enumerate(list(lists)):
849
        if len(value) > 0:
850
            return False
851
852
    return True
853
854
855
def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists):
856
    max_len = 0
857
    for i, value in enumerate(list(parameters_timestamps_lists)):
858
        if len(value) > max_len:
859
            max_len = len(value)
860
861
    return max_len
862
863
864
def timestamps_data_not_equal_0(lists):
865
    number = 0
866
    for i, value in enumerate(list(lists)):
867
        if len(value) > 0:
868
            number += 1
869
    return number
870