From 2401a12148f8db8a1f83bb256c3513d3d720c7d8 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 22 Jul 2011 16:12:02 +0530 Subject: [PATCH] [IMP] implement export in excel and csv file. bzr revid: ysa@tinyerp.com-20110722104202-d8suf02qsfi9c29w --- addons/base_export/controllers/main.py | 87 +++++++++++++------ .../base_export/static/src/js/base_export.js | 6 +- .../static/src/xml/base_export.xml | 14 ++- 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index aaff9265584..3aa73147ebb 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -3,6 +3,61 @@ import openerpweb import StringIO import csv import xml.dom.minidom +import re + +def export_csv(fields, result): + fp = StringIO.StringIO() + writer = csv.writer(fp, quoting=csv.QUOTE_ALL) + + writer.writerow(fields) + + for data in result: + row = [] + for d in data: + if isinstance(d, basestring): + d = d.replace('\n',' ').replace('\t',' ') + try: + d = d.encode('utf-8') + except: + pass + if d is False: d = None + row.append(d) + writer.writerow(row) + + fp.seek(0) + data = fp.read() + fp.close() + return data + +def export_xls(fieldnames, table): + try: + import xlwt + except ImportError: + common.error(_('Import Error.'), _('Please install xlwt library to export to MS Excel.')) + + workbook = xlwt.Workbook() + worksheet = workbook.add_sheet('Sheet 1') + + for i, fieldname in enumerate(fieldnames): + worksheet.write(0, i, str(fieldname)) + worksheet.col(i).width = 8000 # around 220 pixels + + style = xlwt.easyxf('align: wrap yes') + + for row_index, row in enumerate(table): + for cell_index, cell_value in enumerate(row): + cell_value = str(cell_value) + cell_value = re.sub("\r", " ", cell_value) + worksheet.write(row_index + 1, cell_index, cell_value, style) + + + fp = StringIO.StringIO() + workbook.save(fp) + fp.seek(0) + data = fp.read() + fp.close() + #return data.decode('ISO-8859-1') + return unicode(data, 'utf-8', 'replace') def node_attributes(node): attrs = node.attributes @@ -187,32 +242,8 @@ class Export(View): return _fields return rec(fields) - def export_csv(self, req, fields, result): - fp = StringIO.StringIO() - writer = csv.writer(fp, quoting=csv.QUOTE_ALL) - - writer.writerow(fields) - - for data in result: - row = [] - for d in data: - if isinstance(d, basestring): - d = d.replace('\n',' ').replace('\t',' ') - try: - d = d.encode('utf-8') - except: - pass - if d is False: d = None - row.append(d) - writer.writerow(row) - - fp.seek(0) - data = fp.read() - fp.close() - return data - @openerpweb.jsonrequest - def export_data(self, req, model, fields, ids, domain, import_compat=False, context=None): + def export_data(self, req, model, fields, ids, domain, import_compat=False, export_format="csv", context=None): context = req.session.eval_context(req.context) modle_obj = req.session.model(model) ids = ids or modle_obj.search(domain, context=context) @@ -222,4 +253,8 @@ class Export(View): if not import_compat: field = [val.strip() for val in fields.values()] - return self.export_csv(req, field, result) + + if export_format == 'xls': + return export_xls(field, result) + else: + return export_csv(field, result) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index ce2a385bdc9..8814edc946b 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -373,8 +373,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } import_comp = $("#import_compat option:selected").val() - self.rpc("/base_export/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp)}, function(data){ - window.location="data:text/csv;charset=utf8," + encodeURIComponent(data) + export_format = $("#export_format").val() + + self.rpc("/base_export/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp), "export_format" :export_format}, function(data){ + window.location="data:text/csv/excel;charset=utf8," + data self.close(); }); }, diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index 9860e4d068d..74fd260ac2e 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -16,13 +16,21 @@ - + + + +
+ +
@@ -114,7 +122,7 @@ - + @@ -129,7 +137,7 @@ - + \ No newline at end of file