第十一章 报表

报表引擎

odoo的报表引擎使用的是QWeb,关于QWeb的的更多内容,会在第二部分中有单独的篇章介绍,目前只需要知道,QWeb是odoo自己开发的一套模板渲染引擎即可。

创建报表

下面介绍一下编写报表的步骤

定义报表动作

首先,我们需要定义一个报表:

<record model="ir.actions.report" id="sale_tag_report.report">
    <field name="name">标签打印</field>
    <field name="model">sale.order</field>
    <field name="report_type">qweb-pdf</field>
    <field name="report_name">sale_tag_report.tag</field>
    <field name="print_report_name">(object.name)</field>
    <field name="binding_model_id" ref="sale.model_sale_order"/>
</record>

报表定义有简化的写法:

<report id="report_product_packaging"
            string="Product Packaging (PDF)"
            model="product.packaging"
            report_type="qweb-pdf"
            name="product.report_packagingbarcode"
            file="product.report_packagingbarcode"
            print_report_name="'Products packaging - %s' % (object.name)"/>

这在系统中将会生成一条记录(系统设置-技术-报表):

其中,binding_model_id决定了该按钮绑定在那个模型上面显示。

绘制报表页面

Odoo的报表页面想要自己画还是比较繁琐的,通常我们可以参考既有的报表格式进行参照修改。

看一个我自己写的报表页面:

<template id="sale_tag_report.tag" name="sale_tag_report.tag">
    <t t-call="web.html_container">
        <div class="article o_report_layout_clean">
            <t t-raw="0"/>
            <t t-foreach="docs" t-as="doc">
                <t t-foreach="doc.order_line" t-as="line">
                    <div class="page" style="page-break-before: always;">
                        <h1>
                            <t t-esc="line.sale_collection"/>
                        </h1>
                        <div>
                            <strong>面料号:</strong>
                            <p t-field="line.product_id.name"/>
                        </div>
                        <div>
                            <strong>数量:</strong>
                            <p t-field="line.product_uom_qty"/>
                        </div>
                        <div>
                            <strong>客户名称:</strong>
                            <p t-field="doc.partner_id.name"/>
                        </div>
                        <div>
                            <strong>备注:</strong>
                            <p t-field="line.client_description"/>
                        </div>
                    </div>
                </t>
            </t>
        </div>
    </t>
</template>
  • web.html_container: 是我们编写报表最外层的嵌套容器,直接引用即可。
  • docs:报表默认会将我们绑定的模型当前记录赋值给变量docs,我们在编写报表时可以直接引用
  • style="page-break-before: always;" : 将页面分隔,每页一条记录。

这样就完成了一个简单的报表编写过程。关于报表,其实还有纸张格式、变量赋值等更多更深的内容,后边会讲到。

修改报表

对于我们需要修改的报表,可以在设置中-动作-报表中根据模型找到对应的模板文件。

由上图中的按钮Qweb视图可以找到对应的Qweb代码文件,我们可以通过修改Qweb代码的方式来修改报表。

修改报表字体

想要修改PDF的报表字体,只需要在div的样式表中添加如下的样式:

<div class="font-size: 35px !important;">
</div>

报表的修改通常是个耗费时间精力的事情,读者要是没有耐心,亦可选购笔者提供的报表修改服务

在报表中添加条码

odoo中内置了在报表中添加条码的功能,原理很简单,即使用img标签,将带有条码的URL链接添加到img的url属性中。

@http.route(['/report/barcode', '/report/barcode/<type>/<path:value>'], type='http', auth="public")
def report_barcode(self, type, value, width=600, height=100, humanreadable=0, quiet=1):
    pass

从源代码层面上分析可以得出,条码的引用接受6个参数:

  • type: 可选的参数有 'Codabar', 'Code11', 'Code128', 'EAN13', 'EAN8', 'Extended39',
      'Extended93', 'FIM', 'I2of5', 'MSI', 'POSTNET', 'QR', 'Standard39', 'Standard93',
      'UPCA', 'USPS_4State'
    
  • value: 生成的条码内容
  • width: 条码宽度
  • height: 条码高度
  • humanreadable: 0 或 1,是否在条码中添加可读性文本
  • quiet: 0 或 1,是否添加页面留白

例如:

<td>
<img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=1' % ('Code128', object.quantity, 600, 50)" style="width:100%;height:4rem" alt="Barcode"/>
</td>

报表中的特殊字符

xml中不能出现特殊字符,像&、>,< 等符号需要转义:

字符 转移字符
& \& amp;
< \& lt;
> \& gt;
" \& quot;
' \& apos;

&和amp;中间没有空格

报表中日期字段的格式化

如果想要把模型中的datetime类型的字段格式化成date类型,那么可以使用t-options选项。

例子:

<span t-field="o.date_invoice" t-options='{"format": "MM/dd/yyyy"}'/>

报表样式文件

我们可以自己定义报表的样式,但是不是像普通的后台样式文件一样的继承方式,而是需要继承自web.report_assets_common。

results matching ""

    No results matching ""