From 74c3afa3637536f72f92fcca226b60c9cd4a08e3 Mon Sep 17 00:00:00 2001 From: luc-demeyer Date: Tue, 30 Sep 2014 13:50:51 +0200 Subject: [PATCH] 8.0 port of report_xls module --- __unported__/report_xls/__init__.py | 1 + __unported__/report_xls/__openerp__.py | 28 +- __unported__/report_xls/report_xls.py | 65 +++-- .../report_xls/static/src/img/icon.png | Bin 11645 -> 11647 bytes __unported__/report_xls/utils.py | 3 +- report_xls/__init__.py | 25 ++ report_xls/__openerp__.py | 82 ++++++ report_xls/ir_report.py | 36 +++ report_xls/report_xls.py | 249 ++++++++++++++++++ report_xls/static/description/help.png | Bin 0 -> 31176 bytes report_xls/static/description/icon.png | Bin 0 -> 11645 bytes report_xls/static/description/icon2.png | Bin 0 -> 11645 bytes report_xls/static/description/index.html | 84 ++++++ .../static/description/open_receivables.png | Bin 0 -> 50405 bytes report_xls/utils.py | 51 ++++ 15 files changed, 587 insertions(+), 37 deletions(-) create mode 100644 report_xls/__init__.py create mode 100644 report_xls/__openerp__.py create mode 100644 report_xls/ir_report.py create mode 100644 report_xls/report_xls.py create mode 100644 report_xls/static/description/help.png create mode 100644 report_xls/static/description/icon.png create mode 100644 report_xls/static/description/icon2.png create mode 100644 report_xls/static/description/index.html create mode 100644 report_xls/static/description/open_receivables.png create mode 100644 report_xls/utils.py diff --git a/__unported__/report_xls/__init__.py b/__unported__/report_xls/__init__.py index 1f5df8f6..e100e786 100644 --- a/__unported__/report_xls/__init__.py +++ b/__unported__/report_xls/__init__.py @@ -20,5 +20,6 @@ # ############################################################################## +from . import ir_report from . import report_xls # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/__unported__/report_xls/__openerp__.py b/__unported__/report_xls/__openerp__.py index a0b256eb..e53584ff 100644 --- a/__unported__/report_xls/__openerp__.py +++ b/__unported__/report_xls/__openerp__.py @@ -21,7 +21,7 @@ ############################################################################## { 'name': 'Excel report engine', - 'version': '0.4.1', + 'version': '0.6', 'license': 'AGPL-3', 'author': 'Noviat', 'website': 'http://www.noviat.com', @@ -30,7 +30,8 @@ Excel report engine =================== -This module adds Excel export capabilities to the standard OpenERP reporting engine. +This module adds Excel export capabilities to the standard odoo reporting +engine. Report development '''''''''''''''''' @@ -38,8 +39,8 @@ In order to create an Excel report you can\n - define a report of type 'xls' - pass ``{'xls_export': 1}`` via the context to the report create method -The ``report_xls`` class contains a number of attributes and methods to facilitate -the creation XLS reports in OpenERP. +The ``report_xls`` class contains a number of attributes and methods to +facilitate the creation XLS reports in OpenERP. * cell types @@ -52,28 +53,29 @@ the creation XLS reports in OpenERP. * cell formulas - Cell formulas can be easily added with the help of the ``rowcol_to_cell()`` function which - you can import from the ``utils.py`` module. + Cell formulas can be easily added with the help of the ``rowcol_to_cell()`` + function which you can import from the ``utils.py`` module. * Excel templates - It is possible to define Excel templates which can be adapted by 'inherited' modules. - Download the ``account_move_line_report_xls`` module from http://apps.openerp.com - as example. + It is possible to define Excel templates which can be adapted + by 'inherited' modules. + Download the ``account_move_line_report_xls`` module + from http://apps.odoo.com as example. * XLS with multiple sheets - Download the ``account_journal_report_xls`` module from http://apps.openerp.com as example. + Download the ``account_journal_report_xls`` module + from http://apps.odoo.com as example. Development assistance '''''''''''''''''''''' -Contact info@noviat.com for help with the development of Excel reports in OpenERP. +Contact info@noviat.com for help with the development of +Excel reports in odoo. """, 'depends': ['base'], 'external_dependencies': {'python': ['xlwt']}, - 'demo': [], - 'data': [], 'active': False, 'installable': False, } diff --git a/__unported__/report_xls/report_xls.py b/__unported__/report_xls/report_xls.py index 707fc34b..13fcb5bb 100644 --- a/__unported__/report_xls/report_xls.py +++ b/__unported__/report_xls/report_xls.py @@ -3,7 +3,7 @@ # # OpenERP, Open Source Management Solution # -# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. +# Copyright (c) 2014 Noviat nv/sa (www.noviat.com). All rights reserved. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -16,7 +16,7 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## @@ -60,8 +60,8 @@ class report_xls(report_sxw): # header/footer hf_params = { - 'font_size': 8, - 'font_style': 'I', # B: Bold, I: Italic, U: Underline + 'font_size': 8, + 'font_style': 'I', # B: Bold, I: Italic, U: Underline } # styles @@ -77,8 +77,12 @@ class report_xls(report_sxw): 'fill': 'pattern: pattern solid, fore_color %s;' % _pfc, 'fill_blue': 'pattern: pattern solid, fore_color 27;', 'fill_grey': 'pattern: pattern solid, fore_color 22;', - 'borders_all': 'borders: left thin, right thin, top thin, bottom thin, ' - 'left_colour %s, right_colour %s, top_colour %s, bottom_colour %s;' % (_bc, _bc, _bc, _bc), + 'borders_all': + 'borders: ' + 'left thin, right thin, top thin, bottom thin, ' + 'left_colour %s, right_colour %s, ' + 'top_colour %s, bottom_colour %s;' + % (_bc, _bc, _bc, _bc), 'left': 'align: horz left;', 'center': 'align: horz center;', 'right': 'align: horz right;', @@ -93,15 +97,17 @@ class report_xls(report_sxw): self.cr = cr self.uid = uid report_obj = self.pool.get('ir.actions.report.xml') - report_ids = report_obj.search(cr, uid, - [('report_name', '=', self.name[7:])], context=context) + report_ids = report_obj.search( + cr, uid, [('report_name', '=', self.name[7:])], context=context) if report_ids: - report_xml = report_obj.browse(cr, uid, report_ids[0], context=context) + report_xml = report_obj.browse( + cr, uid, report_ids[0], context=context) self.title = report_xml.name if report_xml.report_type == 'xls': return self.create_source_xls(cr, uid, ids, data, context) elif context.get('xls_export'): - self.table = data.get('model') or self.table # use model from 'data' when no ir.actions.report.xml entry + # use model from 'data' when no ir.actions.report.xml entry + self.table = data.get('model') or self.table return self.create_source_xls(cr, uid, ids, data, context) return super(report_xls, self).create(cr, uid, ids, data, context) @@ -110,6 +116,7 @@ class report_xls(report_sxw): context = {} parser_instance = self.parser(cr, uid, self.name2, context) self.parser_instance = parser_instance + self.context = context objs = self.getObjects(cr, uid, ids, context) parser_instance.set_context(objs, data, ids, 'xls') objs = parser_instance.localcontext['objects'] @@ -120,10 +127,14 @@ class report_xls(report_sxw): self.xls_headers = { 'standard': '', } - report_date = datetime_field.context_timestamp(cr, uid, datetime.now(), context).strftime(DEFAULT_SERVER_DATETIME_FORMAT) + report_date = datetime_field.context_timestamp( + cr, uid, datetime.now(), context) + report_date = report_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT) self.xls_footers = { - 'standard': ('&L&%(font_size)s&%(font_style)s' + report_date + - '&R&%(font_size)s&%(font_style)s&P / &N') % self.hf_params, + 'standard': ( + '&L&%(font_size)s&%(font_style)s' + report_date + + '&R&%(font_size)s&%(font_style)s&P / &N' + ) % self.hf_params, } self.generate_xls_report(_p, _xs, data, objs, wb) wb.save(n) @@ -138,7 +149,8 @@ class report_xls(report_sxw): - wanted: element from the wanted_list - col_specs : cf. specs[1:] documented in xls_row_template method - rowtype : 'header' or 'data' - - render_space : type dict, (caller_space + localcontext) if not specified + - render_space : type dict, (caller_space + localcontext) + if not specified """ if render_space == 'empty': render_space = {} @@ -151,7 +163,6 @@ class report_xls(report_sxw): if isinstance(row[i], CodeType): row[i] = eval(row[i], render_space) row.insert(0, wanted) - #_logger.warn('row O = %s', row) return row def generate_xls_report(self, parser, xls_styles, data, objects, wb): @@ -163,11 +174,13 @@ class report_xls(report_sxw): Returns a row template. Input : - - 'wanted_list': list of Columns that will be returned in the row_template + - 'wanted_list': list of Columns that will be returned in the + row_template - 'specs': list with Column Characteristics 0: Column Name (from wanted_list) 1: Column Colspan - 2: Column Size (unit = the width of the character ’0′ as it appears in the sheet’s default font) + 2: Column Size (unit = the width of the character ’0′ + as it appears in the sheet’s default font) 3: Column Type 4: Column Data 5: Column Formula (or 'None' for Data) @@ -186,7 +199,8 @@ class report_xls(report_sxw): if s_len > 5 and s[5] is not None: c.append({'formula': s[5]}) else: - c.append({'write_cell_func': report_xls.xls_types[c[3]]}) + c.append({ + 'write_cell_func': report_xls.xls_types[c[3]]}) # Set custom cell style if s_len > 6 and s[6] is not None: c.append(s[6]) @@ -201,23 +215,28 @@ class report_xls(report_sxw): col += c[1] break if not found: - _logger.warn("report_xls.xls_row_template, column '%s' not found in specs", w) + _logger.warn("report_xls.xls_row_template, " + "column '%s' not found in specs", w) return r - def xls_write_row(self, ws, row_pos, row_data, row_style=default_style, set_column_size=False): + def xls_write_row(self, ws, row_pos, row_data, + row_style=default_style, set_column_size=False): r = ws.row(row_pos) for col, size, spec in row_data: data = spec[4] - formula = spec[5].get('formula') and xlwt.Formula(spec[5]['formula']) or None + formula = spec[5].get('formula') and \ + xlwt.Formula(spec[5]['formula']) or None style = spec[6] and spec[6] or row_style if not data: # if no data, use default values data = report_xls.xls_types_default[spec[3]] if size != 1: if formula: - ws.write_merge(row_pos, row_pos, col, col + size - 1, data, style) + ws.write_merge( + row_pos, row_pos, col, col + size - 1, data, style) else: - ws.write_merge(row_pos, row_pos, col, col + size - 1, data, style) + ws.write_merge( + row_pos, row_pos, col, col + size - 1, data, style) else: if formula: ws.write(row_pos, col, formula, style) diff --git a/__unported__/report_xls/static/src/img/icon.png b/__unported__/report_xls/static/src/img/icon.png index b8a2fcdff9d1ae795a22cc4608a55d3c290b6e0c..44c5db163b5add8d42862f23593457fb657aa963 100644 GIT binary patch delta 13 Ucmewx^*@TKQ(+@xjV>b>04sk4!T. +# +############################################################################## + +from . import ir_report +from . import report_xls +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/report_xls/__openerp__.py b/report_xls/__openerp__.py new file mode 100644 index 00000000..1ca25bbc --- /dev/null +++ b/report_xls/__openerp__.py @@ -0,0 +1,82 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# +# Copyright (c) 2014 Noviat nv/sa (www.noviat.com). All rights reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + 'name': 'Excel report engine', + 'version': '0.6', + 'license': 'AGPL-3', + 'author': 'Noviat', + 'website': 'http://www.noviat.com', + 'category': 'Reporting', + 'description': """ +Excel report engine +=================== + +This module adds Excel export capabilities to the standard odoo reporting +engine. + +Report development +'''''''''''''''''' +In order to create an Excel report you can\n +- define a report of type 'xls' +- pass ``{'xls_export': 1}`` via the context to the report create method + +The ``report_xls`` class contains a number of attributes and methods to +facilitate the creation XLS reports in OpenERP. + +* cell types + + Supported cell types : text, number, boolean, date. + +* cell styles + + The predefined cell style definitions result in a consistent + look and feel of the OpenERP Excel reports. + +* cell formulas + + Cell formulas can be easily added with the help of the ``rowcol_to_cell()`` + function which you can import from the ``utils.py`` module. + +* Excel templates + + It is possible to define Excel templates which can be adapted + by 'inherited' modules. + Download the ``account_move_line_report_xls`` module + from http://apps.odoo.com as example. + +* XLS with multiple sheets + + Download the ``account_journal_report_xls`` module + from http://apps.odoo.com as example. + +Development assistance +'''''''''''''''''''''' +Contact info@noviat.com for help with the development of +Excel reports in odoo. + + """, + 'depends': ['base'], + 'external_dependencies': {'python': ['xlwt']}, + 'active': False, + 'installable': True, +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/report_xls/ir_report.py b/report_xls/ir_report.py new file mode 100644 index 00000000..f35e6069 --- /dev/null +++ b/report_xls/ir_report.py @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# +# Copyright (c) 2014 Noviat nv/sa (www.noviat.com). All rights reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import fields, orm + + +class ir_actions_report_xml(orm.Model): + _inherit = 'ir.actions.report.xml' + + def _check_selection_field_value(self, cr, uid, + field, value, context=None): + if field == 'report_type' and value == 'xls': + return + return super(ir_actions_report_xml, self)._check_selection_field_value( + cr, uid, field, value, context=context) + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/report_xls/report_xls.py b/report_xls/report_xls.py new file mode 100644 index 00000000..13fcb5bb --- /dev/null +++ b/report_xls/report_xls.py @@ -0,0 +1,249 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# +# Copyright (c) 2014 Noviat nv/sa (www.noviat.com). All rights reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import xlwt +from xlwt.Style import default_style +import cStringIO +from datetime import datetime +from openerp.osv.fields import datetime as datetime_field +from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT +import inspect +from types import CodeType +from openerp.report.report_sxw import * +from openerp import pooler +from openerp.tools.translate import translate, _ +import logging +_logger = logging.getLogger(__name__) + + +class AttrDict(dict): + def __init__(self, *args, **kwargs): + super(AttrDict, self).__init__(*args, **kwargs) + self.__dict__ = self + + +class report_xls(report_sxw): + + xls_types = { + 'bool': xlwt.Row.set_cell_boolean, + 'date': xlwt.Row.set_cell_date, + 'text': xlwt.Row.set_cell_text, + 'number': xlwt.Row.set_cell_number, + } + xls_types_default = { + 'bool': False, + 'date': None, + 'text': '', + 'number': 0, + } + + # TO DO: move parameters infra to configurable data + + # header/footer + hf_params = { + 'font_size': 8, + 'font_style': 'I', # B: Bold, I: Italic, U: Underline + } + + # styles + _pfc = '26' # default pattern fore_color + _bc = '22' # borders color + decimal_format = '#,##0.00' + date_format = 'YYYY-MM-DD' + xls_styles = { + 'xls_title': 'font: bold true, height 240;', + 'bold': 'font: bold true;', + 'underline': 'font: underline true;', + 'italic': 'font: italic true;', + 'fill': 'pattern: pattern solid, fore_color %s;' % _pfc, + 'fill_blue': 'pattern: pattern solid, fore_color 27;', + 'fill_grey': 'pattern: pattern solid, fore_color 22;', + 'borders_all': + 'borders: ' + 'left thin, right thin, top thin, bottom thin, ' + 'left_colour %s, right_colour %s, ' + 'top_colour %s, bottom_colour %s;' + % (_bc, _bc, _bc, _bc), + 'left': 'align: horz left;', + 'center': 'align: horz center;', + 'right': 'align: horz right;', + 'wrap': 'align: wrap true;', + 'top': 'align: vert top;', + 'bottom': 'align: vert bottom;', + } + # TO DO: move parameters supra to configurable data + + def create(self, cr, uid, ids, data, context=None): + self.pool = pooler.get_pool(cr.dbname) + self.cr = cr + self.uid = uid + report_obj = self.pool.get('ir.actions.report.xml') + report_ids = report_obj.search( + cr, uid, [('report_name', '=', self.name[7:])], context=context) + if report_ids: + report_xml = report_obj.browse( + cr, uid, report_ids[0], context=context) + self.title = report_xml.name + if report_xml.report_type == 'xls': + return self.create_source_xls(cr, uid, ids, data, context) + elif context.get('xls_export'): + # use model from 'data' when no ir.actions.report.xml entry + self.table = data.get('model') or self.table + return self.create_source_xls(cr, uid, ids, data, context) + return super(report_xls, self).create(cr, uid, ids, data, context) + + def create_source_xls(self, cr, uid, ids, data, context=None): + if not context: + context = {} + parser_instance = self.parser(cr, uid, self.name2, context) + self.parser_instance = parser_instance + self.context = context + objs = self.getObjects(cr, uid, ids, context) + parser_instance.set_context(objs, data, ids, 'xls') + objs = parser_instance.localcontext['objects'] + n = cStringIO.StringIO() + wb = xlwt.Workbook(encoding='utf-8') + _p = AttrDict(parser_instance.localcontext) + _xs = self.xls_styles + self.xls_headers = { + 'standard': '', + } + report_date = datetime_field.context_timestamp( + cr, uid, datetime.now(), context) + report_date = report_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + self.xls_footers = { + 'standard': ( + '&L&%(font_size)s&%(font_style)s' + report_date + + '&R&%(font_size)s&%(font_style)s&P / &N' + ) % self.hf_params, + } + self.generate_xls_report(_p, _xs, data, objs, wb) + wb.save(n) + n.seek(0) + return (n.read(), 'xls') + + def render(self, wanted, col_specs, rowtype, render_space='empty'): + """ + returns 'evaluated' col_specs + + Input: + - wanted: element from the wanted_list + - col_specs : cf. specs[1:] documented in xls_row_template method + - rowtype : 'header' or 'data' + - render_space : type dict, (caller_space + localcontext) + if not specified + """ + if render_space == 'empty': + render_space = {} + caller_space = inspect.currentframe().f_back.f_back.f_locals + localcontext = self.parser_instance.localcontext + render_space.update(caller_space) + render_space.update(localcontext) + row = col_specs[wanted][rowtype][:] + for i in range(len(row)): + if isinstance(row[i], CodeType): + row[i] = eval(row[i], render_space) + row.insert(0, wanted) + return row + + def generate_xls_report(self, parser, xls_styles, data, objects, wb): + """ override this method to create your excel file """ + raise NotImplementedError() + + def xls_row_template(self, specs, wanted_list): + """ + Returns a row template. + + Input : + - 'wanted_list': list of Columns that will be returned in the + row_template + - 'specs': list with Column Characteristics + 0: Column Name (from wanted_list) + 1: Column Colspan + 2: Column Size (unit = the width of the character ’0′ + as it appears in the sheet’s default font) + 3: Column Type + 4: Column Data + 5: Column Formula (or 'None' for Data) + 6: Column Style + """ + r = [] + col = 0 + for w in wanted_list: + found = False + for s in specs: + if s[0] == w: + found = True + s_len = len(s) + c = list(s[:5]) + # set write_cell_func or formula + if s_len > 5 and s[5] is not None: + c.append({'formula': s[5]}) + else: + c.append({ + 'write_cell_func': report_xls.xls_types[c[3]]}) + # Set custom cell style + if s_len > 6 and s[6] is not None: + c.append(s[6]) + else: + c.append(None) + # Set cell formula + if s_len > 7 and s[7] is not None: + c.append(s[7]) + else: + c.append(None) + r.append((col, c[1], c)) + col += c[1] + break + if not found: + _logger.warn("report_xls.xls_row_template, " + "column '%s' not found in specs", w) + return r + + def xls_write_row(self, ws, row_pos, row_data, + row_style=default_style, set_column_size=False): + r = ws.row(row_pos) + for col, size, spec in row_data: + data = spec[4] + formula = spec[5].get('formula') and \ + xlwt.Formula(spec[5]['formula']) or None + style = spec[6] and spec[6] or row_style + if not data: + # if no data, use default values + data = report_xls.xls_types_default[spec[3]] + if size != 1: + if formula: + ws.write_merge( + row_pos, row_pos, col, col + size - 1, data, style) + else: + ws.write_merge( + row_pos, row_pos, col, col + size - 1, data, style) + else: + if formula: + ws.write(row_pos, col, formula, style) + else: + spec[5]['write_cell_func'](r, col, data, style) + if set_column_size: + ws.col(col).width = spec[2] * 256 + return row_pos + 1 + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/report_xls/static/description/help.png b/report_xls/static/description/help.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7338c8a713379f50f669d091c9785b82ec5b14 GIT binary patch literal 31176 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 literal 0 HcmV?d00001 diff --git a/report_xls/static/description/icon.png b/report_xls/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a2fcdff9d1ae795a22cc4608a55d3c290b6e0c GIT binary patch literal 11645 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 Hu0mjfi6p;w literal 0 HcmV?d00001 diff --git a/report_xls/static/description/icon2.png b/report_xls/static/description/icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a2fcdff9d1ae795a22cc4608a55d3c290b6e0c GIT binary patch literal 11645 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 Hu0mjfi6p;w literal 0 HcmV?d00001 diff --git a/report_xls/static/description/index.html b/report_xls/static/description/index.html new file mode 100644 index 00000000..1cdf4263 --- /dev/null +++ b/report_xls/static/description/index.html @@ -0,0 +1,84 @@ +
+
+
+

