自定义HTML报表 - xiaohao0576/odoo-doc GitHub Wiki

在Odoo Online版本,可以借助html报告做出自定义的网页,可以引入第三方的字体,css和javascript,基本上是完全自定义了页面。实现思路如下

创建一个 x_report自定义模型

模型包含以下字段

x_data , JSON类型,用于存储Python字典数据 x_json, TEXT类型,用于存储json字符串 x_name, Char,用于存储报表的名称

创建HTML报告

在x_report模型上,创建html报告,在qWeb中,可以引入第三方的css和js库,在odoo服务中取出动态数据,写入html中,供javascript生成动态页面,代码片断如下:

<html>
  <body>
    <script id="report-data" type="application/json">
      <t t-foreach="docs" t-as="doc">
        <t t-raw="doc.x_json" />
      </t>
    </script>
  </body>
</html>

在javascript中获取并加载数据

        // 获取并解析预加载的数据
        const reportDataScript = document.getElementById('report-data');
        const reportData = JSON.parse(reportDataScript.textContent);

创建服务器动作,提取和存储数据

在需要做报表的模型上,创建一个服务器动作,使用Python代码,可以做任意的数据提取和变换,甚至可以使用sql语句,直接从数据库取出数据。

提取出数据后,把数据保存到x_report中, 其中需要使用到json_dumps进行json序列化,示例代码如下

products = env['product.product'].search([], limit=10)

fields = ['name','barcode','list_price']
data = products.read(fields)


us = env['res.users.settings'].search([],limit=1)
json_dumps = us._fields['homemenu_config'].convert_to_export
json_str = json_dumps(data, us)

report = env['x_report'].create({
    'x_name': 'report01',
    'x_data': data,
    'x_json': json_str
})

服务动作返回url动作,指向HTML Report

服务器动作的action

# 定义 URL
url = f'https://your-domain.odoo.com/report/html/{report.x_name}/{report.id}'

# 创建 URL 动作
action = {
    'type': 'ir.actions.act_url',
    'url': url,
    'target': 'new'  # 在新的标签页中打开
}

优化方案

如果是日报,周报,不需要每次都查询数据库,准备新数据的,可以在服务器动作中,借助x_report数据行中的create_date, create_uid等字段,判断数据的有效期,如果可以直接使用,就没必要再重新提取转换数据,这起到了缓存的作用

还可以使用自动化动作,定期去更新x_reportx_datax_json字段,起到定期刷新数据的目的。

⚠️ **GitHub.com Fallback** ⚠️