Odoo自定义发票超30行分页异常问题求助
解决Odoo自定义发票产品行超30行的分页问题
问题梳理
自定义Odoo发票模板时,产品行超过30行就会出现分页异常,产品内容和总金额、付款条款区域重叠。之前尝试在foreach循环里插入<div style="page-break-after: always;"/>,结果直接把整个表格拆分跳页,完全达不到预期效果。
解决方案
Odoo的QWeb报表分页不能直接破坏表格结构,得靠CSS和合理的模板逻辑配合实现:
1. 用表格空行触发分页(不破坏表格结构)
不要直接在产品行中间插分页元素,而是每30行添加一个跨所有列的空行来触发分页,同时避开最后一行,避免多出来空白页:
<!-- 产品行表格 --> <table> <thead> <!-- 你的表头代码 --> </thead> <tbody> <t t-foreach="invoice.invoice_line_ids" t-as="line"> <tr> <!-- 你的产品行内容,比如产品名称、数量、单价等 --> </tr> <!-- 每30行添加分页空行,最后一行跳过 --> <t t-if="line_index % 30 == 29 and line_index != (len(invoice.invoice_line_ids)-1)"> <tr> <td colspan="6" style="page-break-after: always; border: none; padding: 0;"></td> </tr> </t> </t> </tbody> </table>
注意:colspan的值要和你表格的列数一致,比如你的发票表格是6列就写6。
2. 锁定总金额和付款条款区域
给总金额、付款条款所在的容器加CSS,确保它不会被拆分,并且始终在最后一页:
<style> .invoice-footer { page-break-inside: avoid; page-break-before: auto; } .invoice-lines-table tr { page-break-inside: avoid; } </style> <!-- 总金额及付款条款区域 --> <div class="invoice-footer"> <!-- 你的总金额、付款条款代码 --> </div>
3. 参考标准发票模板逻辑(更稳妥)
Odoo自带的发票报表已经完美处理了分页,你可以参考account.report_invoice_document模板的实现:
- 先计算最大行数和总页数
- 按页数拆分产品行,每页渲染指定行数
- 确保页脚固定在最后一页
示例逻辑:
<t t-set="max_lines" t-value="30"/> <t t-set="total_pages" t-value="math.ceil(len(invoice.invoice_line_ids) / max_lines)"/> <t t-foreach="range(total_pages)" t-as="page"> <!-- 渲染当前页的表头 --> <table> <thead>...</thead> <tbody> <t t-foreach="invoice.invoice_line_ids[page*max_lines : (page+1)*max_lines]" t-as="line"> <tr>...</tr> </t> </tbody> </table> <!-- 非最后一页添加分页 --> <t t-if="page != total_pages - 1"> <div style="page-break-after: always;"/> </t> </t> <!-- 最后一页渲染总金额和付款条款 --> <div class="invoice-footer">...</div>
这种方式能精准控制每页的行数,彻底避免内容重叠问题。
内容的提问来源于stack exchange,提问作者Hassan Yousuf
相关产品推荐
相关产品推荐

