PDF报告¶
使用 Studio,您可以 编辑现有的 PDF 报表 (例如发票、报价单等),或者 创建新的报表 。
默认布局¶
报表的默认布局是在 Studio 外部管理的。转到 公司 部分点击 配置文档布局 。布局设置是针对具体公司的,但适用于所有报表。
,然后在主页的小技巧
您可以在 配置您的文档布局 窗口右侧的报表预览中查看不同设置如何影响报表布局。在创建或编辑报表时,可以通过点击屏幕左侧的 打印预览 查看报表的预览。
使用以下设置:
布局 :有七种布局可用:
背景 :以下背景可用:
空白 :不显示任何内容。
演示标志 :背景中显示一个演示标志。
自定义 :上传自定义背景图像。
文本 :有八种字体可用:Lato、Roboto、Open Sans、Montserrat、Oswald、Raleway、Tajawal(支持阿拉伯文和拉丁文脚本)以及 Fira Mono。访问 Google 字体网站 可以预览这些字体。
公司标志 :点击 编辑 按钮上传或更改标志。这会将标志添加到 公司 模型中的公司记录中,您可以通过转到 并点击 公司 部分中的 更新信息 来访问该记录。
颜色 :更改用于构建报表的主要和次要颜色。默认颜色会根据标志的颜色自动生成。
地址 :公司名称和地址显示在 外部报表 的页眉中。您可以添加多行文本。
标语 :在使用 Light、Striped、Bubble、Wave 和 Folder 布局的 外部报表 的页眉中显示,以及在使用 Boxed 和 Bold 布局的外部报表的页脚中显示。您可以添加多行文本。
纸张格式 :这定义了报表的默认纸张尺寸。您可以选择 A4 (21 厘米 x 29.7 厘米)和 美国信纸 (21.59 厘米 x 27.54 厘米)。这也可以在 Studio 中的 纸张格式 字段中为单个报表定义。
注解
根据您安装的应用程序或模块,可能会有其他纸张格式可用,例如库存应用程序的标签纸或活动应用程序的活动徽章。
创建新的 PDF 报表¶
要为一个 模型 (例如销售订单)创建新报表,请访问该模型,点击 ( 切换 Studio )按钮,然后点击 报表 。点击 新建 ,在弹出窗口中选择报表类型。这只用于确定页眉和页脚中显示的内容:
创建报表后,您可以开始 编辑它 。
编辑 PDF 报表¶
要访问模型可用的报表,请访问该模型,点击 ( 切换 Studio )按钮,然后点击 报表 。选择一个现有的报表以打开它。
或者,您也可以打开 Studio,点击 报表 ,然后搜索特定的报表或模型。
重要
强烈建议 复制 标准报告并在复制的版本中进行更改。要复制报告,请将鼠标指针悬停在报告的右上角,点击 ( 垂直省略号 )图标,然后选择 复制 。

选项¶
选择或创建报表后,您可以使用屏幕左侧的选项来:
更改 报告名称:新名称将应用于所有地方(在 Studio 中、在表单视图中 ( 齿轮 )图标下的 打印 菜单中,以及 PDF 文件名中)。
修改 纸张格式 :如果没有选择值,则使用在 默认布局 中定义的格式。
在打印菜单中显示 :将报表添加到表单视图中的 打印 菜单中。
从附件重新加载 :首次生成报表时将其保存为记录的附件,并在后续任何时间重新加载报表的原始版本。这是法律要求的,主要用于发票的情况。
限制可见性到用户组 :将 PDF 报表的可用性限制为特定的 用户组 。
编辑源代码 :直接在 XML 文件 中修改报表。
重置报表 :丢弃对报表所做的所有更改并将其重置为标准版本。
打印预览 :生成并下载报表预览。
报表编辑器¶
报表编辑器允许您修改报表的内容和格式。
小技巧
您可以使用相关按钮或快捷键
CTRL
+Z
和CTRL
+Y
来 撤销 或 重做 更改。离开报表时会自动保存更改,或者您也可以使用 保存 按钮手动保存。
您可以通过点击屏幕左侧的 重置报表 按钮将报表重置为其标准版本。
重要
编辑报表的页眉和页脚会影响所有标准和自定义报表。
条件块¶
虚线矩形表示 条件块 ( if/else 语句)。它们用于根据特定条件显示或隐藏内容。点击块以查看条件。

