在odoo
中的tree
、form
视图的动作菜单中添加自定义导出excel
按钮
一、定义需要打印的数据模型
class demo_user(models.Model):
_name = 'demo.user'
_description = '用户'
name = fields.Char('姓名')
sex = fields.Char('性别')
age = fields.Integer('年龄')
二、定义文件向导模型
from odoo import models, fields, api
import base64
import xlwt
from io import BytesIO
class UserExport(models.TransientModel):
_name = "user.export"
_description = "导出成excel"
file = fields.Binary('文件')
三、添加按钮到视图动作菜单中
创建xml
文件添加动作
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="excel_user_export_action" model="ir.actions.server">
<field name="name">导出Excel</field>
<field name="model_id" ref="模块名.model_user_export"/>
<field name="binding_model_id" ref="模块名.model_demo_user"/>
<field name="state">code</field>
<field name="code">
action = env['user.export'].action_export_data()
</field>
</record>
</odoo>
四、创建excel模板
在文件向导模型中添加generate_excel()
函数,用来自定义excel文件样式
def generate_excel(self, task_ids):
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('任务清单')
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = '宋体' # 字体
font.bold = True # 加粗
font.height = 20 * 10 # 字体大小
style.font = font # 为样式设置字体
# 添加列的标题
header = ['姓名', '性别', '年龄']
for col in range(len(header)):
worksheet.write(0, col, header[col], style)
row = 1
for line in task_ids[0]:
worksheet.write(row, 0, line.name if line.name else '')
worksheet.write(row, 1, line.sex if line.sex else '')
worksheet.write(row, 2, line.age if line.age else '')
row = row + 1
# 保存
buffer = BytesIO()
workbook.save(buffer)
return base64.encodebytes(buffer.getvalue())
五、导出excel
在文件向导模型中创建导出函数,调用模板函数,然后导出excel文件
@api.multi
def action_export_data(self):
# 获取id
context = dict(self._context or {})
task_ids = context.get('active_ids')
# 查出数据
task_ids = self.env['demo.user'].browse(task_ids)
# 调用自定义excel模板
res = self.create({'file': self.generate_excel(task_ids)})
file_name = '自定义文件名'
excel_url = '/web/content?model=%s&id=%s&field=file&download=true&filename=%s.xls' % (self._name, res.id, file_name)
value = dict(
type = 'ir.actions.act_url',
target = 'self',
url = excel_url,
)
return value