You need to enable JavaScript to run this app. Odoo 11 QWeb发票报表如何获取单页行数设置条件判断逻辑
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 11 QWeb发票报表如何获取单页行数设置条件判断逻辑

核心说明

Odoo 11的QWeb发票类报表,流程是服务端先把所有内容拼成完整HTML,再丢给wkhtmltopdf引擎转成PDF。整个服务端阶段根本感知不到PDF生成时的内容排布,不存在任何可以直接获取单页实际承载明细行数的原生接口。
你要做的固定行数分页,本质是自定义规则:由你自己定死单页固定放多少行明细,通过计数器在拼HTML的阶段主动插分页标记,不是等PDF生成完了再去读每页有多少行。

你现有代码的问题

你写的参考代码有三处硬伤,根本跑不通:

  • 没给计数器设初始值:第一次判断的时候计数器都是未定义状态,条件永远不会触发
  • 执行顺序错了:现在的逻辑是先判断要不要分页,再把计数器加1,就算初始化了计数器,也要等到第11行才触发分页,单页会多塞1行,完全错位
  • 作用域不对:把分页判断、计数器赋值写在明细循环外面,循环过程里拿不到最新的计数结果,计数器永远停在初始值不动
正确的固定行数分页实现

按照下面的结构写模板,就能实现每累计10行自动分页的效果:

<main>
    <!-- 明细循环开始前,先把计数器初始化设为0 -->
    <t t-set="row_counter" t-value="0"/>
    <!-- 遍历发票所有明细行 -->
    <t t-foreach="o.invoice_line_ids" t-as="line">
        <!-- 每轮循环先判断计数到没到分页阈值,计数为0的时候(也就是第一行)不触发分页 -->
        <t t-if="row_counter % 10 == 0 and row_counter != 0">
            <div style="page-break-after: always;"></div>
        </t>
        <!-- 渲染当前明细行的内容 -->
        <div class="invoice-line">
            <span t-esc="line.name"/>
            <span t-esc="line.quantity"/>
            <span t-esc="line.price_subtotal"/>
        </div>
        <!-- 本行渲染完成后,计数器加1 -->
        <t t-set="row_counter" t-value="row_counter + 1"/>
    </t>
</main>
实操注意点
  • 别花时间找什么读取单页实际行数的方法:wkhtmltopdf会根据行高、纸张边距、内容长度动态调整分页位置,服务端根本拿不到这些动态变化的值,严格控制单页行数只能靠主动插分页标记实现
  • 如果发现计数器不更新,检查是不是把计数器赋值写在了独立作用域块里(比如t-call调用的子模板、嵌套的iframe块),Odoo 11的QWeb作用域是静态继承的,跨作用域改的变量不会同步回父上下文
  • 分页标记一定要用page-break-after: always的行内样式,不要靠JS控制分页,PDF引擎解析HTML的时候会直接识别这个样式强制分页,JS的动态逻辑根本不会被PDF引擎执行

内容的提问来源于stack exchange,提问作者K.ju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 11:45:02