选择一个值以预览其对应的输出,并在必要时进行编辑。

注解
条件只能在 XML 中编辑。
其他内容¶
报表中有两种类型的文本内容:
静态文本,即未以蓝色高亮显示的文本,可以直接在编辑器中修改。
动态文本,即以蓝色高亮显示的文本,在生成报表时会被 字段 的值替换,例如销售订单编号或报价日期。
您可以使用命令将内容(例如字段、列表、表格、图像、横幅等)添加到报表中。输入 /
打开 功能框 ,然后输入命令名称或从列表中选择。
要在报表中添加静态文本,请在需要的位置输入文本。
对于更高级的更改,您可以 直接在 XML 中编辑报表 。
添加字段¶
要添加字段,请输入 /
并选择 字段 命令。在打开的列表中,选择或搜索字段;如果需要,点击字段名称旁边的右箭头以访问相关字段列表。然后,指定字段未完成时显示的默认值,并按 Enter
键。

添加或编辑表格¶
报表中有两种类型的表格:
添加或编辑静态表格¶
要添加静态表格,请输入 /
并选择 表格 命令。确定表格的列数和行数。添加表格后,您可以开始编辑它。
您可以使用表格工具插入、移动和删除列和行。将光标放在列上方或行左侧,然后点击紫色矩形并选择一个选项。

要调整列的大小,请拖动列边框到所需位置;通过从表格工具中选择 重置大小 将所有列恢复为标准大小。
在单元格中添加您选择的 字段 或通过输入添加静态文本。
小技巧
如果不使用表格,可以通过列以结构化方式添加文本。输入 /
并选择适当的命令来添加列:2 列 、 3 列 或 4 列 。
添加或编辑动态表格¶
注解
只有类型为
one2many
或many2many
的关系可以显示为动态表格。标准报表中的现有动态表格比您自行添加的动态表格结构更复杂。对于此类表格,可以插入或删除列;但无法移动列或插入、移动或删除行。
要添加动态表格,请输入 /
并选择 动态表格 命令。在打开的列表中,选择或搜索表格将基于的关系并按 Enter
键。添加表格后,您可以开始编辑它。
您可以使用表格工具插入、移动和删除列,就像操作 静态表格 一样。还可以插入静态行,这些行将出现在生成的行上方或下方。
要向单元格添加字段,请删除任何占位符文本,然后添加您选择的 字段 。打开的对话框会显示字段的源对象(例如, 订单行 模型)以及可用字段的列表。

将 列名 标签替换为您选择的标签。
注解
默认行会自动遍历字段内容,为每个字段值生成报表中的一行(例如,每条订单行对应一行)。
格式化¶
要格式化报表中的文本,请选中文本,然后使用 文本编辑器 中的选项进行格式化。
编辑报表的 XML¶
警告
直接修改 XML 可能会导致在 升级 过程中出现报表问题。如果发生这种情况,只需将更改从旧数据库复制到升级后的数据库中即可。
要编辑报表的 XML,请点击左侧窗格中的 编辑源代码 。
例子¶
要更改报表中数据的呈现方式,您可以手动修改字段的默认 小部件 。在下面的示例中,默认情况下订单日期显示日期和时间,而单价默认保留两位小数。
<div class="oe_structure"> <span t-field="doc.date_order"/> <span t-field="doc.price_unit"/> </div>
通过使用 t-options
(在此例中为 widget
选项),可以分别修改这些字段以仅显示日期和保留四位小数:
<div class="oe_structure"> <span t-field="doc.date_order" t-options="{'widget': 'date'}"/> <span t-field="doc.price_unit" t-options="{'widget': 'float', 'precision': 4}"/> </div>
如果您希望根据特定条件显示或隐藏内容,可以在报表 XML 中手动添加 if/else
控制语句。
例如,如果您希望在没有标签的情况下隐藏自定义数据表,可以使用 t-if
属性定义条件,该条件会被评估为 True
或 False
。如果没有报价单中的标签,表格将不会显示。
<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
<!-- thead = table header, the row with column titles -->
<thead>
<!-- table row element -->
<tr>
<!-- table header element -->
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<!-- table body, the main content -->
<tbody>
<!-- we create a row for each subrecord with t-foreach -->
<tr t-foreach="doc.tag_ids" t-as="tag">
<!-- for each line, we output the name and price as table cells -->
<td t-out="tag.id"/>
<td t-out="tag.name"/>
</tr>
</tbody>
</table>
如果您希望在 t-if
语句被评估为 False
的情况下显示另一个块,可以使用 t-else
语句指定它。t-else
块必须直接跟在文档结构中的 t-if
块之后。无需在 t-else
属性中指定任何条件。例如,让我们显示一条简短消息,说明报价单中没有标签:
<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
<!-- thead = table header, the row with column titles -->
<thead>
<!-- table row element -->
<tr>
<!-- table header element -->
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<!-- table body, the main content -->
<tbody>
<!-- we create a row for each subrecord with t-foreach -->
<tr t-foreach="doc.tag_ids" t-as="tag">
<!-- for each line, we output the name and price as table cells -->
<td t-out="tag.id"/>
<td t-out="tag.name"/>
</tr>
</tbody>
</table>
<div class="text-muted" t-else="">No tag present on this document.</div>
通过使用 t-if/t-else
表示法,报表编辑器会识别出这些部分是互斥的,应该显示为条件块:

