← Back to team overview

openerp-dev-web team mailing list archive

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

 

Julien Thewys (OpenERP) has proposed merging lp:~openerp-groupes/openobject-client-web/trunk_export_to_excel into lp:openobject-client-web.

Requested reviews:
  OpenERP SA's Web Client R&D (openerp-dev-web)

For more details, see:
https://code.launchpad.net/~openerp-groupes/openobject-client-web/trunk_export_to_excel/+merge/50289

Re-adds simple export to Excel (.xls) facility.
CSV is not for everyone (usability issue).
-- 
https://code.launchpad.net/~openerp-groupes/openobject-client-web/trunk_export_to_excel/+merge/50289
Your team OpenERP SA's Web Client R&D is requested to review the proposed merge of lp:~openerp-groupes/openobject-client-web/trunk_export_to_excel into lp:openobject-client-web.
=== modified file 'addons/openerp/controllers/impex.py'
--- addons/openerp/controllers/impex.py	2011-02-16 08:46:07 +0000
+++ addons/openerp/controllers/impex.py	2011-02-18 09:28:03 +0000
@@ -20,6 +20,7 @@
 ###############################################################################
 import StringIO
 import csv
+import re
 import xml.dom.minidom
 import cherrypy
 
@@ -64,6 +65,33 @@
     except IOError, (errno, strerror):
         raise common.message(_("Operation failed\nI/O error")+"(%s)" % (errno,))
 
+def export_xls(fieldnames, table):
+    try:
+        import xlwt
+    except ImportError, e:
+        raise common.warning(_('Please install xlwt library to export to MS Excel.'), _('Import Error.'))
+
+    workbook = xlwt.Workbook()
+    worksheet = workbook.add_sheet('Sheet 1')
+
+    for i, fieldname in enumerate(fieldnames):
+        worksheet.write(0, i, ustr(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 = ustr(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()
+    return data
+
 def _fields_get_all(model, views, context=None):
 
     context = context or {}
@@ -352,7 +380,7 @@
         return rec(fields)
 
     @expose(content_type="application/octet-stream")
-    def export_data(self, fname, fields, import_compat=False, **kw):
+    def export_data(self, fname, fields, import_compat=False, export_format='csv', **kw):
 
         params, data_index = TinyDict.split(kw)
         proxy = rpc.RPCProxy(params.model)
@@ -383,7 +411,10 @@
         if import_compat:
             params.fields2 = flds
 
-        return export_csv(params.fields2, result)
+        if export_format == 'xls':
+            return export_xls(params.fields2, result)
+        else:
+            return export_csv(params.fields2, result)
 
     @expose(template="/openerp/controllers/templates/imp.mako")
     def imp(self, error=None, records=None, success=None, **kw):

=== modified file 'addons/openerp/controllers/templates/exp.mako'
--- addons/openerp/controllers/templates/exp.mako	2011-01-17 13:17:07 +0000
+++ addons/openerp/controllers/templates/exp.mako	2011-02-18 09:28:03 +0000
@@ -120,7 +120,7 @@
             });
             openobject.dom.get('_terp_fields2').value = '[' + fields2.join(',') + ']';
             jQuery(idSelector(form)).attr('action', openobject.http.getURL(
-                '/openerp/impex/export_data/data.csv')
+                '/openerp/impex/export_data/data.' + openobject.dom.get('export_format').value)
             ).submit();
         }
 
@@ -178,6 +178,23 @@
         </tr> 
         <tr>
             <td class="side_spacing">
+                <fieldset>
+                    <legend>${_("Options")}</legend>
+                    <table>
+                        <tr>
+                            <td>
+                                <select id="export_format" name="export_format">
+                                    <option value="csv">${_("Export to CSV")}</option>
+                                    <option value="xls">${_("Export to Excel")}</option>
+                                </select>
+                            </td>
+                        </tr>
+                    </table>
+                </fieldset>
+            </td>
+        </tr>
+        <tr>
+            <td class="side_spacing">
                 <table class="fields-selector-export" cellspacing="5" border="0">
                     <tr>
                         <th class="fields-selector-left">${_("Available fields")}</th>