Odoo10参考系列--QWeb报表

本文介绍了如何在Odoo中创建和定制报表,包括定义报表模板、使用特定变量、实现多语言支持、添加条形码等内容,并提供了报表格式及自定义报表类的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报表是写在HTML / QWeb中,像Odoo中的所有普通视图。你可以使用普通QWeb 流程控制工具。PDF的渲染是通过wkhtmltopdf执行的。

如果要在某个模型上创建报表,则需要定义该报表和它将使用的报表模板。如果您愿意,还可以为该报表指定特定的报表格式。最后,如果您需要访问更多的模型,您可以定义一个自定义报表类,让您访问模板中的更多模型和记录

报表

每个报表都必须通过报告操作(在odoo10参考系列--操作(Actions)中有介绍)声明。

为简单起见,可以使用快捷方式<report>元素来定义报表,而不必手动设置操作及其环境。<report> 可以具有以下属性:

id

生成的记录的外部id

name (强制性的)

仅仅当查询一些列表中某个列表记录时作为报表的一个记忆/描述是有用的

model (强制性的)

你报表将从事的模型

report_type (强制性的)

要么是针对PDF报表的 qweb-pdf 要不是针对HTML的 qweb-html 

report_name

报表的名称(它将是PDF输出的名称)

groups

Many2many 字段到允许查看/使用当前报表的组中

attachment_use

如果设置为True,则报告将使用attachment表达式生成的名称作为记录的附件存储;如果您只需要生成一次报告(例如出于法律原因),您可以使用它

attachment

定义报表名称的Python表达式;记录作为变量object是可访问的

paperformat

你希望使用的报表格式的外部id(如果不指定默认为公司的报表格式)

例子:

<report
    id="account_invoices"
    model="account.invoice"
    string="Invoices"
    report_type="qweb-pdf"
    name="account.report_invoice"
    file="account.report_invoice"
    attachment_use="True"
    attachment="(object.state in ('open','paid')) and
        ('INV'+(object.number or '').replace('/','')+'.pdf')"
/>

报表模版

最小可行的模板

最小的模板看起来像:

<template id="report_invoice">
    <t t-call="report.html_container">
        <t t-foreach="docs" t-as="o">
            <t t-call="report.external_layout">
                <div class="page">
                    <h2>Report title</h2>
                    <p>This object's name is <span t-field="o.name"/></p>
                </div>
            </t>
        </t>
    </t>
</template>

调用external_layout 将在报表中添加默认页眉和页脚。PDF正文将是<div class="page">内部的内容。模版的 id 必须是报表声明中指定的名称; 例如上面报表中的 account.report_invoice 。由于这是一个QWeb模板,你可以访问所有被模版接收的docs对象的字段。

报表中有一些特定的变量可以访问,主要是:

docs

当前报表的记录

doc_ids

docs 记录的id列表

doc_model

docs 记录模型

time

来自Python标准库的time参考

user

用户打印报表的res.user记录

res_company

当前user的公司记录

如果您希望访问模板中的其他记录/模型,则需要一个自定义报表

可翻译的模版

如果您希望将报表转换为合作伙伴的语言,则需要定义两个模板:

  • 主报表模板
  • 翻译的文件

然后你可以从你的主模版中调用翻译文件,这个模版带有一个设置语言代码(例如fr 或 en_US)或者记录字段的属性t-lang。你也将需要重新浏览与适当的上下文相关的记录,如果你使用的是可译的字段(如国家名、销售条件等)

警告

如果你的报告模板不使用翻译的记录字段,再浏览其他语言记录是不必要的,会影响性能

例如,让我们看看销售模块的销售订单报表:

<!-- Main template -->
<template id="report_saleorder">
    <t t-call="report.html_container">
        <t t-foreach="docs" t-as="doc">
            <t t-call="sale.report_saleorder_document" t-lang="doc.partner_id.lang"/>
        </t>
    </t>
</template>

<!-- Translatable template -->
<template id="report_saleorder_document">
    <!-- Re-browse of the record with the partner lang -->
    <t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})" />
    <t t-call="report.external_layout">
        <div class="page">
            <div class="oe_structure"/>
            <div class="row">
                <div class="col-xs-6">
                    <strong t-if="doc.partner_shipping_id == doc.partner_invoice_id">Invoice and shipping address:</strong>
                    <strong t-if="doc.partner_shipping_id != doc.partner_invoice_id">Invoice address:</strong>
                    <div t-field="doc.partner_invoice_id" t-options="{&quot;no_marker&quot;: True}"/>
                <...>
            <div class="oe_structure"/>
        </div>
    </t>