Excel report engine

+
+
+
+ +
+
+
+

+

This module adds Excel export capabilities to the standard odoo reporting engine. +

+
+
+
+ +
+
+

Report development

+

+ In order to create an Excel report you can +

    +
  • define a report of type 'xls'
  • +
  • pass {'xls_export': 1} via the context to the report create method
  • +
+

+

+ The report_xls class contains a number of attributes and methods to facilitate the creation XLS reports in odoo. +

    +
  • + cell types +
    Supported cell types : text, number, boolean, date. +
  • +
+
    +
  • + cell styles +
    The predefined cell style definitions result in a consistent look and feel of the odoo Excel reports. +
  • +
+
    +
  • + cell formulas +
    Cell formulas can be easily added with the help of the rowcol_to_cell() function which you can import from the utils.py module. +
  • +
+
    +
  • + Excel templates +
    It is possible to define Excel templates which can be adapted by 'inherited' modules. +
    Download the account_move_line_report_xls module from http://apps.odoo.com as example. +
  • +
+
    +
  • + XLS with multiple sheets +
    Download the account_journal_report_xls module from http://apps.odoo.com as example. +
  • +
+

+
+
+ +
+
+
+

Development assistance

+
+
+
+
+
+
+
+
+

+

Contact info@noviat.com for help with the development of Excel reports in odoo. +

