Odoo12结合python xlrd模块进行Excel文件导入

测试模块为task_management,git地址为https://github.com/linmao13037/task_managment.git(代码将继续更新)。
task_management模块基于Odoo12社区版实现的一个模块,下载模块之后,秩序将其看作odoo的一个普通模块加载即可,此模块不依赖其他模块,可直接下载安装。
导入excel文件文章接着excel打印文章之后:task模型定义见前边文章,地址:https://blog.csdn.net/sinat_23931991/article/details/86096980

先上效果图:打印界面及下载的Excel内容截图:

Odoo12结合python xlrd模块进行Excel文件导入
Odoo12结合python xlrd模块进行Excel文件导入

根据导出的数据,填写信息之后导入系统中。

task模型代码不再赘述,task_import模型代码如下:

# -*- coding: utf-8 -*-

from datetime import datetime, timedelta
from odoo.tools import float_is_zero, float_compare, pycompat
from odoo import models, fields, api, _, SUPERUSER_ID
from odoo.exceptions import UserError, ValidationError
import base64
import xlrd
from io import BytesIO


class TaskImport(models.TransientModel):
    _name = "task.import"
    _description = "Task Import"

    file = fields.Binary('文件')


    @api.multi
    def action_import(self):
        """
        导入excel文件,按行读取数据并处理
        :return: 导入结果视图
        """
        if not self.file:
            return
        book = xlrd.open_workbook(file_contents=base64.decodebytes(self.file))
        sh = book.sheet_by_index(0)
        res_id = []
        for rx in range(1, sh.nrows):
            row = sh.row(rx)
            try:
                res = self.check_and_save(row)
            except:
                raise ValidationError(_('Excel文件错误,请检查excel文件是否符合导入模板格式!'))

            res_id.append(res)

        # 跳转到导入结果视图
        tree_view_id = self.env.ref('task_management.task_tree_view')
        form_view_id = self.env.ref('task_management.task_form_view')
        return {
            'name': _('任务管理'),
            'view_type': 'form',
            'view_mode': 'tree, form',
            'res_model': 'task',
            'views':  [[tree_view_id.id, 'list'], [form_view_id.id, 'form']],
            'type': 'ir.actions.act_window',
            'domain': [('id', 'in', res_id)],
            'context': {'clear_breadcrumbs': True}
        }

    def check_and_save(self, row):
        """
        校验并保存
        :param row: excel行
        :return: 任务对象id
        """
        develop_person = row[1].value if row[1].value else False
        code = row[2].value if row[2].value else False
        name = row[3].value if row[3].value else False
        start_time = datetime.strptime(str(row[4].value).strip(), '%Y/%m/%d') if row[4].value else False
        end_time = datetime.strptime(str(row[5].value).strip(), '%Y/%m/%d') if row[5].value else False
        working_hours = row[6].value if row[6].value else False
        actual_hours = row[7].value if row[7].value else False

        if develop_person and name:
            pass
        else:
            raise ValidationError("姓名和任务标题不能为空!")

        vals = {
                'develop_person': develop_person,
                'code': code,
                'name': name,
                'start_time': start_time,
                'end_time': end_time,
                'working_hours': working_hours,
                'actual_hours': actual_hours,
            }

        return self.env['task'].create(vals).id

增加导入界面:

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
     <record id="task_import_form" model="ir.ui.view">
        <field name="name">task_import_form</field>
        <field name="model">task.import</field>
        <field name="arch" type="xml">
            <form>
                <group string="导入Excel文件">
                    <field name="file"/>
                </group>
                <footer>
                    <button name="action_import" string="确认" type="object" class="oe_highlight"/>
                    or
                    <button string="取消" class="oe_link" special="cancel"/>
                </footer>
            </form>
        </field>
    </record>

    <act_window id="task_import_action"
                name="导入Excel文件"
                src_model="task"
                res_model="task.import"
                view_mode="form"
                target="new"
                view_id="task_import_form"
                key2="client_action_multi"/>
</odoo>

这些代码搞定之后,该引入引入,该加权限加权限(Odoo12的权限机制,csv文件中不定义该模型的权限是不会显示的)然后重启升级,即可看到上传按钮,点开之后选择上传文件,导入成功之后会跳转到导入信息界面。