odoo创建PDF报表

生成报表是odoo里面必备的功能

在这里插入图片描述

前置条件

第一步 安装wkhtmltopdf

下载链接(https://wkhtmltopdf.org/downloads.html)

第二步 添加系统路径

在这里插入图片描述
在这里插入图片描述

第三步 odoo配置

在odoo.conf下,加入如下内容,让odoo识别这个插件

bin_path = C:\Program Files\wkhtmltopdf\bin

运行后,如果后台出现这么一句话,就说明环境配置完成
在这里插入图片描述

第四步 创建report文件夹 配置报表action

在这里插入图片描述
在report定义 不然是不会显示打印的 就跟定义一个菜单动作差不多的意思(个人理解)

<odoo>
    <record id="action_fixed_assets_detail_report"
        model="ir.actions.report">
        <field name="name">固定资产转移单(PDF)</field>
        <field name="model">fixed.assets.transfer.form</field>
        <field name="report_type">qweb-html</field>
        <field name="report_name">workform.fixed_assets_transfer_form_template</field>
        <field name="report_file">workform.fixed_assets_transfer_form_template</field>
        <field name="binding_model_id"
               ref="model_fixed_assets_transfer_form"/>
        <field name="binding_type">report</field>
    </record>
    <odoo/>
  1. 基本属性 :
  • model=“ir.actions.report” :表示这是一个报表动作
  • name=“固定资产转移单(PDF)” :报表显示名称
  • model=“fixed.assets.transfer.form” :报表关联的数据模型
  1. 报表配置 :
  • report_type=“qweb-html” :使用QWeb模板引擎生成HTML格式报表
  • qweb-html:点击会先预览 qweb-pdf:直接下载 不会预览
  • report_name 和 report_file :指定报表模板路径为 workform.fixed_assets_transfer_form_template(这两个数据一致 我也不知道为啥要一样 教程上写得)
  1. 绑定设置 :
    binding_model_id :通过ref属性绑定到固定资产转移单模型
    binding_type=“report” :指定为报表类型的绑定
  2. 实现原理 :这个报表动作会从 fixed.assets.transfer.form 模型获取数据使用 workform.fixed_assets_transfer_form_template 模板渲染HTML自动转换为PDF格式输出
  3. 使用方式 :在固定资产转移单的表单或列表视图中,会出现"打印"按钮,点击后即可生成PDF报表。

配置报表模板

在这里插入图片描述

一般格式都是这样

<odoo>
    <template id="fixed_assets_transfer_form_template">
	    <t t-call="web.html_container">
		    <t t-call="web.internal_layout">
			    <t t-foreach="docs" t-as="doc">
				    <div class="page">
				    </div>
			     </t>
		    </t>
	    </t>
    </template>
</odoo>
  • template id="fixed_assets_transfer_form_template id是report.xml里面
    在这里插入图片描述

  • t-call=“web.html_container” :调用标准HTML容器模板

  • t-call=“web.internal_layout” :使用Odoo内置的报表布局

  • t-foreach=“docs” t-as=“doc” :循环遍历文档集(个人理解:拿到记录集 然后在遍历 得到一条记录 doc就跟self差不多 因为在tree视图里面可以勾选多条数据一起打印)

t标签 里面的属性

  • t-name 用于指明模板的名称
  • t-if 用于指明元素在页面产生的条件
  • t-foreach用于指明一个循环调用
  • t-as 用于取得循环中的单个值 一般与t-foreach搭配使用 后面带的是一个变量名
  • t-esc 用与一个文字的输出
  • t-call 用于调用另外模板,后面带一个模板名称
  • t-set 用于设定一个变量 t-value 用于指定某个元素或者变量的值

实战使用

字段显示

在这里插入图片描述

<span t-field="doc.department_name"/> <t t-esc='doc.department_name'/> 效果是一样都是显示字段的值
但是t-esc是不可以翻译的 t-field是可以翻译的 方便有多语言业务 t-field不可以嵌套在t标签里
在这里插入图片描述

循环 one2many字段可以这样用

在这里插入图片描述

判断

在这里插入图片描述

因为我的值是012 但是我打印模版想显示中文

方法1:
<td>
    <t t-if="doc.recruitment_method == '0'">内招</t>
    <t t-elif="doc.recruitment_method == '1'">外招</t>
    <t t-elif="doc.recruitment_method == '2'">不限</t>
</td>
方法2:
t-set="reason_mapping"  #定义一个名为 reason_mapping 的变量。
t-value="dict([('0', '内招'), ('1', '外招'), ('2', '储备人才'), ('3', '不限')])" :将 reason 字段的值和显示内容构建成一个字典。
t-esc="reason_mapping.get(doc.reason, '')" :从字典里获取 doc.reason 对应的值,若未找到则返回空字符串。

根据条件显示字段

      <t t-if="doc.reason_other">
          <td>原因</td>
          <td style="width:1000px;"><t t-esc="doc.reason_other"/></td>
      </t>

显示条数

在这里插入图片描述
在这里插入图片描述

### Odoo 17 中实现静态报表打印的方法 为了在Odoo 17中实现静态报表打印功能,可以采用多种方式来设计和部署这些报表。下面介绍一种基于QWeb模板的方式创建并配置静态报表。 #### 创建自定义模块结构 首先,在开发环境中构建一个新的应用程序或扩展现有应用以容纳新的报告逻辑。此过程涉及设置目录树形结构以及必要的初始化文件,如`__init__.py` 和 `__manifest__.py` 文件用于声明依赖关系和其他元数据信息[^1]。 #### 定义报表视图与模板 接着,通过XML文件定义报表的具体布局。这通常涉及到编写HTML片段,并利用特定于Odoo QWeb引擎的标签语法来动态填充内容。例如: ```xml <template id="static_report_template"> <t t-call="web.html_container"> <div class="page"> <!-- 使用内置字段表达式显示发票日期 --> <p>Invoice Date:</p> <span t-field="o.date_invoice" t-options='{"format": "MM/dd/yyyy"}'/> <!-- 更多静态或动态内容... --> </div> </t> </template> ``` 上述代码展示了如何格式化日期字段作为报表的一部分[^2]。 #### 注册报表模型及其行为 为了让系统识别新创建报表类型,还需要注册相应的Python类。这部分工作主要是在控制器内完成,以便能够响应来自客户端请求的动作。这里给出一段简化版的例子说明这一点: ```python from odoo import http from odoo.http import request class StaticReportController(http.Controller): @http.route('/print/static/report', type='http', auth='user') def static_report(self, **kw): # 假设有一个名为 'static_report' 的模型存储所需的数据集 report_data = request.env['static.report'].search([]) # 调用已定义好的报表动作返回PDF文档流给浏览器下载 return request.env.ref('your_module.static_report_id').report_action(report_data) ``` 以上脚本实现了对指定路径 `/print/static/report` 的HTTP GET 请求处理程序;它负责检索目标对象列表并通过关联的外部ID触发报表生成功能[^4]。 #### 测试与迁移至生产环境 一旦完成了本地测试验证无误之后,则可按照既定流程准备将改动同步到正式服务器上运行。确保遵循最佳实践指南来进行版本控制、备份操作等预防措施后再执行实际发布步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值