序言:时间是我们最宝贵的财富,珍惜手上的每个时分
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