jcoux
8 years ago
committed by
Jordi Ballester
3 changed files with 267 additions and 121 deletions
-
1account_financial_report_qweb/report/__init__.py
-
220account_financial_report_qweb/report/abstract_report_xlsx.py
-
167account_financial_report_qweb/report/general_ledger_xlsx.py
@ -0,0 +1,220 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Author: Julien Coux |
|||
# Copyright 2016 Camptocamp SA |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from openerp.addons.report_xlsx.report.report_xlsx import ReportXlsx |
|||
|
|||
|
|||
class AbstractReportXslx(ReportXlsx): |
|||
|
|||
def __init__(self, name, table, rml=False, parser=False, header=True, |
|||
store=False): |
|||
super(AbstractReportXslx, self).__init__( |
|||
name, table, rml, parser, header, store) |
|||
|
|||
# main sheet which will contains report |
|||
self.sheet = None |
|||
|
|||
# columns of the report |
|||
self.columns = None |
|||
|
|||
# row_pos must be incremented at each writing lines |
|||
self.row_pos = 0 |
|||
|
|||
# Formats |
|||
self.format_right = None |
|||
self.format_bold = None |
|||
self.format_header_left = None |
|||
self.format_header_center = None |
|||
self.format_header_right = None |
|||
self.format_header_amount = None |
|||
self.format_amount = None |
|||
|
|||
def generate_xlsx_report(self, workbook, data, objects): |
|||
report = objects |
|||
|
|||
self._define_formats(workbook) |
|||
|
|||
report_name = self._get_report_name() |
|||
filters = self._get_report_filters(report) |
|||
self.columns = self._get_report_columns() |
|||
|
|||
self.sheet = workbook.add_worksheet(report_name[:31]) |
|||
|
|||
self._set_column_width() |
|||
|
|||
self._write_report_title(report_name) |
|||
|
|||
self._write_filters(filters) |
|||
|
|||
self._generate_report_content(workbook, report) |
|||
|
|||
def _define_formats(self, workbook): |
|||
""" Add cell formats to current workbook. |
|||
Those formats can be used on all cell. |
|||
|
|||
Available formats are : |
|||
* format_bold |
|||
* format_right |
|||
* format_header_left |
|||
* format_header_center |
|||
* format_header_right |
|||
* format_header_amount |
|||
* format_amount |
|||
""" |
|||
self.format_bold = workbook.add_format({'bold': True}) |
|||
self.format_right = workbook.add_format({'align': 'right'}) |
|||
self.format_header_left = workbook.add_format( |
|||
{'bold': True, |
|||
'border': True, |
|||
'bg_color': '#FFFFCC'}) |
|||
self.format_header_center = workbook.add_format( |
|||
{'bold': True, |
|||
'align': 'center', |
|||
'border': True, |
|||
'bg_color': '#FFFFCC'}) |
|||
self.format_header_right = workbook.add_format( |
|||
{'bold': True, |
|||
'align': 'right', |
|||
'border': True, |
|||
'bg_color': '#FFFFCC'}) |
|||
self.format_header_amount = workbook.add_format( |
|||
{'bold': True, |
|||
'border': True, |
|||
'bg_color': '#FFFFCC'}) |
|||
self.format_header_amount.set_num_format('#,##0.00') |
|||
self.format_amount = workbook.add_format() |
|||
self.format_amount.set_num_format('#,##0.00') |
|||
|
|||
def _set_column_width(self): |
|||
"""Set width for all defined columns. |
|||
Columns are defined with `_get_report_columns` method. |
|||
""" |
|||
for position, column in self.columns.iteritems(): |
|||
self.sheet.set_column(position, position, column['width']) |
|||
|
|||
def _write_report_title(self, title): |
|||
"""Write report title on current line using all defined columns width. |
|||
Columns are defined with `_get_report_columns` method. |
|||
""" |
|||
self.sheet.merge_range( |
|||
self.row_pos, 0, self.row_pos, len(self.columns) - 1, |
|||
title, self.format_bold |
|||
) |
|||
self.row_pos += 3 |
|||
|
|||
def _write_filters(self, filters): |
|||
"""Write one line per filters on starting on current line. |
|||
Columns number for filter name is defined |
|||
with `_get_col_count_filter_name` method. |
|||
Columns number for filter value is define |
|||
with `_get_col_count_filter_value` method. |
|||
""" |
|||
col_name = 1 |
|||
col_count_filter_name = self._get_col_count_filter_name() |
|||
col_count_filter_value = self._get_col_count_filter_value() |
|||
col_value = col_name + col_count_filter_name + 1 |
|||
for title, value in filters: |
|||
self.sheet.merge_range( |
|||
self.row_pos, col_name, |
|||
self.row_pos, col_name + col_count_filter_name - 1, |
|||
title, self.format_header_left) |
|||
self.sheet.merge_range( |
|||
self.row_pos, col_value, |
|||
self.row_pos, col_value + col_count_filter_value - 1, |
|||
value) |
|||
self.row_pos += 1 |
|||
self.row_pos += 2 |
|||
|
|||
def write_array_title(self, title): |
|||
"""Write array title on current line using all defined columns width. |
|||
Columns are defined with `_get_report_columns` method. |
|||
""" |
|||
self.sheet.merge_range( |
|||
self.row_pos, 0, self.row_pos, len(self.columns) - 1, |
|||
title, self.format_bold |
|||
) |
|||
self.row_pos += 1 |
|||
|
|||
def write_array_header(self): |
|||
"""Write array header on current line using all defined columns name. |
|||
Columns are defined with `_get_report_columns` method. |
|||
""" |
|||
for col_pos, column in self.columns.iteritems(): |
|||
self.sheet.write(self.row_pos, col_pos, column['header'], |
|||
self.format_header_center) |
|||
self.row_pos += 1 |
|||
|
|||
def write_line(self, line_object): |
|||
"""Write a line on current line using all defined columns field name. |
|||
Columns are defined with `_get_report_columns` method. |
|||
""" |
|||
for col_pos, column in self.columns.iteritems(): |
|||
value = getattr(line_object, column['field']) |
|||
cell_type = column.get('type', 'string') |
|||
if cell_type == 'string': |
|||
self.sheet.write_string(self.row_pos, col_pos, value or '') |
|||
elif cell_type == 'amount': |
|||
self.sheet.write_number( |
|||
self.row_pos, col_pos, float(value), self.format_amount |
|||
) |
|||
self.row_pos += 1 |
|||
|
|||
def _generate_report_content(self, workbook, report): |
|||
pass |
|||
|
|||
def _get_report_name(self): |
|||
""" |
|||
Allow to define the report name. |
|||
Report name will be used as sheet name and as report title. |
|||
|
|||
:return: the report name |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _get_report_columns(self): |
|||
""" |
|||
Allow to define the report columns |
|||
which will be used to generate report. |
|||
|
|||
:return: the report columns as dict |
|||
|
|||
:Example: |
|||
|
|||
{ |
|||
0: {'header': 'Simple column', |
|||
'field': 'field_name_on_my_object', |
|||
'width': 11}, |
|||
1: {'header': 'Amount column', |
|||
'field': 'field_name_on_my_object', |
|||
'type': 'amount', |
|||
'width': 14}, |
|||
} |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _get_report_filters(self, report): |
|||
""" |
|||
:return: the report filters as list |
|||
|
|||
:Example: |
|||
|
|||
[ |
|||
['first_filter_name', 'first_filter_value'], |
|||
['second_filter_name', 'second_filter_value'] |
|||
] |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _get_col_count_filter_name(self): |
|||
""" |
|||
:return: the columns number used for filter names. |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _get_col_count_filter_value(self): |
|||
""" |
|||
:return: the columns number used for filter values. |
|||
""" |
|||
raise NotImplementedError() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue