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