odoo12学习——自定义导出excel

2,824 阅读1分钟

odoo中的treeform视图的动作菜单中添加自定义导出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