diff --git a/web_export_view/AUTHORS.txt b/web_export_view/AUTHORS.txt index d7fa7280..0ddb1641 100644 --- a/web_export_view/AUTHORS.txt +++ b/web_export_view/AUTHORS.txt @@ -4,3 +4,4 @@ Authors Simone Orsi [simahawk] Lorenzo Battistini Stefan Rijnhart +Cristian Salamea diff --git a/web_export_view/controllers.py b/web_export_view/controllers.py index ba7f4e1d..4e4c6bd7 100644 --- a/web_export_view/controllers.py +++ b/web_export_view/controllers.py @@ -18,6 +18,10 @@ # along with this program. If not, see . # ############################################################################## +import re +import xlwt +from cStringIO import StringIO + try: import json except ImportError: @@ -31,6 +35,33 @@ from web.controllers.main import ExcelExport class ExcelExportView(ExcelExport): _cp_path = '/web/export/xls_view' + def from_data(self, fields, rows, separators): + workbook = xlwt.Workbook() + worksheet = workbook.add_sheet('Sheet 1') + + for i, fieldname in enumerate(fields): + worksheet.write(0, i, fieldname) + worksheet.col(i).width = 8000 # around 220 pixels + + style = xlwt.easyxf('align: wrap yes') + m = "^[\d%s]+(\%s\d+)?$" % (separators['thousands_sep'], separators['decimal_point']) + for row_index, row in enumerate(rows): + for cell_index, cell_value in enumerate(row): + if isinstance(cell_value, basestring): + cell_value = re.sub("\r", " ", cell_value) + if re.match(m, cell_value): + cell_value = float(cell_value.replace(separators['thousands_sep'],'').replace(separators['decimal_point'],'.')) + style = xlwt.easyxf(num_format_str='#,##0.00') + if cell_value is False: cell_value = None + worksheet.write(row_index + 1, cell_index, cell_value, style) + + fp = StringIO() + workbook.save(fp) + fp.seek(0) + data = fp.read() + fp.close() + return data + @openerpweb.httprequest def index(self, req, data, token): data = json.loads(data) @@ -39,8 +70,12 @@ class ExcelExportView(ExcelExport): rows = data.get('rows',[]) context = req.session.eval_context(req.context) + lang = context.get('lang', 'en_US') + Model = req.session.model('res.lang') + ids = Model.search([['code','=',lang]]) + record = Model.read(ids, ['decimal_point','thousands_sep']) - return req.make_response(self.from_data(columns_headers, rows), + return req.make_response(self.from_data(columns_headers, rows, record[0]), headers=[('Content-Disposition', 'attachment; filename="%s"' % self.filename(model)), ('Content-Type', self.content_type)], cookies={'fileToken': int(token)})