Merge lp:~openerp-groupes/openobject-client-web/trunk_export_to_excel into lp:openobject-client-web/trunk

Proposed by Julien Thewys
Status: Merged
Merged at revision: 4593
Proposed branch: lp:~openerp-groupes/openobject-client-web/trunk_export_to_excel
Merge into: lp:openobject-client-web/trunk
Diff against target: 103 lines (+51/-3)
2 files modified
addons/openerp/controllers/impex.py (+33/-2)
addons/openerp/controllers/templates/exp.mako (+18/-1)
To merge this branch: bzr merge lp:~openerp-groupes/openobject-client-web/trunk_export_to_excel
Reviewer Review Type Date Requested Status
Xavier (Open ERP) (community) Approve
Review via email: mp+50289@code.launchpad.net

Description of the change

Re-adds simple export to Excel (.xls) facility.
CSV is not for everyone (usability issue).

To post a comment you must log in.
Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

> CSV is not for everyone (usability issue).

Which usability issue? Doesn't a CSV file open the same as an xls one in excel? And we have issue of not being able to reimport an xls export right now.

Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) :
review: Needs Information
Revision history for this message
Julien Thewys (julien-thewys) wrote :

> Which usability issue? Doesn't a CSV file open the same as an xls one in
> excel?
No. Here is the big usability issue: an .xls files contains its metadata (character encoding, list separator), a CSV does not. So the user needs to specify them when opening he file (in OpenOffice) or, even worse, after having opened the file (in MS Excel). The problem is that most users don't know what character encoding means or just why it exists, they don't even care. Add to this the fact that the default list separator depends on your Regional Settings (it is a semicolon if your decimal separator is a comma, it is a comma otherwise; plus you can override your Regional Settings, argh). The first link about "csv excel" on youtube is a dedicated 7 minutes long video!

> And we have issue of not being able to reimport an xls export right
> now.

I understand we cannot import .xls . For me this is another use case. We cannot import pdf yet either :-)

Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

OK, fair enough.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'addons/openerp/controllers/impex.py'
2--- addons/openerp/controllers/impex.py 2011-02-16 08:46:07 +0000
3+++ addons/openerp/controllers/impex.py 2011-02-18 09:28:03 +0000
4@@ -20,6 +20,7 @@
5 ###############################################################################
6 import StringIO
7 import csv
8+import re
9 import xml.dom.minidom
10 import cherrypy
11
12@@ -64,6 +65,33 @@
13 except IOError, (errno, strerror):
14 raise common.message(_("Operation failed\nI/O error")+"(%s)" % (errno,))
15
16+def export_xls(fieldnames, table):
17+ try:
18+ import xlwt
19+ except ImportError, e:
20+ raise common.warning(_('Please install xlwt library to export to MS Excel.'), _('Import Error.'))
21+
22+ workbook = xlwt.Workbook()
23+ worksheet = workbook.add_sheet('Sheet 1')
24+
25+ for i, fieldname in enumerate(fieldnames):
26+ worksheet.write(0, i, ustr(fieldname))
27+ worksheet.col(i).width = 8000 # around 220 pixels
28+
29+ style = xlwt.easyxf('align: wrap yes')
30+
31+ for row_index, row in enumerate(table):
32+ for cell_index, cell_value in enumerate(row):
33+ cell_value = ustr(cell_value)
34+ cell_value = re.sub("\r", " ", cell_value)
35+ worksheet.write(row_index + 1, cell_index, cell_value, style)
36+
37+ fp = StringIO.StringIO()
38+ workbook.save(fp)
39+ fp.seek(0)
40+ data = fp.read()
41+ return data
42+
43 def _fields_get_all(model, views, context=None):
44
45 context = context or {}
46@@ -352,7 +380,7 @@
47 return rec(fields)
48
49 @expose(content_type="application/octet-stream")
50- def export_data(self, fname, fields, import_compat=False, **kw):
51+ def export_data(self, fname, fields, import_compat=False, export_format='csv', **kw):
52
53 params, data_index = TinyDict.split(kw)
54 proxy = rpc.RPCProxy(params.model)
55@@ -383,7 +411,10 @@
56 if import_compat:
57 params.fields2 = flds
58
59- return export_csv(params.fields2, result)
60+ if export_format == 'xls':
61+ return export_xls(params.fields2, result)
62+ else:
63+ return export_csv(params.fields2, result)
64
65 @expose(template="/openerp/controllers/templates/imp.mako")
66 def imp(self, error=None, records=None, success=None, **kw):
67
68=== modified file 'addons/openerp/controllers/templates/exp.mako'
69--- addons/openerp/controllers/templates/exp.mako 2011-01-17 13:17:07 +0000
70+++ addons/openerp/controllers/templates/exp.mako 2011-02-18 09:28:03 +0000
71@@ -120,7 +120,7 @@
72 });
73 openobject.dom.get('_terp_fields2').value = '[' + fields2.join(',') + ']';
74 jQuery(idSelector(form)).attr('action', openobject.http.getURL(
75- '/openerp/impex/export_data/data.csv')
76+ '/openerp/impex/export_data/data.' + openobject.dom.get('export_format').value)
77 ).submit();
78 }
79
80@@ -178,6 +178,23 @@
81 </tr>
82 <tr>
83 <td class="side_spacing">
84+ <fieldset>
85+ <legend>${_("Options")}</legend>
86+ <table>
87+ <tr>
88+ <td>
89+ <select id="export_format" name="export_format">
90+ <option value="csv">${_("Export to CSV")}</option>
91+ <option value="xls">${_("Export to Excel")}</option>
92+ </select>
93+ </td>
94+ </tr>
95+ </table>
96+ </fieldset>
97+ </td>
98+ </tr>
99+ <tr>
100+ <td class="side_spacing">
101 <table class="fields-selector-export" cellspacing="5" border="0">
102 <tr>
103 <th class="fields-selector-left">${_("Available fields")}</th>