</template>

The主模版调用翻译使用 doc.partner_id.lang作为t-lang 参数的模版,那么它将用合作伙伴的原因渲染。这样,每个销售订单将以相应客户的语言打印。 如果您只想翻译文档的主体,但将页眉和页脚保留在默认的语言中,可以用以下方式调用报表的外部布局:

<t t-call="report.external_layout" t-lang="en_US">

提示

请注意,这只有在调用外部模版是有效的,你将不能通过设置一个在xml节点上的t-lang属性而不是 t-call属性去翻译文件的一部分。 如果你要翻译模板的一部分,你可以使用这个模版部分来创建一个外部模版并从使用t-lang属性的主模版中调用它。

条码

条码是由一个控制器返回的图片,可以很容易地嵌入到QWeb语法报告:

<img t-att-src="'/report/barcode/QR/%s' % 'My text in qr code'"/>

可以将更多参数作为查询字符串传递

<img t-att-src="'/report/barcode/?
    type=%s&value=%s&width=%s&height=%s'%('QR', 'text', 200, 200)"/>

有用的备注

  • Twitter Bootstrap和FontAwesome类可以用在你的报告模板
  • 本地的CSS可以直接放在模板中
  • 通过继承模板并插入CSS,可以在主报表布局中插入全局CSS:

    <template id="report_saleorder_style" inherit_id="report.style">
      <xpath expr=".">
        <t>
          .example-css-class {
            background-color: red;
          }
        </t>
      </xpath>
    </template>
    
  • 如果您的PDF报告缺少样式,请检查这些说明

报表格式

报表格式是report.paperformat的记录并包含以下属性:

name (强制性的)

仅仅当查询一些列表中某个列表记录时作为报表的一个记忆/描述是有用的

description

对格式的小描述

format

要么是一个预定义的格式(A0 to A9, B0 to B10, Legal, Letter, Tabloid,...) 要么是 custom;默认是A4格式。如果定义页面尺寸,则不能使用非自定义格式

dpi

输出的DPI;默认是90

margin_topmargin_bottommargin_leftmargin_right

毫米的边距尺寸

page_heightpage_width

毫米的页面尺寸

orientation

竖向

header_line

布尔值以显示标题行

header_spacing

毫米的头间距

例子:

<record id="paperformat_frenchcheck" model="report.paperformat">
    <field name="name">French Bank Check</field>
    <field name="default" eval="True"/>
    <field name="format">custom</field>
    <field name="page_height">80</field>
    <field name="page_width">175</field>
    <field name="orientation">Portrait</field>
    <field name="margin_top">3</field>
    <field name="margin_bottom">3</field>
    <field name="margin_left">3</field>
    <field name="margin_right">3</field>
    <field name="header_line" eval="False"/>
    <field name="header_spacing">3</field>
    <field name="dpi">80</field>
</record>

定制报表

报表模型有一个默认的get_html 函数用以查询一个名叫report.module.report_name的模版。如果它存在,它将使用它去调用QWeb引擎;否则将使用一个通用的函数。如果您希望通过在模板(例如,像其他模型的记录)中包含更多的内容来定制报表,你可以定义这个模型,重写函数 render_html 并在docargs字典中传递对象:

from odoo import api, models

class ParticularReport(models.AbstractModel):
    _name = 'report.module.report_name'
    @api.model
    def render_html(self, docids, data=None):
        report_obj = self.env['report']
        report = report_obj._get_report_from_name('module.report_name')
        docargs = {
            'doc_ids': docids,
            'doc_model': report.model,
            'docs': self,
        }
        return report_obj.render('module.report_name', docargs)

报表是网页

报表由报表模块动态生成,可以通过URL直接访问:

例如, 您可以通过HTML方式访问销售订单报报表: http://<server-address>/report/html/sale.report_saleorder/38

或者你可以访问pdf版本:http://<server-address>/report/pdf/sale.report_saleorder/38

 

ps:有翻译不当之处,欢迎留言指正。

原文地址:https://www.odoo.com/documentation/10.0/reference/reports.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值