import json from odoo.tools import pycompat from odoo.exceptions import Warning from odoo import http from odoo.http import request from odoo.addons.web.controllers.main import ExportFormat, GroupExportXlsxWriter, ExportXlsxWriter, serialize_exception, clean_action class Export(ExportFormat, http.Controller): @http.route('/web/export/xlsx', type='http', auth="public", csrf=False) @serialize_exception def export_xlsx(self, data, token, **kw): data_obj = json.loads(data) model = data_obj['model'] can_export = request.env.user.check_access(model, 'export') if not can_export: raise Warning('You are not allowed to export') return self.base(data, token) @property def content_type(self): return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' def filename(self, base): return base + '.xlsx' def from_group_data(self, fields, groups): with GroupExportXlsxWriter(fields, groups.count) as xlsx_writer: x, y = 1, 0 for group_name, group in groups.children.items(): x, y = xlsx_writer.write_group(x, y, group_name, group) return xlsx_writer.value def from_data(self, fields, rows): with ExportXlsxWriter(fields, len(rows)) as xlsx_writer: for row_index, row in enumerate(rows): for cell_index, cell_value in enumerate(row): if isinstance(cell_value, (list, tuple)): cell_value = pycompat.to_text(cell_value) xlsx_writer.write_cell(row_index + 1, cell_index, cell_value) return xlsx_writer.value