diff --git a/web_export_view/static/src/js/web_export_view.js b/web_export_view/static/src/js/web_export_view.js
index 71cc034ff..4fa8db33c 100644
--- a/web_export_view/static/src/js/web_export_view.js
+++ b/web_export_view/static/src/js/web_export_view.js
@@ -88,7 +88,14 @@ odoo.define('web_export_view', function (require) {
? _t("True") : _t("False")
);
} else {
- var text = $cell.text().trim();
+ var is_m2m = $cell.hasClass('o_many2many_tags_cell');
+ if (is_m2m) {
+ var tags = $cell.find('span.o_badge_text');
+ var tags_text_list = tags.map((i, el) => el.innerText.trim()).get();
+ var text = tags_text_list.join('\n');
+ } else {
+ var text = $cell.text().trim();
+ }
var is_number =
$cell.hasClass('o_list_number') &&
!$cell.hasClass('o_float_time_cell');
diff --git a/web_export_view/static/tests/web_export_view_tests.js b/web_export_view/static/tests/web_export_view_tests.js
new file mode 100644
index 000000000..f096419d6
--- /dev/null
+++ b/web_export_view/static/tests/web_export_view_tests.js
@@ -0,0 +1,121 @@
+odoo.define('web_export_view.data_export_tests', function (require) {
+"use strict";
+
+var ListView = require('web.ListView');
+var testUtils = require('web.test_utils');
+
+var createView = testUtils.createView;
+
+QUnit.module('web_export_view', {
+ beforeEach: function () {
+ this.data = {
+ user: {
+ fields: {
+ name: {
+ string: "Name",
+ type: "char",
+ },
+ company_ids: {
+ string: "Companies",
+ type: "one2many",
+ relation: "company",
+ },
+ },
+ records: [
+ {
+ id: 1,
+ name: "User in all companies",
+ company_ids: [1, 2],
+ },
+ {
+ id: 2,
+ name: "User in company 1",
+ company_ids: [1],
+ },
+ {
+ id: 3,
+ name: "User in company 2",
+ company_ids: [2],
+ },
+ {
+ id: 4,
+ name: "User in no company",
+ company_ids: [],
+ },
+ ]
+ },
+ company: {
+ fields: {
+ name: {
+ string: "Name",
+ type: "char",
+ },
+ },
+ records: [
+ {
+ id: 1,
+ name: "Company 1",
+ display_name: "Display company 1",
+ },
+ {
+ id: 2,
+ name: "Company 2",
+ display_name: "Display company 2",
+ },
+ ]
+ },
+ };
+ }
+}, function () {
+
+ QUnit.test('Exporting many2many_tags widget', function (assert) {
+ var data_companies = this.data.company.records;
+ assert.expect(1 + data_companies.length);
+
+ var list = createView({
+ View: ListView,
+ model: 'user',
+ data: this.data,
+ arch:
+ '' +
+ '' +
+ '' +
+ '',
+ viewOptions: {
+ hasSidebar: true,
+ },
+ session: {
+ get_file: function (params) {
+ // Find line for user in all companies
+ var rows = JSON.parse(params.data.data).rows;
+ var file_companies_text = rows.find(r => r[0] === "User in all companies")[1];
+ var file_companies = file_companies_text.split('\n');
+
+ // Check that there is exactly one line per company
+ assert.equal(
+ file_companies.length,
+ data_companies.length,
+ "Companies field in file has as many lines as defined companies"
+ );
+ for (let data_company of data_companies) {
+ assert.ok(
+ file_companies.includes(data_company.display_name),
+ "Company " + data_company.id + " is exported"
+ );
+ }
+
+ params.complete();
+ },
+ },
+ });
+
+ // Select all lines and export
+ list.$('thead th.o_list_record_selector input').click();
+ list.sidebar.$("button.export_treeview_xls").click();
+
+ // Cleanup
+ list.destroy();
+ });
+});
+
+});
diff --git a/web_export_view/views/web_export_view_view.xml b/web_export_view/views/web_export_view_view.xml
index 4787238e8..37b8d7539 100644
--- a/web_export_view/views/web_export_view_view.xml
+++ b/web_export_view/views/web_export_view_view.xml
@@ -6,4 +6,9 @@
+
+
+
+
+