@@ 67-734 (lines=668) @@ | ||
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 = "MeterPlan" |
|
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_saving" not in report['reporting_period'].keys() or \ |
|
176 | len(report['reporting_period']['values_saving']) == 0: |
|
177 | filename = str(uuid.uuid4()) + '.xlsx' |
|
178 | wb.save(filename) |
|
179 | ||
180 | return filename |
|
181 | #################################################################################################################### |
|
182 | # First: Plan |
|
183 | # 7: title |
|
184 | # 8: table title |
|
185 | # 9~10 table_data |
|
186 | #################################################################################################################### |
|
187 | if "values_saving" not in report['reporting_period'].keys() or \ |
|
188 | len(report['reporting_period']['values_saving']) == 0: |
|
189 | for i in range(7, 10 + 1): |
|
190 | ws.row_dimensions[i].height = 0.1 |
|
191 | else: |
|
192 | ws['B7'].font = title_font |
|
193 | ws['B7'] = name + ' ' + _('Plan') |
|
194 | ||
195 | reporting_period_data = report['reporting_period'] |
|
196 | ||
197 | ws.row_dimensions[8].height = 60 |
|
198 | ||
199 | ws['B8'].fill = table_fill |
|
200 | ws['B8'].border = f_border |
|
201 | ||
202 | ws['B9'].font = title_font |
|
203 | ws['B9'].alignment = c_c_alignment |
|
204 | ws['B9'] = _('Plan') |
|
205 | ws['B9'].border = f_border |
|
206 | ||
207 | ws['B10'].font = title_font |
|
208 | ws['B10'].alignment = c_c_alignment |
|
209 | ws['B10'] = _('Increment Rate') |
|
210 | ws['B10'].border = f_border |
|
211 | ||
212 | ws['C8'].fill = table_fill |
|
213 | ws['C8'].font = name_font |
|
214 | ws['C8'].alignment = c_c_alignment |
|
215 | ws['C8'] = report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")" |
|
216 | ws['C8'].border = f_border |
|
217 | ||
218 | ws['C9'].font = name_font |
|
219 | ws['C9'].alignment = c_c_alignment |
|
220 | ws['C9'] = round2(reporting_period_data['total_in_category_saving'], 2) |
|
221 | ws['C9'].border = f_border |
|
222 | ||
223 | ws['C10'].font = name_font |
|
224 | ws['C10'].alignment = c_c_alignment |
|
225 | ws['C10'] = str(round2(reporting_period_data['increment_rate_saving'] * 100, 2)) + "%" \ |
|
226 | if reporting_period_data['increment_rate_saving'] is not None else "-" |
|
227 | ws['C10'].border = f_border |
|
228 | ||
229 | # TCE |
|
230 | ws['D8'].fill = table_fill |
|
231 | ws['D8'].font = name_font |
|
232 | ws['D8'].alignment = c_c_alignment |
|
233 | ws['D8'] = _('Ton of Standard Coal') + '(TCE)' |
|
234 | ws['D8'].border = f_border |
|
235 | ||
236 | ws['D9'].font = name_font |
|
237 | ws['D9'].alignment = c_c_alignment |
|
238 | ws['D9'] = round2(reporting_period_data['total_in_kgce_saving'] / 1000, 2) |
|
239 | ws['D9'].border = f_border |
|
240 | ||
241 | ws['D10'].font = name_font |
|
242 | ws['D10'].alignment = c_c_alignment |
|
243 | ws['D10'] = str(round2(reporting_period_data['increment_rate_saving'] * 100, 2)) + "%" \ |
|
244 | if reporting_period_data['increment_rate_saving'] is not None else "-" |
|
245 | ws['D10'].border = f_border |
|
246 | ||
247 | # TCO2E |
|
248 | ws['E8'].fill = table_fill |
|
249 | ws['E8'].font = name_font |
|
250 | ws['E8'].alignment = c_c_alignment |
|
251 | ws['E8'] = _('Ton of Carbon Dioxide Emissions') + '(TCO2E)' + _('Decreased') |
|
252 | ws['E8'].border = f_border |
|
253 | ||
254 | ws['E9'].font = name_font |
|
255 | ws['E9'].alignment = c_c_alignment |
|
256 | ws['E9'] = round2(reporting_period_data['total_in_kgco2e_saving'] / 1000, 2) |
|
257 | ws['E9'].border = f_border |
|
258 | ||
259 | ws['E10'].font = name_font |
|
260 | ws['E10'].alignment = c_c_alignment |
|
261 | ws['E10'] = str(round2(reporting_period_data['increment_rate_saving'] * 100, 2)) + "%" \ |
|
262 | if reporting_period_data['increment_rate_saving'] is not None else "-" |
|
263 | ws['E10'].border = f_border |
|
264 | ||
265 | #################################################################################################################### |
|
266 | # Second: Detailed Data |
|
267 | # 12: title |
|
268 | # 13 ~ 18: chart |
|
269 | #################################################################################################################### |
|
270 | current_row_number = 12 |
|
271 | ||
272 | table_start_draw_flag = current_row_number + 1 |
|
273 | reporting_period_data = report['reporting_period'] |
|
274 | ||
275 | if "timestamps" not in reporting_period_data.keys() or \ |
|
276 | reporting_period_data['timestamps'] is None or \ |
|
277 | len(reporting_period_data['timestamps']) == 0: |
|
278 | pass |
|
279 | else: |
|
280 | if not is_base_period_timestamp_exists_flag: |
|
281 | reporting_period_data = report['reporting_period'] |
|
282 | time = reporting_period_data['timestamps'] |
|
283 | real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) |
|
284 | ws['B' + str(current_row_number)].font = title_font |
|
285 | ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data') |
|
286 | ||
287 | current_row_number += 1 |
|
288 | # 1: Stand for blank line 2: Stand for title |
|
289 | current_row_number += 1 * 6 + real_timestamps_len * 6 + 1 + 2 |
|
290 | table_start_row_number = current_row_number |
|
291 | ||
292 | has_data = False |
|
293 | ||
294 | if len(time) > 0: |
|
295 | has_data = True |
|
296 | ||
297 | if has_data: |
|
298 | ||
299 | ws.row_dimensions[current_row_number].height = 60 |
|
300 | current_col_number = 2 |
|
301 | col = format_cell.get_column_letter(current_col_number) |
|
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)].border = f_border |
|
305 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
306 | ws[col + str(current_row_number)] = _('Datetime') |
|
307 | ||
308 | current_col_number += 1 |
|
309 | col = format_cell.get_column_letter(current_col_number) |
|
310 | ||
311 | ws[col + str(current_row_number)].fill = table_fill |
|
312 | ws[col + str(current_row_number)].font = title_font |
|
313 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
314 | ws[col + str(current_row_number)] = report['meter']['energy_category_name'] + \ |
|
315 | " (" + report['meter']['unit_of_measure'] + ")" |
|
316 | ws[col + str(current_row_number)].border = f_border |
|
317 | ||
318 | current_row_number += 1 |
|
319 | ||
320 | for i in range(0, len(time)): |
|
321 | current_col_number = 2 |
|
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)] = time[i] |
|
327 | ws[col + str(current_row_number)].border = f_border |
|
328 | ||
329 | current_col_number += 1 |
|
330 | col = format_cell.get_column_letter(current_col_number) |
|
331 | ||
332 | ws[col + str(current_row_number)].font = title_font |
|
333 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
334 | ws[col + str(current_row_number)] = round2(reporting_period_data['values_saving'][i], 2) |
|
335 | ws[col + str(current_row_number)].border = f_border |
|
336 | ||
337 | current_row_number += 1 |
|
338 | ||
339 | table_end_row_number = current_row_number - 1 |
|
340 | ||
341 | current_col_number = 2 |
|
342 | col = format_cell.get_column_letter(current_col_number) |
|
343 | ||
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)] = _('Total') |
|
347 | ws[col + str(current_row_number)].border = f_border |
|
348 | ||
349 | current_col_number += 1 |
|
350 | col = format_cell.get_column_letter(current_col_number) |
|
351 | ws[col + str(current_row_number)].font = title_font |
|
352 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
353 | ws[col + str(current_row_number)] = round2(reporting_period_data['total_in_category_saving'], 2) |
|
354 | ws[col + str(current_row_number)].border = f_border |
|
355 | ||
356 | # line |
|
357 | line = LineChart() |
|
358 | line.title = _('Reporting Period Plan') + ' - ' \ |
|
359 | + report['meter']['energy_category_name'] + \ |
|
360 | " (" + report['meter']['unit_of_measure'] + ")" |
|
361 | labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) |
|
362 | line_data = Reference(ws, min_col=3, min_row=table_start_row_number, |
|
363 | max_row=table_end_row_number) |
|
364 | line.add_data(line_data, titles_from_data=True) |
|
365 | line.set_categories(labels) |
|
366 | line_data = line.series[0] |
|
367 | line_data.marker.symbol = "auto" |
|
368 | line_data.smooth = True |
|
369 | line.x_axis.crosses = 'min' |
|
370 | line.height = 8.25 |
|
371 | line.width = 24 |
|
372 | chart_col = 'B' |
|
373 | chart_cell = chart_col + str(table_start_draw_flag) |
|
374 | ws.add_chart(line, chart_cell) |
|
375 | ||
376 | current_row_number += 2 |
|
377 | else: |
|
378 | base_period_data = report['base_period'] |
|
379 | reporting_period_data = report['reporting_period'] |
|
380 | base_period_timestamps = base_period_data['timestamps'] |
|
381 | reporting_period_timestamps = reporting_period_data['timestamps'] |
|
382 | real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) |
|
383 | ws['B' + str(current_row_number)].font = title_font |
|
384 | ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data') |
|
385 | ||
386 | current_row_number += 1 |
|
387 | # 1: Stand for blank line 2: Stand for title |
|
388 | current_row_number += 1 * 6 + real_timestamps_len * 6 + 1 + 2 |
|
389 | table_start_row_number = current_row_number |
|
390 | ||
391 | has_data = False |
|
392 | ||
393 | if len(base_period_timestamps[0]) or len(reporting_period_timestamps[0]) > 0: |
|
394 | has_data = True |
|
395 | ||
396 | if has_data: |
|
397 | ws.row_dimensions[current_row_number].height = 60 |
|
398 | current_col_number = 2 |
|
399 | col = format_cell.get_column_letter(current_col_number) |
|
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)].border = f_border |
|
403 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
404 | ws[col + str(current_row_number)] = _('Base Period') + " - " + _('Datetime') |
|
405 | ||
406 | current_col_number += 1 |
|
407 | col = format_cell.get_column_letter(current_col_number) |
|
408 | ||
409 | ws[col + str(current_row_number)].fill = table_fill |
|
410 | ws[col + str(current_row_number)].font = title_font |
|
411 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
412 | ws[col + str(current_row_number)] = _('Base Period') + " - " + \ |
|
413 | report['meter']['energy_category_name'] + \ |
|
414 | " (" + report['meter']['unit_of_measure'] + ")" |
|
415 | ws[col + str(current_row_number)].border = f_border |
|
416 | ||
417 | current_col_number += 1 |
|
418 | col = format_cell.get_column_letter(current_col_number) |
|
419 | ||
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)].border = f_border |
|
423 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
424 | ws[col + str(current_row_number)] = _('Reporting Period') + " - " + _('Datetime') |
|
425 | ||
426 | current_col_number += 1 |
|
427 | col = format_cell.get_column_letter(current_col_number) |
|
428 | ws[col + str(current_row_number)].fill = table_fill |
|
429 | ws[col + str(current_row_number)].font = title_font |
|
430 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
431 | ws[col + str(current_row_number)] = _('Reporting Period') + " - " \ |
|
432 | + report['meter']['energy_category_name'] + \ |
|
433 | " (" + report['meter']['unit_of_measure'] + ")" |
|
434 | ws[col + str(current_row_number)].border = f_border |
|
435 | ||
436 | current_row_number += 1 |
|
437 | ||
438 | max_timestamps_len = len(base_period_timestamps) \ |
|
439 | if len(base_period_timestamps) >= len(reporting_period_timestamps) \ |
|
440 | else len(reporting_period_timestamps) |
|
441 | ||
442 | for i in range(0, max_timestamps_len): |
|
443 | current_col_number = 2 |
|
444 | col = format_cell.get_column_letter(current_col_number) |
|
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)] = base_period_timestamps[i] \ |
|
448 | if i < len(base_period_timestamps) 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)] = round2(base_period_data['values_saving'][i], 2) \ |
|
457 | if i < len(base_period_data['values_saving']) 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)] = reporting_period_timestamps[i] \ |
|
466 | if i < len(reporting_period_timestamps) else None |
|
467 | ws[col + str(current_row_number)].border = f_border |
|
468 | ||
469 | current_col_number += 1 |
|
470 | col = format_cell.get_column_letter(current_col_number) |
|
471 | ||
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)] = round2(reporting_period_data['values_saving'][i], 2) \ |
|
475 | if i < len(reporting_period_data['values_saving']) else None |
|
476 | ws[col + str(current_row_number)].border = f_border |
|
477 | ||
478 | current_row_number += 1 |
|
479 | ||
480 | current_col_number = 2 |
|
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)] = _('Total') |
|
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 | 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)] = round2(base_period_data['total_in_category_saving'], 2) |
|
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 | ||
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)] = _('Total') |
|
500 | ws[col + str(current_row_number)].border = f_border |
|
501 | ||
502 | current_col_number += 1 |
|
503 | col = format_cell.get_column_letter(current_col_number) |
|
504 | ws[col + str(current_row_number)].font = title_font |
|
505 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
506 | ws[col + str(current_row_number)] = round2(reporting_period_data['total_in_category_saving'], 2) |
|
507 | ws[col + str(current_row_number)].border = f_border |
|
508 | ||
509 | # line |
|
510 | line = LineChart() |
|
511 | line.title = _('Base Period Plan') + " / " \ |
|
512 | + _('Reporting Period Plan') + ' - ' \ |
|
513 | + report['meter']['energy_category_name'] + \ |
|
514 | " (" + report['meter']['unit_of_measure'] + ")" |
|
515 | labels = Reference(ws, min_col=4, |
|
516 | min_row=table_start_row_number + 1, |
|
517 | max_row=table_start_row_number + len(reporting_period_timestamps)) |
|
518 | base_line_data = Reference(ws, min_col=3, min_row=table_start_row_number, |
|
519 | max_row=table_start_row_number + len(reporting_period_timestamps)) |
|
520 | reporting_line_data = Reference(ws, min_col=5, |
|
521 | min_row=table_start_row_number, |
|
522 | max_row=table_start_row_number |
|
523 | + len(reporting_period_timestamps)) |
|
524 | line.add_data(base_line_data, titles_from_data=True) |
|
525 | line.add_data(reporting_line_data, titles_from_data=True) |
|
526 | line.set_categories(labels) |
|
527 | for j in range(len(line.series)): |
|
528 | line.series[j].marker.symbol = "auto" |
|
529 | line.series[j].smooth = True |
|
530 | line.x_axis.crosses = 'min' |
|
531 | line.height = 8.25 |
|
532 | line.width = 24 |
|
533 | chart_col = 'B' |
|
534 | chart_cell = chart_col + str(table_start_draw_flag) |
|
535 | ws.add_chart(line, chart_cell) |
|
536 | ||
537 | current_row_number += 2 |
|
538 | ||
539 | ########################################## |
|
540 | # table_start_draw_flag is the starting line number of the last line chart in the report period |
|
541 | current_sheet_parameters_row_number = table_start_draw_flag + 1 * 6 + 1 |
|
542 | if 'parameters' not in report.keys() or \ |
|
543 | report['parameters'] is None or \ |
|
544 | 'names' not in report['parameters'].keys() or \ |
|
545 | report['parameters']['names'] is None or \ |
|
546 | len(report['parameters']['names']) == 0 or \ |
|
547 | 'timestamps' not in report['parameters'].keys() or \ |
|
548 | report['parameters']['timestamps'] is None or \ |
|
549 | len(report['parameters']['timestamps']) == 0 or \ |
|
550 | 'values' not in report['parameters'].keys() or \ |
|
551 | report['parameters']['values'] is None or \ |
|
552 | len(report['parameters']['values']) == 0 or \ |
|
553 | timestamps_data_all_equal_0(report['parameters']['timestamps']): |
|
554 | pass |
|
555 | else: |
|
556 | ||
557 | ################################################################################################################ |
|
558 | # new worksheet |
|
559 | ################################################################################################################ |
|
560 | ||
561 | parameters_data = report['parameters'] |
|
562 | ||
563 | parameters_names_len = len(parameters_data['names']) |
|
564 | ||
565 | file_name = (re.sub(r'[^A-Z]', '', ws.title))+'_' |
|
566 | parameters_ws = wb.create_sheet(file_name + _('Parameters')) |
|
567 | ||
568 | parameters_timestamps_data_max_len = \ |
|
569 | get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) |
|
570 | ||
571 | # Row height |
|
572 | parameters_ws.row_dimensions[1].height = 102 |
|
573 | for i in range(2, 7 + 1): |
|
574 | parameters_ws.row_dimensions[i].height = 42 |
|
575 | ||
576 | for i in range(8, parameters_timestamps_data_max_len + 10): |
|
577 | parameters_ws.row_dimensions[i].height = 60 |
|
578 | ||
579 | # Col width |
|
580 | parameters_ws.column_dimensions['A'].width = 1.5 |
|
581 | ||
582 | parameters_ws.column_dimensions['B'].width = 25.0 |
|
583 | ||
584 | for i in range(3, 12 + parameters_names_len * 3): |
|
585 | parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 |
|
586 | ||
587 | # Img |
|
588 | img = Image("excelexporters/myems.png") |
|
589 | parameters_ws.add_image(img, 'A1') |
|
590 | ||
591 | # Title |
|
592 | parameters_ws['B3'].alignment = b_r_alignment |
|
593 | parameters_ws['B3'] = _('Name') + ':' |
|
594 | parameters_ws['C3'].border = b_border |
|
595 | parameters_ws['C3'].alignment = b_c_alignment |
|
596 | parameters_ws['C3'] = name |
|
597 | ||
598 | parameters_ws['D3'].alignment = b_r_alignment |
|
599 | parameters_ws['D3'] = _('Period Type') + ':' |
|
600 | parameters_ws['E3'].border = b_border |
|
601 | parameters_ws['E3'].alignment = b_c_alignment |
|
602 | parameters_ws['E3'] = period_type |
|
603 | ||
604 | parameters_ws['B4'].alignment = b_r_alignment |
|
605 | parameters_ws['B4'] = _('Reporting Start Datetime') + ':' |
|
606 | parameters_ws['C4'].border = b_border |
|
607 | parameters_ws['C4'].alignment = b_c_alignment |
|
608 | parameters_ws['C4'] = reporting_start_datetime_local |
|
609 | ||
610 | parameters_ws['D4'].alignment = b_r_alignment |
|
611 | parameters_ws['D4'] = _('Reporting End Datetime') + ':' |
|
612 | parameters_ws['E4'].border = b_border |
|
613 | parameters_ws['E4'].alignment = b_c_alignment |
|
614 | parameters_ws['E4'] = reporting_end_datetime_local |
|
615 | ||
616 | parameters_ws_current_row_number = 6 |
|
617 | ||
618 | parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font |
|
619 | parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + _('Parameters') |
|
620 | ||
621 | parameters_ws_current_row_number += 1 |
|
622 | ||
623 | parameters_table_start_row_number = parameters_ws_current_row_number |
|
624 | ||
625 | parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 |
|
626 | ||
627 | parameters_ws_current_row_number += 1 |
|
628 | ||
629 | table_current_col_number = 2 |
|
630 | ||
631 | for i in range(0, parameters_names_len): |
|
632 | col = format_cell.get_column_letter(table_current_col_number) |
|
633 | ||
634 | parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill |
|
635 | col = format_cell.get_column_letter(table_current_col_number + 1) |
|
636 | ||
637 | parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill |
|
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_col_number = table_current_col_number + 3 |
|
643 | ||
644 | ################################################################################################################ |
|
645 | # Optimized insert parameter data |
|
646 | ################################################################################################################ |
|
647 | ||
648 | timestamps_list = parameters_data['timestamps'] |
|
649 | values_list = parameters_data['values'] |
|
650 | ||
651 | timestamps_data_temp_save_start_row = parameters_timestamps_data_max_len + 10 |
|
652 | ||
653 | values_data_temp_save_start_row = parameters_timestamps_data_max_len * 2 + 10 + 1 |
|
654 | ||
655 | parameters_ws["A" + str(timestamps_data_temp_save_start_row)] = "" |
|
656 | for i in range(parameters_timestamps_data_max_len): |
|
657 | temp_list = [] |
|
658 | for j in range(len(timestamps_list)): |
|
659 | try: |
|
660 | temp_list.append(timestamps_list[j][i]) |
|
661 | except IndexError: |
|
662 | temp_list.append("") |
|
663 | parameters_ws.append(temp_list) |
|
664 | ||
665 | parameters_ws["A" + str(values_data_temp_save_start_row)] = "" |
|
666 | for i in range(parameters_timestamps_data_max_len): |
|
667 | temp_list = [] |
|
668 | for j in range(len(values_list)): |
|
669 | try: |
|
670 | temp_list.append(values_list[j][i]) |
|
671 | except IndexError: |
|
672 | temp_list.append("") |
|
673 | parameters_ws.append(temp_list) |
|
674 | ||
675 | parameter_current_col_number = 1 |
|
676 | ||
677 | for i in range(len(timestamps_list)): |
|
678 | col = format_cell.get_column_letter(parameter_current_col_number) |
|
679 | parameters_ws.move_range( |
|
680 | "{}{}:{}{}".format(col, timestamps_data_temp_save_start_row + 1, col, |
|
681 | timestamps_data_temp_save_start_row + parameters_timestamps_data_max_len), |
|
682 | (- timestamps_data_temp_save_start_row + (parameters_ws_current_row_number - 1)), (i * 2) + 1) |
|
683 | parameters_ws.move_range( |
|
684 | "{}{}:{}{}".format(col, values_data_temp_save_start_row + 1, col, |
|
685 | values_data_temp_save_start_row + parameters_timestamps_data_max_len), |
|
686 | (- values_data_temp_save_start_row + (parameters_ws_current_row_number - 1)), (i * 2) + 2) |
|
687 | ||
688 | parameter_current_col_number += 1 |
|
689 | ||
690 | ################################################################################################################ |
|
691 | # parameters chart and parameters table |
|
692 | ################################################################################################################ |
|
693 | ||
694 | ws['B' + str(current_sheet_parameters_row_number)].font = title_font |
|
695 | ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + _('Parameters') |
|
696 | ||
697 | current_sheet_parameters_row_number += 1 |
|
698 | ||
699 | chart_start_row_number = current_sheet_parameters_row_number |
|
700 | ||
701 | col_index = 0 |
|
702 | ||
703 | for i in range(0, parameters_names_len): |
|
704 | line = LineChart() |
|
705 | data_col = 3 + col_index * 3 |
|
706 | labels_col = 2 + col_index * 3 |
|
707 | col_index += 1 |
|
708 | line.title = _('Parameters') + ' - ' + \ |
|
709 | parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value |
|
710 | labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, |
|
711 | max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) |
|
712 | line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, |
|
713 | max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) |
|
714 | line.add_data(line_data, titles_from_data=True) |
|
715 | line.set_categories(labels) |
|
716 | line_data = line.series[0] |
|
717 | line_data.marker.symbol = "auto" |
|
718 | line_data.smooth = True |
|
719 | line.x_axis.crosses = 'min' |
|
720 | line.height = 8.25 |
|
721 | line.width = 24 |
|
722 | chart_col = 'B' |
|
723 | chart_cell = chart_col + str(chart_start_row_number) |
|
724 | chart_start_row_number += 6 |
|
725 | ws.add_chart(line, chart_cell) |
|
726 | ||
727 | current_sheet_parameters_row_number = chart_start_row_number |
|
728 | ||
729 | current_sheet_parameters_row_number += 1 |
|
730 | ||
731 | filename = str(uuid.uuid4()) + '.xlsx' |
|
732 | wb.save(filename) |
|
733 | ||
734 | return filename |
|
735 | ||
736 | ||
737 | def timestamps_data_all_equal_0(lists): |
@@ 67-734 (lines=668) @@ | ||
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 = "MeterSaving" |
|
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_saving" not in report['reporting_period'].keys() or \ |
|
176 | len(report['reporting_period']['values_saving']) == 0: |
|
177 | filename = str(uuid.uuid4()) + '.xlsx' |
|
178 | wb.save(filename) |
|
179 | ||
180 | return filename |
|
181 | #################################################################################################################### |
|
182 | # First: Saving |
|
183 | # 7: title |
|
184 | # 8: table title |
|
185 | # 9~10 table_data |
|
186 | #################################################################################################################### |
|
187 | if "values_saving" not in report['reporting_period'].keys() or \ |
|
188 | len(report['reporting_period']['values_saving']) == 0: |
|
189 | for i in range(7, 10 + 1): |
|
190 | ws.row_dimensions[i].height = 0.1 |
|
191 | else: |
|
192 | ws['B7'].font = title_font |
|
193 | ws['B7'] = name + ' ' + _('Saving') |
|
194 | ||
195 | reporting_period_data = report['reporting_period'] |
|
196 | ||
197 | ws.row_dimensions[8].height = 60 |
|
198 | ||
199 | ws['B8'].fill = table_fill |
|
200 | ws['B8'].border = f_border |
|
201 | ||
202 | ws['B9'].font = title_font |
|
203 | ws['B9'].alignment = c_c_alignment |
|
204 | ws['B9'] = _('Saving') |
|
205 | ws['B9'].border = f_border |
|
206 | ||
207 | ws['B10'].font = title_font |
|
208 | ws['B10'].alignment = c_c_alignment |
|
209 | ws['B10'] = _('Increment Rate') |
|
210 | ws['B10'].border = f_border |
|
211 | ||
212 | ws['C8'].fill = table_fill |
|
213 | ws['C8'].font = name_font |
|
214 | ws['C8'].alignment = c_c_alignment |
|
215 | ws['C8'] = report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")" |
|
216 | ws['C8'].border = f_border |
|
217 | ||
218 | ws['C9'].font = name_font |
|
219 | ws['C9'].alignment = c_c_alignment |
|
220 | ws['C9'] = round2(reporting_period_data['total_in_category_saving'], 2) |
|
221 | ws['C9'].border = f_border |
|
222 | ||
223 | ws['C10'].font = name_font |
|
224 | ws['C10'].alignment = c_c_alignment |
|
225 | ws['C10'] = str(round2(reporting_period_data['increment_rate_saving'] * 100, 2)) + "%" \ |
|
226 | if reporting_period_data['increment_rate_saving'] is not None else "-" |
|
227 | ws['C10'].border = f_border |
|
228 | ||
229 | # TCE |
|
230 | ws['D8'].fill = table_fill |
|
231 | ws['D8'].font = name_font |
|
232 | ws['D8'].alignment = c_c_alignment |
|
233 | ws['D8'] = _('Ton of Standard Coal') + '(TCE)' |
|
234 | ws['D8'].border = f_border |
|
235 | ||
236 | ws['D9'].font = name_font |
|
237 | ws['D9'].alignment = c_c_alignment |
|
238 | ws['D9'] = round2(reporting_period_data['total_in_kgce_saving'] / 1000, 2) |
|
239 | ws['D9'].border = f_border |
|
240 | ||
241 | ws['D10'].font = name_font |
|
242 | ws['D10'].alignment = c_c_alignment |
|
243 | ws['D10'] = str(round2(reporting_period_data['increment_rate_saving'] * 100, 2)) + "%" \ |
|
244 | if reporting_period_data['increment_rate_saving'] is not None else "-" |
|
245 | ws['D10'].border = f_border |
|
246 | ||
247 | # TCO2E |
|
248 | ws['E8'].fill = table_fill |
|
249 | ws['E8'].font = name_font |
|
250 | ws['E8'].alignment = c_c_alignment |
|
251 | ws['E8'] = _('Ton of Carbon Dioxide Emissions') + '(TCO2E)' + _('Decreased') |
|
252 | ws['E8'].border = f_border |
|
253 | ||
254 | ws['E9'].font = name_font |
|
255 | ws['E9'].alignment = c_c_alignment |
|
256 | ws['E9'] = round2(reporting_period_data['total_in_kgco2e_saving'] / 1000, 2) |
|
257 | ws['E9'].border = f_border |
|
258 | ||
259 | ws['E10'].font = name_font |
|
260 | ws['E10'].alignment = c_c_alignment |
|
261 | ws['E10'] = str(round2(reporting_period_data['increment_rate_saving'] * 100, 2)) + "%" \ |
|
262 | if reporting_period_data['increment_rate_saving'] is not None else "-" |
|
263 | ws['E10'].border = f_border |
|
264 | ||
265 | #################################################################################################################### |
|
266 | # Second: Detailed Data |
|
267 | # 12: title |
|
268 | # 13 ~ 18: chart |
|
269 | #################################################################################################################### |
|
270 | current_row_number = 12 |
|
271 | ||
272 | table_start_draw_flag = current_row_number + 1 |
|
273 | reporting_period_data = report['reporting_period'] |
|
274 | ||
275 | if "timestamps" not in reporting_period_data.keys() or \ |
|
276 | reporting_period_data['timestamps'] is None or \ |
|
277 | len(reporting_period_data['timestamps']) == 0: |
|
278 | pass |
|
279 | else: |
|
280 | if not is_base_period_timestamp_exists_flag: |
|
281 | reporting_period_data = report['reporting_period'] |
|
282 | time = reporting_period_data['timestamps'] |
|
283 | real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) |
|
284 | ws['B' + str(current_row_number)].font = title_font |
|
285 | ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data') |
|
286 | ||
287 | current_row_number += 1 |
|
288 | # 1: Stand for blank line 2: Stand for title |
|
289 | current_row_number += 1 * 6 + real_timestamps_len * 6 + 1 + 2 |
|
290 | table_start_row_number = current_row_number |
|
291 | ||
292 | has_data = False |
|
293 | ||
294 | if len(time) > 0: |
|
295 | has_data = True |
|
296 | ||
297 | if has_data: |
|
298 | ||
299 | ws.row_dimensions[current_row_number].height = 60 |
|
300 | current_col_number = 2 |
|
301 | col = format_cell.get_column_letter(current_col_number) |
|
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)].border = f_border |
|
305 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
306 | ws[col + str(current_row_number)] = _('Datetime') |
|
307 | ||
308 | current_col_number += 1 |
|
309 | col = format_cell.get_column_letter(current_col_number) |
|
310 | ||
311 | ws[col + str(current_row_number)].fill = table_fill |
|
312 | ws[col + str(current_row_number)].font = title_font |
|
313 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
314 | ws[col + str(current_row_number)] = report['meter']['energy_category_name'] + \ |
|
315 | " (" + report['meter']['unit_of_measure'] + ")" |
|
316 | ws[col + str(current_row_number)].border = f_border |
|
317 | ||
318 | current_row_number += 1 |
|
319 | ||
320 | for i in range(0, len(time)): |
|
321 | current_col_number = 2 |
|
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)] = time[i] |
|
327 | ws[col + str(current_row_number)].border = f_border |
|
328 | ||
329 | current_col_number += 1 |
|
330 | col = format_cell.get_column_letter(current_col_number) |
|
331 | ||
332 | ws[col + str(current_row_number)].font = title_font |
|
333 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
334 | ws[col + str(current_row_number)] = round2(reporting_period_data['values_saving'][i], 2) |
|
335 | ws[col + str(current_row_number)].border = f_border |
|
336 | ||
337 | current_row_number += 1 |
|
338 | ||
339 | table_end_row_number = current_row_number - 1 |
|
340 | ||
341 | current_col_number = 2 |
|
342 | col = format_cell.get_column_letter(current_col_number) |
|
343 | ||
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)] = _('Total') |
|
347 | ws[col + str(current_row_number)].border = f_border |
|
348 | ||
349 | current_col_number += 1 |
|
350 | col = format_cell.get_column_letter(current_col_number) |
|
351 | ws[col + str(current_row_number)].font = title_font |
|
352 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
353 | ws[col + str(current_row_number)] = round2(reporting_period_data['total_in_category_saving'], 2) |
|
354 | ws[col + str(current_row_number)].border = f_border |
|
355 | ||
356 | # line |
|
357 | line = LineChart() |
|
358 | line.title = _('Reporting Period Saving') + ' - ' \ |
|
359 | + report['meter']['energy_category_name'] + \ |
|
360 | " (" + report['meter']['unit_of_measure'] + ")" |
|
361 | labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) |
|
362 | line_data = Reference(ws, min_col=3, min_row=table_start_row_number, |
|
363 | max_row=table_end_row_number) |
|
364 | line.add_data(line_data, titles_from_data=True) |
|
365 | line.set_categories(labels) |
|
366 | line_data = line.series[0] |
|
367 | line_data.marker.symbol = "auto" |
|
368 | line_data.smooth = True |
|
369 | line.x_axis.crosses = 'min' |
|
370 | line.height = 8.25 |
|
371 | line.width = 24 |
|
372 | chart_col = 'B' |
|
373 | chart_cell = chart_col + str(table_start_draw_flag) |
|
374 | ws.add_chart(line, chart_cell) |
|
375 | ||
376 | current_row_number += 2 |
|
377 | else: |
|
378 | base_period_data = report['base_period'] |
|
379 | reporting_period_data = report['reporting_period'] |
|
380 | base_period_timestamps = base_period_data['timestamps'] |
|
381 | reporting_period_timestamps = reporting_period_data['timestamps'] |
|
382 | real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) |
|
383 | ws['B' + str(current_row_number)].font = title_font |
|
384 | ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data') |
|
385 | ||
386 | current_row_number += 1 |
|
387 | # 1: Stand for blank line 2: Stand for title |
|
388 | current_row_number += 1 * 6 + real_timestamps_len * 6 + 1 + 2 |
|
389 | table_start_row_number = current_row_number |
|
390 | ||
391 | has_data = False |
|
392 | ||
393 | if len(base_period_timestamps[0]) or len(reporting_period_timestamps[0]) > 0: |
|
394 | has_data = True |
|
395 | ||
396 | if has_data: |
|
397 | ws.row_dimensions[current_row_number].height = 60 |
|
398 | current_col_number = 2 |
|
399 | col = format_cell.get_column_letter(current_col_number) |
|
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)].border = f_border |
|
403 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
404 | ws[col + str(current_row_number)] = _('Base Period') + " - " + _('Datetime') |
|
405 | ||
406 | current_col_number += 1 |
|
407 | col = format_cell.get_column_letter(current_col_number) |
|
408 | ||
409 | ws[col + str(current_row_number)].fill = table_fill |
|
410 | ws[col + str(current_row_number)].font = title_font |
|
411 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
412 | ws[col + str(current_row_number)] = _('Base Period') + " - " + \ |
|
413 | report['meter']['energy_category_name'] + \ |
|
414 | " (" + report['meter']['unit_of_measure'] + ")" |
|
415 | ws[col + str(current_row_number)].border = f_border |
|
416 | ||
417 | current_col_number += 1 |
|
418 | col = format_cell.get_column_letter(current_col_number) |
|
419 | ||
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)].border = f_border |
|
423 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
424 | ws[col + str(current_row_number)] = _('Reporting Period') + " - " + _('Datetime') |
|
425 | ||
426 | current_col_number += 1 |
|
427 | col = format_cell.get_column_letter(current_col_number) |
|
428 | ws[col + str(current_row_number)].fill = table_fill |
|
429 | ws[col + str(current_row_number)].font = title_font |
|
430 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
431 | ws[col + str(current_row_number)] = _('Reporting Period') + " - " \ |
|
432 | + report['meter']['energy_category_name'] + \ |
|
433 | " (" + report['meter']['unit_of_measure'] + ")" |
|
434 | ws[col + str(current_row_number)].border = f_border |
|
435 | ||
436 | current_row_number += 1 |
|
437 | ||
438 | max_timestamps_len = len(base_period_timestamps) \ |
|
439 | if len(base_period_timestamps) >= len(reporting_period_timestamps) \ |
|
440 | else len(reporting_period_timestamps) |
|
441 | ||
442 | for i in range(0, max_timestamps_len): |
|
443 | current_col_number = 2 |
|
444 | col = format_cell.get_column_letter(current_col_number) |
|
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)] = base_period_timestamps[i] \ |
|
448 | if i < len(base_period_timestamps) 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)] = round2(base_period_data['values_saving'][i], 2) \ |
|
457 | if i < len(base_period_data['values_saving']) 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)] = reporting_period_timestamps[i] \ |
|
466 | if i < len(reporting_period_timestamps) else None |
|
467 | ws[col + str(current_row_number)].border = f_border |
|
468 | ||
469 | current_col_number += 1 |
|
470 | col = format_cell.get_column_letter(current_col_number) |
|
471 | ||
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)] = round2(reporting_period_data['values_saving'][i], 2) \ |
|
475 | if i < len(reporting_period_data['values_saving']) else None |
|
476 | ws[col + str(current_row_number)].border = f_border |
|
477 | ||
478 | current_row_number += 1 |
|
479 | ||
480 | current_col_number = 2 |
|
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)] = _('Total') |
|
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 | 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)] = round2(base_period_data['total_in_category_saving'], 2) |
|
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 | ||
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)] = _('Total') |
|
500 | ws[col + str(current_row_number)].border = f_border |
|
501 | ||
502 | current_col_number += 1 |
|
503 | col = format_cell.get_column_letter(current_col_number) |
|
504 | ws[col + str(current_row_number)].font = title_font |
|
505 | ws[col + str(current_row_number)].alignment = c_c_alignment |
|
506 | ws[col + str(current_row_number)] = round2(reporting_period_data['total_in_category_saving'], 2) |
|
507 | ws[col + str(current_row_number)].border = f_border |
|
508 | ||
509 | # line |
|
510 | line = LineChart() |
|
511 | line.title = _('Base Period Saving') + " / " \ |
|
512 | + _('Reporting Period Saving') + ' - ' \ |
|
513 | + report['meter']['energy_category_name'] + \ |
|
514 | " (" + report['meter']['unit_of_measure'] + ")" |
|
515 | labels = Reference(ws, min_col=4, |
|
516 | min_row=table_start_row_number + 1, |
|
517 | max_row=table_start_row_number + len(reporting_period_timestamps)) |
|
518 | base_line_data = Reference(ws, min_col=3, min_row=table_start_row_number, |
|
519 | max_row=table_start_row_number + len(reporting_period_timestamps)) |
|
520 | reporting_line_data = Reference(ws, min_col=5, |
|
521 | min_row=table_start_row_number, |
|
522 | max_row=table_start_row_number |
|
523 | + len(reporting_period_timestamps)) |
|
524 | line.add_data(base_line_data, titles_from_data=True) |
|
525 | line.add_data(reporting_line_data, titles_from_data=True) |
|
526 | line.set_categories(labels) |
|
527 | for j in range(len(line.series)): |
|
528 | line.series[j].marker.symbol = "auto" |
|
529 | line.series[j].smooth = True |
|
530 | line.x_axis.crosses = 'min' |
|
531 | line.height = 8.25 |
|
532 | line.width = 24 |
|
533 | chart_col = 'B' |
|
534 | chart_cell = chart_col + str(table_start_draw_flag) |
|
535 | ws.add_chart(line, chart_cell) |
|
536 | ||
537 | current_row_number += 2 |
|
538 | ||
539 | ########################################## |
|
540 | # table_start_draw_flag is the starting line number of the last line chart in the report period |
|
541 | current_sheet_parameters_row_number = table_start_draw_flag + 1 * 6 + 1 |
|
542 | if 'parameters' not in report.keys() or \ |
|
543 | report['parameters'] is None or \ |
|
544 | 'names' not in report['parameters'].keys() or \ |
|
545 | report['parameters']['names'] is None or \ |
|
546 | len(report['parameters']['names']) == 0 or \ |
|
547 | 'timestamps' not in report['parameters'].keys() or \ |
|
548 | report['parameters']['timestamps'] is None or \ |
|
549 | len(report['parameters']['timestamps']) == 0 or \ |
|
550 | 'values' not in report['parameters'].keys() or \ |
|
551 | report['parameters']['values'] is None or \ |
|
552 | len(report['parameters']['values']) == 0 or \ |
|
553 | timestamps_data_all_equal_0(report['parameters']['timestamps']): |
|
554 | pass |
|
555 | else: |
|
556 | ||
557 | ################################################################################################################ |
|
558 | # new worksheet |
|
559 | ################################################################################################################ |
|
560 | ||
561 | parameters_data = report['parameters'] |
|
562 | ||
563 | parameters_names_len = len(parameters_data['names']) |
|
564 | ||
565 | file_name = (re.sub(r'[^A-Z]', '', ws.title))+'_' |
|
566 | parameters_ws = wb.create_sheet(file_name + _('Parameters')) |
|
567 | ||
568 | parameters_timestamps_data_max_len = \ |
|
569 | get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps'])) |
|
570 | ||
571 | # Row height |
|
572 | parameters_ws.row_dimensions[1].height = 102 |
|
573 | for i in range(2, 7 + 1): |
|
574 | parameters_ws.row_dimensions[i].height = 42 |
|
575 | ||
576 | for i in range(8, parameters_timestamps_data_max_len + 10): |
|
577 | parameters_ws.row_dimensions[i].height = 60 |
|
578 | ||
579 | # Col width |
|
580 | parameters_ws.column_dimensions['A'].width = 1.5 |
|
581 | ||
582 | parameters_ws.column_dimensions['B'].width = 25.0 |
|
583 | ||
584 | for i in range(3, 12 + parameters_names_len * 3): |
|
585 | parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0 |
|
586 | ||
587 | # Img |
|
588 | img = Image("excelexporters/myems.png") |
|
589 | parameters_ws.add_image(img, 'A1') |
|
590 | ||
591 | # Title |
|
592 | parameters_ws['B3'].alignment = b_r_alignment |
|
593 | parameters_ws['B3'] = _('Name') + ':' |
|
594 | parameters_ws['C3'].border = b_border |
|
595 | parameters_ws['C3'].alignment = b_c_alignment |
|
596 | parameters_ws['C3'] = name |
|
597 | ||
598 | parameters_ws['D3'].alignment = b_r_alignment |
|
599 | parameters_ws['D3'] = _('Period Type') + ':' |
|
600 | parameters_ws['E3'].border = b_border |
|
601 | parameters_ws['E3'].alignment = b_c_alignment |
|
602 | parameters_ws['E3'] = period_type |
|
603 | ||
604 | parameters_ws['B4'].alignment = b_r_alignment |
|
605 | parameters_ws['B4'] = _('Reporting Start Datetime') + ':' |
|
606 | parameters_ws['C4'].border = b_border |
|
607 | parameters_ws['C4'].alignment = b_c_alignment |
|
608 | parameters_ws['C4'] = reporting_start_datetime_local |
|
609 | ||
610 | parameters_ws['D4'].alignment = b_r_alignment |
|
611 | parameters_ws['D4'] = _('Reporting End Datetime') + ':' |
|
612 | parameters_ws['E4'].border = b_border |
|
613 | parameters_ws['E4'].alignment = b_c_alignment |
|
614 | parameters_ws['E4'] = reporting_end_datetime_local |
|
615 | ||
616 | parameters_ws_current_row_number = 6 |
|
617 | ||
618 | parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font |
|
619 | parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + _('Parameters') |
|
620 | ||
621 | parameters_ws_current_row_number += 1 |
|
622 | ||
623 | parameters_table_start_row_number = parameters_ws_current_row_number |
|
624 | ||
625 | parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80 |
|
626 | ||
627 | parameters_ws_current_row_number += 1 |
|
628 | ||
629 | table_current_col_number = 2 |
|
630 | ||
631 | for i in range(0, parameters_names_len): |
|
632 | col = format_cell.get_column_letter(table_current_col_number) |
|
633 | ||
634 | parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill |
|
635 | col = format_cell.get_column_letter(table_current_col_number + 1) |
|
636 | ||
637 | parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill |
|
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_col_number = table_current_col_number + 3 |
|
643 | ||
644 | ################################################################################################################ |
|
645 | # Optimized insert parameter data |
|
646 | ################################################################################################################ |
|
647 | ||
648 | timestamps_list = parameters_data['timestamps'] |
|
649 | values_list = parameters_data['values'] |
|
650 | ||
651 | timestamps_data_temp_save_start_row = parameters_timestamps_data_max_len + 10 |
|
652 | ||
653 | values_data_temp_save_start_row = parameters_timestamps_data_max_len * 2 + 10 + 1 |
|
654 | ||
655 | parameters_ws["A" + str(timestamps_data_temp_save_start_row)] = "" |
|
656 | for i in range(parameters_timestamps_data_max_len): |
|
657 | temp_list = [] |
|
658 | for j in range(len(timestamps_list)): |
|
659 | try: |
|
660 | temp_list.append(timestamps_list[j][i]) |
|
661 | except IndexError: |
|
662 | temp_list.append("") |
|
663 | parameters_ws.append(temp_list) |
|
664 | ||
665 | parameters_ws["A" + str(values_data_temp_save_start_row)] = "" |
|
666 | for i in range(parameters_timestamps_data_max_len): |
|
667 | temp_list = [] |
|
668 | for j in range(len(values_list)): |
|
669 | try: |
|
670 | temp_list.append(values_list[j][i]) |
|
671 | except IndexError: |
|
672 | temp_list.append("") |
|
673 | parameters_ws.append(temp_list) |
|
674 | ||
675 | parameter_current_col_number = 1 |
|
676 | ||
677 | for i in range(len(timestamps_list)): |
|
678 | col = format_cell.get_column_letter(parameter_current_col_number) |
|
679 | parameters_ws.move_range( |
|
680 | "{}{}:{}{}".format(col, timestamps_data_temp_save_start_row + 1, col, |
|
681 | timestamps_data_temp_save_start_row + parameters_timestamps_data_max_len), |
|
682 | (- timestamps_data_temp_save_start_row + (parameters_ws_current_row_number - 1)), (i * 2) + 1) |
|
683 | parameters_ws.move_range( |
|
684 | "{}{}:{}{}".format(col, values_data_temp_save_start_row + 1, col, |
|
685 | values_data_temp_save_start_row + parameters_timestamps_data_max_len), |
|
686 | (- values_data_temp_save_start_row + (parameters_ws_current_row_number - 1)), (i * 2) + 2) |
|
687 | ||
688 | parameter_current_col_number += 1 |
|
689 | ||
690 | ################################################################################################################ |
|
691 | # parameters chart and parameters table |
|
692 | ################################################################################################################ |
|
693 | ||
694 | ws['B' + str(current_sheet_parameters_row_number)].font = title_font |
|
695 | ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + _('Parameters') |
|
696 | ||
697 | current_sheet_parameters_row_number += 1 |
|
698 | ||
699 | chart_start_row_number = current_sheet_parameters_row_number |
|
700 | ||
701 | col_index = 0 |
|
702 | ||
703 | for i in range(0, parameters_names_len): |
|
704 | line = LineChart() |
|
705 | data_col = 3 + col_index * 3 |
|
706 | labels_col = 2 + col_index * 3 |
|
707 | col_index += 1 |
|
708 | line.title = _('Parameters') + ' - ' + \ |
|
709 | parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value |
|
710 | labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1, |
|
711 | max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) |
|
712 | line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number, |
|
713 | max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number)) |
|
714 | line.add_data(line_data, titles_from_data=True) |
|
715 | line.set_categories(labels) |
|
716 | line_data = line.series[0] |
|
717 | line_data.marker.symbol = "auto" |
|
718 | line_data.smooth = True |
|
719 | line.x_axis.crosses = 'min' |
|
720 | line.height = 8.25 |
|
721 | line.width = 24 |
|
722 | chart_col = 'B' |
|
723 | chart_cell = chart_col + str(chart_start_row_number) |
|
724 | chart_start_row_number += 6 |
|
725 | ws.add_chart(line, chart_cell) |
|
726 | ||
727 | current_sheet_parameters_row_number = chart_start_row_number |
|
728 | ||
729 | current_sheet_parameters_row_number += 1 |
|
730 | ||
731 | filename = str(uuid.uuid4()) + '.xlsx' |
|
732 | wb.save(filename) |
|
733 | ||
734 | return filename |
|
735 | ||
736 | ||
737 | def timestamps_data_all_equal_0(lists): |