odoo12主题现已集成了tree视图中默认导出当前xml视图的excel功能,例:
在xml中我们需要写上export_name属性
xxxxxxxxxx
14
1
<record model="ir.ui.view" id="user_borrow.level_list">
2
<field name="name">level list</field>
3
<field name="model">user_borrow.level</field>
4
<field name="arch" type="xml">
5
<tree export_name="导出文件名称"> <!--这个是导出的xls文件名称,不用后缀-->
6
<field name="name" string="等级"/>
7
<field name="level_day_salary" string="日工资"/>
8
<field name="travel_on_business_day_salary" string="日差旅费"/>
9
<field name="create_uid" string="创建人"/>
10
<field name="create_date" string="创建时间"/>
11
<widget name="system_settings_tree_buttons" string="操作" template="lever_del_buttons"/>
12
</tree>
13
</field>
14
</record>
已复制
此时在tree视图中,选择了相应的记录之后,会出现下拉选项「导出」,这个导出已经不是odoo自带的导出了

点击即可下载和当前tree视图字段相匹配的excel。
扩展:
如果想自定义下载的文件内容,只需要在相应的model模型下重新导出方法即可,以下是原有函数,重写时需要注意return一个xlwt.Workbook()对象即可
xxxxxxxxxx
54
1
import xlwt
2
3
model .
4
def export_select_records(self, res_ids, fields, export_name):
5
'''
6
导出指定记录到excel
7
:param self:
8
:param res_ids: [1, 2, 3, 4] 或 字符串的'all'
9
:param fields: {'name': '名称', 'create_date': '创建日期'....}
10
:param export_name: tree_xml中的export_name属性,文件名是在前端确定,这里只是用来区分是从哪个tree视图导出
11
:return: xlwt.Workbook()
12
'''
13
workbook = xlwt.Workbook()
14
sheet1 = workbook.add_sheet('sheet1')
15
model_fields = self._fields
16
records = self.browse(res_ids) if res_ids != 'all' else self.search([])
17
row_index = 0
18
for record in records:
19
col_index = 0
20
if row_index == 0:
21
# 表格抬头
22
for field_name in fields:
23
sheet1.write(row_index, col_index, fields[field_name])
24
col_index += 1
25
row_index += 1
26
col_index = 0
27
for field_name in fields:
28
if isinstance(model_fields[field_name], Selection):
29
selections = dict(model_fields[field_name].selection)
30
value = selections[record[field_name]] if record[field_name] is not False else ''
31
elif isinstance(model_fields[field_name], Many2one):
32
value = record[field_name].display_name or ''
33
elif isinstance(model_fields[field_name], Many2many) or isinstance(model_fields[field_name], One2many):
34
if len(record[field_name]) == 0:
35
value = ''
36
else:
37
value = ','.join([i.display_name for i in record[field_name]])
38
elif isinstance(model_fields[field_name], Date) or isinstance(model_fields[field_name], Datetime):
39
type_map = {'datetime': '%Y年%m月%d日 %H时%M分%S秒', 'date': '%Y年%m月%d日'}
40
# 时间字段为False时需要判断,否则dt.datetime会报错
41
if record[field_name] is not False:
42
if field_name in ['create_date', 'write_date']:
43
value = dt.datetime.strftime(
44
record[field_name] + dt.timedelta(hours=8), type_map[model_fields[field_name].type])
45
else:
46
value = dt.datetime.strftime(record[field_name], type_map[model_fields[field_name].type])
47
else:
48
value = ''
49
else:
50
value = record[field_name] or ''
51
sheet1.write(row_index, col_index, value)
52
col_index += 1
53
row_index += 1
54
return workbook
已复制
扩展2:
如果不想使用选择的形式导出,想导出指定id或者全部的记录,在前端ListController中调用以下方法即可
xxxxxxxxxx
28
1
/**
2
* 根据选择的记录的ids下載excel模板
3
* @param records 需要下载excel的对应的记录的res_ids => [1, 2, 3...], 如果是下载所有记录,则此records参数值为字符串'all', 如果没有传此参数则读取选择项
4
*/
5
_onExportSelectedRecords: function (active, records, name) {
6
var self = this;
7
var fields_list = []; // 有序字段
8
if (!records) {
9
records = _.map(this.selectedRecords, function (id) {
10
return self.model.localData[id].res_id;
11
});
12
}
13
_.forEach(self.renderer.columns, function (item) {
14
if (item.tag === 'field') {
15
var fields = {};
16
fields[item.attrs.name] = item.attrs.string ? item.attrs.string : self.renderer.state.fields[item.attrs.name].string
17
fields_list.push(fields)
18
}
19
});
20
self.download_template_excel({
21
url: '/layui_theme_odoo12/export_select_records',
22
name: name || (self.activeActions['export'] + self.pager.state.current_min + '-' + self.pager.state.current_max),
23
params: 'records=' + JSON.stringify(records) + '&fields=' + JSON.stringify(fields_list) + '&model=' + self.modelName + '&export_name=' + self.activeActions['export']
24
})
25
},
26
27
28
ListController._onExportSelectedRecords(null, 'all')
已复制