您可以使用编辑器切换条件以预览其输出:

如果您希望有多个选项,还可以使用 t-elif
指令添加中间条件。例如,这就是销售订单报表标题如何根据底层文档的条件变化的。
<h2 class="mt-4">
<span t-if="env.context.get('proforma', False) or is_pro_forma">Pro-Forma Invoice # </span>
<span t-elif="doc.state in ['draft','sent']">Quotation # </span>
<span t-else="">Order # </span>
<span t-field="doc.name">SO0000</span>
</h2>
标题 形式发票 的使用取决于某些上下文条件。如果这些条件未满足且文档状态为 草稿
或 已发送
,则使用 报价单 。如果这些条件均未满足,则报表标题为 订单 。
在报表中处理图像可能会有挑战性,因为对图像大小和行为的精确控制并不总是显而易见的。您可以使用报表编辑器插入图像字段(通过使用 字段命令 ),但使用 t-field
指令和伴随的 t-options
属性在 XML 中插入它们可以提供更好的尺寸和位置控制。
例如,以下代码将行的产品字段 image_128
输出为宽度为 64 像素的图像(高度根据图像的宽高比自动调整)。
<span t-field="line.product_id.image_128" t-options-widget="image" t-options-width="64px"/>
图像小部件可用的选项如下:
width
:图像的宽度,通常以像素或 CSS 长度单位(如rem
)表示(留空则为自动宽度)。height
:图像的高度,通常以像素或 CSS 长度单位(如rem
)表示(留空则为自动高度)。class
:应用于img
标签的 CSS 类;可以使用 Bootstrap 类 。alt
:图像的替代文本style
:样式属性;它允许您更自由地覆盖样式,而不局限于 Bootstrap 类 。
这些属性必须包含字符串,即用双层引号括起来的文本,例如 t-options-width="'64px'"
(或者,也可以是一个有效的 Python 表达式)。
注解
图像小部件不能用于 img
标签。相反,请在 span
(用于内联内容)或 div
(用于块级内容)节点上设置 t-field
指令。
例如,让我们在报价单表格中添加一列显示产品图像:
<table class="table table-sm o_main_table table-borderless mt-4">
<thead style="display: table-row-group">
<tr>
<th>Image</th>
<th name="th_description" class="text-start">Description</th>
<th>Product Category</th>
<th name="th_quantity" class="text-end">Quantity</th>
<th name="th_priceunit" class="text-end">Unit Price</th>
[...]
<t t-foreach="lines_to_report" t-as="line">
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
<tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type">
<td>
<span t-field="line.product_template_id.image_128"
t-options-widget="'image'"
t-options-width="'64px'"
t-options-class="'rounded-3 shadow img-thumbnail'"
/>
</td>
<td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
<td t-out="line.product_id.categ_id.display_name"/>
t-options-width
属性将图像宽度限制为 64 像素,而 t-options-class
中使用的 Bootstrap 类会创建一个带有圆角和阴影的缩略图样式的边框。
