You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
3.2 KiB

  1. # -*- coding: utf-8 -*-
  2. ##############################################################################
  3. #
  4. # Copyright (C) 2012 Agile Business Group sagl (<http://www.agilebg.com>)
  5. # Copyright (C) 2012 Domsense srl (<http://www.domsense.com>)
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as published
  9. # by the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. #
  20. ##############################################################################
  21. import re
  22. import xlwt
  23. from cStringIO import StringIO
  24. try:
  25. import json
  26. except ImportError:
  27. import simplejson as json
  28. import web.common.http as openerpweb
  29. from web.controllers.main import ExcelExport
  30. class ExcelExportView(ExcelExport):
  31. _cp_path = '/web/export/xls_view'
  32. def from_data(self, fields, rows, separators):
  33. workbook = xlwt.Workbook()
  34. worksheet = workbook.add_sheet('Sheet 1')
  35. for i, fieldname in enumerate(fields):
  36. worksheet.write(0, i, fieldname)
  37. worksheet.col(i).width = 8000 # around 220 pixels
  38. style = xlwt.easyxf('align: wrap yes')
  39. m = "^[\d%s]+(\%s\d+)?$" % (separators['thousands_sep'], separators['decimal_point'])
  40. for row_index, row in enumerate(rows):
  41. for cell_index, cell_value in enumerate(row):
  42. if isinstance(cell_value, basestring):
  43. cell_value = re.sub("\r", " ", cell_value)
  44. if re.match(m, cell_value):
  45. cell_value = float(cell_value.replace(separators['thousands_sep'],'').replace(separators['decimal_point'],'.'))
  46. style = xlwt.easyxf(num_format_str='#,##0.00')
  47. if cell_value is False: cell_value = None
  48. worksheet.write(row_index + 1, cell_index, cell_value, style)
  49. fp = StringIO()
  50. workbook.save(fp)
  51. fp.seek(0)
  52. data = fp.read()
  53. fp.close()
  54. return data
  55. @openerpweb.httprequest
  56. def index(self, req, data, token):
  57. data = json.loads(data)
  58. model = data.get('model',[])
  59. columns_headers = data.get('headers',[])
  60. rows = data.get('rows',[])
  61. context = req.session.eval_context(req.context)
  62. lang = context.get('lang', 'en_US')
  63. Model = req.session.model('res.lang')
  64. ids = Model.search([['code','=',lang]])
  65. record = Model.read(ids, ['decimal_point','thousands_sep'])
  66. return req.make_response(self.from_data(columns_headers, rows, record[0]),
  67. headers=[('Content-Disposition', 'attachment; filename="%s"' % self.filename(model)),
  68. ('Content-Type', self.content_type)],
  69. cookies={'fileToken': int(token)})