PDF报告

使用 Studio,您可以 编辑现有的 PDF 报表 (例如发票、报价单等),或者 创建新的报表

默认布局

报表的默认布局是在 Studio 外部管理的。转到 设置 ,然后在主页的 公司 部分点击 配置文档布局 。布局设置是针对具体公司的,但适用于所有报表。

小技巧

您可以在 配置您的文档布局 窗口右侧的报表预览中查看不同设置如何影响报表布局。在创建或编辑报表时,可以通过点击屏幕左侧的 打印预览 查看报表的预览。

使用以下设置:

  • 布局 :有七种布局可用:

    Light report layout sample
  • 背景 :以下背景可用:

    • 空白 :不显示任何内容。

    • 演示标志 :背景中显示一个演示标志。

    • 自定义 :上传自定义背景图像。

  • 文本 :有八种字体可用: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,点击 报表 ,然后搜索特定的报表或模型。

重要

强烈建议 复制 标准报告并在复制的版本中进行更改。要复制报告,请将鼠标指针悬停在报告的右上角,点击 垂直省略号 )图标,然后选择 复制

Duplicating a PDF report

选项

选择或创建报表后,您可以使用屏幕左侧的选项来:

  • 更改 报告名称:新名称将应用于所有地方(在 Studio 中、在表单视图中 齿轮 )图标下的 打印 菜单中,以及 PDF 文件名中)。

  • 修改 纸张格式 :如果没有选择值,则使用在 默认布局 中定义的格式。

  • 在打印菜单中显示 :将报表添加到表单视图中的 打印 菜单中。

  • 从附件重新加载 :首次生成报表时将其保存为记录的附件,并在后续任何时间重新加载报表的原始版本。这是法律要求的,主要用于发票的情况。

  • 限制可见性到用户组 :将 PDF 报表的可用性限制为特定的 用户组

  • 编辑源代码 :直接在 XML 文件 中修改报表。

  • 重置报表 :丢弃对报表所做的所有更改并将其重置为标准版本。

  • 打印预览 :生成并下载报表预览。

报表编辑器

报表编辑器允许您修改报表的内容和格式。

小技巧

  • 您可以使用相关按钮或快捷键 CTRL + ZCTRL + Y撤销重做 更改。

  • 离开报表时会自动保存更改,或者您也可以使用 保存 按钮手动保存。

  • 您可以通过点击屏幕左侧的 重置报表 按钮将报表重置为其标准版本。

重要

编辑报表的页眉和页脚会影响所有标准和自定义报表。

条件块

虚线矩形表示 条件块if/else 语句)。它们用于根据特定条件显示或隐藏内容。点击块以查看条件。

查看应用于块的条件。

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

预览另一个条件的输出。

注解

条件只能在 XML 中编辑。

其他内容

报表中有两种类型的文本内容:

  • 静态文本,即未以蓝色高亮显示的文本,可以直接在编辑器中修改。

  • 动态文本,即以蓝色高亮显示的文本,在生成报表时会被 字段 的值替换,例如销售订单编号或报价日期。

您可以使用命令将内容(例如字段、列表、表格、图像、横幅等)添加到报表中。输入 / 打开 功能框 ,然后输入命令名称或从列表中选择。

要在报表中添加静态文本,请在需要的位置输入文本。

对于更高级的更改,您可以 直接在 XML 中编辑报表

添加字段

要添加字段,请输入 / 并选择 字段 命令。在打开的列表中,选择或搜索字段;如果需要,点击字段名称旁边的右箭头以访问相关字段列表。然后,指定字段未完成时显示的默认值,并按 Enter 键。

Select a related field.
添加或编辑表格

报表中有两种类型的表格:

  • 静态表格 ,用于显示静态文本或字段。对于这种类型的表格,在添加表格时定义列数和行数。

  • 动态表格 ,用于显示来自 关联字段 的数据。对于这种类型的表格,在添加表格时仅定义列数。生成报表中的行数将由链接到当前模型的相关模型中的记录数决定。

    Example

    在销售订单报表中,动态表格用于显示与销售订单相关的订单行。如果销售订单包含 10 条订单行,则生成的报表中的表格有 10 行;如果包含两条订单行,则表格有两行。

添加或编辑静态表格

要添加静态表格,请输入 / 并选择 表格 命令。确定表格的列数和行数。添加表格后,您可以开始编辑它。

您可以使用表格工具插入、移动和删除列和行。将光标放在列上方或行左侧,然后点击紫色矩形并选择一个选项。

编辑表格结构的可用选项列表。

要调整列的大小,请拖动列边框到所需位置;通过从表格工具中选择 重置大小 将所有列恢复为标准大小。

在单元格中添加您选择的 字段 或通过输入添加静态文本。

小技巧

如果不使用表格,可以通过列以结构化方式添加文本。输入 / 并选择适当的命令来添加列:2 列3 列4 列

添加或编辑动态表格

注解

  • 只有类型为 one2manymany2many 的关系可以显示为动态表格。

  • 标准报表中的现有动态表格比您自行添加的动态表格结构更复杂。对于此类表格,可以插入或删除列;但无法移动列或插入、移动或删除行。

要添加动态表格,请输入 / 并选择 动态表格 命令。在打开的列表中,选择或搜索表格将基于的关系并按 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 属性定义条件,该条件会被评估为 TrueFalse 。如果没有报价单中的标签,表格将不会显示。

<!-- 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 类会创建一个带有圆角和阴影的缩略图样式的边框。

在报价单表格中添加一列显示产品图像。