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


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

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

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

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

    一.模块结构 

    1. ├── __init__.py
    2. ├── __manifest__.py
    3. ├── controller
    4. │   ├── __init__.py
    5. │   └── main.py
    6. ├── security
    7. │   └── ir.model.access.csv
    8. └── wizard
    9. ├── __init__.py
    10. ├── account_daily_report_wizard.py
    11. └── account_daily_report_wizard_view.xml

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

    1. # -*- coding: utf-8 -*-
    2. {
    3. 'name': "ro_account_daily_report",
    4. 'summary': """
    5. 发票统计\n
    6. 1) 可以选择时间区间,不区分地区\n
    7. 2) 只能选择某日,区分地区\n
    8. """,
    9. 'description': """
    10. 发票统计
    11. """,
    12. 'author': "RO Team",
    13. 'website': "https://www.ro-cd.com",
    14. 'category': 'Uncategorized',
    15. 'version': '0.1',
    16. 'depends': ['base', 'account'],
    17. 'data': [
    18. 'security/ir.model.access.csv',
    19. 'wizard/account_daily_report_wizard_view.xml',
    20. ],
    21. }

    二.关键代码

            关键代码有两部分组成:

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

    1. from odoo import api, fields, models
    2. from datetime import timedelta
    3. class AccountDailyReportWizard(models.TransientModel):
    4. _name = 'account.daily.report.wizard'
    5. _description = '发票统计'
    6. from_date = fields.Date('From Date', default=fields.Date.today() - timedelta(days=1))
    7. to_date = fields.Date('To Date', default=fields.Date.today())
    8. single_date = fields.Date('Date', default=fields.Date.today())
    9. area = fields.Selection([('factory', '工厂'), ('tangmen', '唐门'), ('famen', '法门')], string='地区')
    10. # 发票月报
    11. def button_account_daily_report(self):
    12. return {
    13. 'type': 'ir.actions.act_url',
    14. 'url': '/account_daily_report?from_date=%s&to_date=%s' % (str(self.from_date), str(self.to_date)),
    15. 'target': 'new',
    16. 'tfs_close': True
    17. }
    18. # 发票日报
    19. def button_area_account_daily_report(self):
    20. return {
    21. 'type': 'ir.actions.act_url',
    22. 'url': '/area_account_daily_report?from_date=%s&to_date=%s&area=%s' % (
    23. str(self.single_date), str(self.single_date + timedelta(days=1)), self.area),
    24. 'target': 'new',
    25. 'tfs_close': True
    26. }

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

    1. # -*- coding: utf-8 -*-
    2. import json
    3. import logging
    4. from odoo import http,fields
    5. _logger = logging.getLogger(__name__)
    6. from odoo.http import content_disposition, request
    7. import xlsxwriter
    8. import io
    9. class TestExcel(http.Controller):
    10. @http.route(['/test_excel'], type='http', auth="public")
    11. def test_excel(self, **kw):
    12. headings = ['', '', '', '入库面单', '', '', '', '']
    13. lines = [
    14. ['备注'],
    15. ['到达时间', '仓库名称', '车号', '箱号', '预收重量', '/', '实际重量', '实际件数'],
    16. ]
    17. output = io.BytesIO()
    18. workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    19. bold = workbook.add_format({'bold': 1})
    20. worksheet = workbook.add_worksheet('sheet1')
    21. worksheet.write_row('A1', headings, bold)
    22. for row_num, row_data in enumerate(lines):
    23. worksheet.write_row(row_num + 1, 0, row_data)
    24. border_format = workbook.add_format({
    25. 'border': 1,
    26. 'align': 'left',
    27. 'font_size': 10
    28. })
    29. worksheet.set_column('A:H', 12, border_format)
    30. workbook.close()
    31. output.seek(0)
    32. file_name ='测试excel'+ '.xlsx'
    33. response = request.make_response(
    34. None,
    35. headers=[
    36. ('Content-Type', 'application/vnd.ms-excel'),
    37. ('Content-Disposition', content_disposition(file_name))
    38. ]
    39. )
    40. response.stream.write(output.read())
    41. output.close()
    42. return response

    三.说在最后

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

                    1.odoo http response

                    2.odoo 的 ir.actions

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

    odoo开发部署实施.

    wx号: _ro_cd

  • 相关阅读:
    Kubernetes云原生实战02 对节点磁盘进行分区挂载
    『无为则无心』Python日志 — 64、Python日志模块logging介绍
    学习机器学习需要哪些数学知识?
    【斗罗2】天梦哥抓捕冰帝,霍雨浩与她完美融合,喜提五挂
    Flask数据库_filter过滤器的使用
    【JS高级】js面向对象三大特性之多态_07
    【iOS_锁】
    回调函数的用法与注意事项
    面试题c/c++ --STL 算法与数据结构
    netplan说明[整理篇]
  • 原文地址:https://blog.csdn.net/Srekal/article/details/126481014