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