【零散技术】10分钟学会Odoo导出自定义excel报表

序言:时间是我们最宝贵的财富,珍惜手上的每个时分

        Odoo默认使用Qweb语法编写打印模版,打印后导出的是PDF格式的数据。

        但是PDF文件不能修改内容,无法满足所有业务情况,此时Excel高度自定义的优势就凸显出来了。所以Odoo导出自定义 Excel格式的需求是迫切且必要的。

        本文即开始介绍,如何通过odoo导出一个自定义excel报表    

一.模块结构 

├── __init__.py
├── __manifest__.py
├── controller
│   ├── __init__.py
│   └── main.py
├── security
│   └── ir.model.access.csv
└── wizard
    ├── __init__.py
    ├── account_daily_report_wizard.py
    └── account_daily_report_wizard_view.xml

由__manifest__.py可见我们仅仅是加载了一个wizard视图,该wizard视图的用处是用于筛选条件并下载excel文件

# -*- coding: utf-8 -*-
{
    'name': "ro_account_daily_report",
    'summary': """
        发票统计\n
        1) 可以选择时间区间,不区分地区\n
        2) 只能选择某日,区分地区\n
    """,
    'description': """
        发票统计
    """,

    'author': "RO Team",
    'website': "https://www.ro-cd.com",
    'category': 'Uncategorized',
    'version': '0.1',
    'depends': ['base', 'account'],
    'data': [
        'security/ir.model.access.csv',
        'wizard/account_daily_report_wizard_view.xml',
    ],
}

二.关键代码

        关键代码有两部分组成:

        1.下载访问,wizard中通过按钮触发 ir.actions.act_url 请求接口。接口返回excel文件下载。

from odoo import api, fields, models
from datetime import timedelta


class AccountDailyReportWizard(models.TransientModel):
    _name = 'account.daily.report.wizard'
    _description = '发票统计'

    from_date = fields.Date('From Date', default=fields.Date.today() - timedelta(days=1))
    to_date = fields.Date('To Date', default=fields.Date.today())
    single_date = fields.Date('Date', default=fields.Date.today())
    area = fields.Selection([('factory', '工厂'), ('tangmen', '唐门'), ('famen', '法门')], string='地区')

    # 发票月报
    def button_account_daily_report(self):
        return {
            'type': 'ir.actions.act_url',
            'url': '/account_daily_report?from_date=%s&to_date=%s' % (str(self.from_date), str(self.to_date)),
            'target': 'new',
            'tfs_close': True
        }

    # 发票日报
    def button_area_account_daily_report(self):
        return {
            'type': 'ir.actions.act_url',
            'url': '/area_account_daily_report?from_date=%s&to_date=%s&area=%s' % (
                str(self.single_date), str(self.single_date + timedelta(days=1)), self.area),
            'target': 'new',
            'tfs_close': True
        }

        2.通过接口生成excel,我们的关键是 controller/main.py中的接口。如下的示例代码,可以直接拷贝使用,浏览器访问 odoo地址/test_excel(例如:localhost:8069/test_excel)即可得到目标excel文件。

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

import json
import logging

from odoo import http,fields

_logger = logging.getLogger(__name__)
from odoo.http import content_disposition, request
import xlsxwriter
import io


class TestExcel(http.Controller):
    @http.route(['/test_excel'], type='http', auth="public")
    def test_excel(self, **kw):
        
        headings = ['', '', '', '入库面单', '', '', '', '']
        lines = [
            ['备注'],
            ['到达时间', '仓库名称', '车号', '箱号', '预收重量', '/', '实际重量', '实际件数'],
        ]
        

        output = io.BytesIO()
        workbook = xlsxwriter.Workbook(output, {'in_memory': True})
        bold = workbook.add_format({'bold': 1})

        worksheet = workbook.add_worksheet('sheet1')
        worksheet.write_row('A1', headings, bold)
        for row_num, row_data in enumerate(lines):
            worksheet.write_row(row_num + 1, 0, row_data)

        border_format = workbook.add_format({
            'border': 1,
            'align': 'left',
            'font_size': 10
        })
        worksheet.set_column('A:H', 12, border_format)

        workbook.close()
        output.seek(0)
        file_name ='测试excel'+ '.xlsx'
        response = request.make_response(
            None,
            headers=[
                ('Content-Type', 'application/vnd.ms-excel'),
                ('Content-Disposition', content_disposition(file_name))
            ]
        )
        response.stream.write(output.read())
        output.close()
        return response

三.说在最后

        也许复制粘贴就已经完成了实际需求,但是实际上还是有不少细节是可以深入学习的,比如

                1.odoo http response

                2.odoo 的 ir.actions

        odoo是一个十分开放的框架,所有主流技术都可以在此运用;将odoo层层剥开,你会发现它极高的技术拓展性。

odoo开发部署实施.

wx号: _ro_cd

你可能感兴趣的:(python,odoo,后端,python,odoo)