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内容截图:

在这里插入图片描述
在这里插入图片描述

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

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文件中不定义该模型的权限是不会显示的)然后重启升级,即可看到上传按钮,点开之后选择上传文件,导入成功之后会跳转到导入信息界面。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在iTextSharp上做了个二次开发,导出PDF更方便,iTextExport.dll是自己做的二次开发库,里面主要有三个类:PdfExport、ExcelExport、ReportPrint,它们分别实现导出Pdf、导出Excel和rdlc报表的直接打印和预览,基本调用方法: 1、PdfExport exp = new PdfExport(fileName, DataTable | DataGridView); exp.ExportTitle = "标题"; exp.[其它属性设置]=; exp.ExecuteExport(); 2、Excel和Pdf类似调用 3、如果要一次导出多个,可以如下: ExportFactory.Instance().ExportList.Add(exp); ExportFactory.Instance().ExportList.Add(exp); ExportFactory.Instance().ExportList.Add(exp); ....... ExportFactory.Instance().DoExport(); 4、多数据源报表打印 ReportPrint rpt = new ReportPrint("报表文件或者嵌入的报表资源名"); //是否是嵌入报表 rpt.IsEmbeddedReport = true; //是否自动调整数据源,对于打印的数据表和报表定义中的字段不同时 rpt.AutoAdjustData = false; //是否报表中含有多个数据源 rpt.IsMultiDataSource = true; rpt.ReportDataSources.Add(new ReportDataSource("T1",dt1)); rpt.ReportDataSources.Add(new ReportDataSource("T2", dt2)); rpt.StartPrint(); rpt.Dispose(); 5、单数据源报表打印 //报表参数 List _paras = new List(); _paras.Add(new ReportParameter("rptLsh", "A1")); _paras.Add(new ReportParameter("rptDjh", "A2")); ReportPrint rpt = new ReportPrint("Test.rdlc", dt); rpt.IsEmbeddedReport = false; rpt.AutoAdjustData = false; rpt.ReportParameters = _paras; rpt.StartPrint();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值