+
+
+
+ diff --git a/report_xls/static/description/open_receivables.png b/report_xls/static/description/open_receivables.png new file mode 100644 index 0000000000000000000000000000000000000000..a00c3ba4497e9c8f48f61915feb5c9ef42c6b672 GIT binary patch literal 50405 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 Z1CO9$UFG}$2bT_m$xACql}H%*{U547X-)tD literal 0 HcmV?d00001 diff --git a/report_xls/utils.py b/report_xls/utils.py new file mode 100644 index 00000000..943daae7 --- /dev/null +++ b/report_xls/utils.py @@ -0,0 +1,51 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# +# Copyright (c) 2014 Noviat nv/sa (www.noviat.com). All rights reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +def _render(code): + return compile(code, '', 'eval') + + +def rowcol_to_cell(row, col, row_abs=False, col_abs=False): + # Code based upon utils from xlwt distribution + """ + Convert numeric row/col notation to an Excel cell + reference string in A1 notation. + """ + d = col // 26 + m = col % 26 + chr1 = "" # Most significant character in AA1 + if row_abs: + row_abs = '$' + else: + row_abs = '' + if col_abs: + col_abs = '$' + else: + col_abs = '' + if d > 0: + chr1 = chr(ord('A') + d - 1) + chr2 = chr(ord('A') + m) + # Zero index to 1-index + return col_abs + chr1 + chr2 + row_abs + str(row + 1) + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: