流程
添加一个导出的 act_window 到产品表,该 act_window 对应一个导出记录表的form视图,form视图定义了一个button,button点击生成一个excel并新开一个文件下载地址的url窗口。
创建导出记录表
由于导出按钮是跳转到对应的一个form视图,需要有一个导出文件的二进制字段提供下载,所以创建一个导出的model
xxxxxxxxxx
1
from odoo import fields, models, api
2
import base64
3
import xlwt
4
from io import BytesIO
5
6
7
class ExportWizard(models.Model):
8
_name = 'export.wizard'
9
10
file = fields.Binary('导出文件')
11
12
def generate_excel(self, product_ids):
13
"""
14
根据产品数据导出excel
15
:param product_ids: product.template()
16
:return:
17
"""
18
workbook = xlwt.Workbook(encoding='utf-8')
19
worksheet = workbook.add_sheet('产品清单)
20
21
# add header
22
header = ['编号', '名称', '单价', '单位']
23
for col in range(len(header)):
24
worksheet.write(0, col, header[col])
25
26
# add data
27
for row in range(1, len(product_ids)+1):
28
product_id = product_ids[row-1]
29
worksheet.write(row, 0, product_id.id)
30
worksheet.write(row, 1, product_id.name)
31
worksheet.write(row, 2, product_id.list_price)
32
worksheet.write(row, 3, product_id.uom_id.name)
33
34
# save
35
buffer = BytesIO()
36
workbook.save(buffer)
37
return base64.encodebytes(buffer.getvalue())
38
39
multi .
40
def action_export(self):
41
context = dict(self._context or {})
42
active_ids = context.get('active_ids', []) or []
43
product_tmpl_ids = self.env['product.template'].search([('id', 'in', active_ids)])
44
self.file = self.generate_excel(product_tmpl_ids)
45
46
value = dict(
47
type='ir.actions.act_url',
48
target='new',
49
url='/web/content?model=%s&id=%s&field=file&download=true&filename=product.xls' % (self._name, self.id),
50
)
51
return value
已复制
创建导出记录表的视图
xxxxxxxxxx
1
<record id="wizard_view" model="ir.ui.view">
2
<field name="name">export wizard</field>
3
<field name="model">export.wizard</field>
4
<field name="arch" type="xml">
5
<form string="导出记录">
6
<footer>
7
<button string="下载" class="btn-primary" name="action_export" type="object"/>
8
<button string="关闭" class="btn-default" special="cancel" />
9
</footer>
10
</form>
11
</field>
12
</record>
已复制
添加导出按钮到目标表的action(动作)下拉列表中
xxxxxxxxxx
1
<act_window id="export_wizard_action"
2
name="导出Excel"
3
src_model="product.template"
4
res_model="export.wizard"
5
view_type="form" view_mode="form"
6
target="new"/>
已复制
其中:
- src_model 表示在哪个 model 上添加这个 act_window
- res_model 表示这个 act_window 将会跳转到哪一个 model
- view_type res_model 显示的视图类型
- view_mode res_model 显示的视图种类列表
- target 视图在当前视图(src_model) 上的打开方式。
- 在当前视图上打开(current)
- 使用全屏模式(fullscreen)
- 使用弹出框(new)