转载:http://book.odoomommy.com/chapter1/README10.html
第十一章 报表
报表引擎
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&value=%s&width=%s&height=%s&humanreadable=1' % ('Code128', object.quantity, 600, 50)" style="width:100%;height:4rem" alt="Barcode"/>
</td>
报表中的特殊字符
xml中不能出现特殊字符,像&、>,< 等符号需要转义:
字符 | 转移字符 |
---|---|
& | \& |
< | \< |
> | \> |
" | \" |
' | \' |
报表中日期字段的格式化
如果想要把模型中的datetime类型的字段格式化成date类型,那么可以使用t-options选项。
例子:
<span t-field="o.date_invoice" t-options='{"format": "MM/dd/yyyy"}'/>
报表样式文件
我们可以自己定义报表的样式,但是不是像普通的后台样式文件一样的继承方式,而是需要继承自web.report_assets_common。