PDF报告

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

默认布局

默认报告布局管理在Studio之外。转到 设置 ,然后,在主页面的 公司 部分中,点击:guilabel:配置文档布局 。布局设置是公司特定的,但适用于所有报告。

Tip

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

使用以下设置:

  • 布局:提供七种布局:

    明亮报告布局示例
  • 背景:提供以下背景:

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

    • 演示徽标:在背景中显示演示徽标。

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

  • 文本:提供八种字体:Lato、Roboto、Open Sans、Montserrat、Oswald、Raleway、Tajawal(支持阿拉伯文和拉丁文)以及 Fira Mono。请访问 Google Fonts 网站 预览这些字体。

  • 颜色:更改用于构建报表结构的主色和辅助色。默认颜色会根据徽标的颜色自动生成。

  • 地址:公司名称和地址会显示在 外部报表 的页眉中。您可以添加多行文本。

  • 标语:在使用浅色、条纹、气泡、波浪和文件夹布局时,该内容会显示在 外部报表 的页眉中;在使用方框和粗体布局时,则显示在外部报表的页脚中。您可以添加多行文本。

  • 纸张格式:定义报表的默认纸张大小。您可以选择 A4 (21 厘米 x 29.7 厘米)和 US Letter (21.59 厘米 x 27.54 厘米)。也可以在 Studio 中的 纸张格式 字段里为单个报表定义该设置。

    Note

    根据您安装的应用或模块,可能还提供其他纸张格式,例如库存应用的标签页或活动应用的活动胸牌。

创建新的 PDF 报表

要为 模型 (例如销售订单)创建新报表,请访问该模型,点击 (切换 Studio)按钮,然后点击 报表 。点击 新建 ,在弹出的窗口中选择报表类型。该类型仅用于确定页眉和页脚中显示的内容:

创建报表后,就可以开始 编辑它 了。

编辑 PDF 报表

要访问某个模型可用的报表,请访问该模型,点击 (切换 Studio)按钮,然后点击 报表 。选择现有报表即可打开它。

或者,您也可以打开 Studio,点击 报表 ,然后搜索特定的报表或模型。

Important

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

复制  PDF 报告

选项

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

  • 更改 报表名称:新名称会在所有位置生效(在 Studio 中、在表单视图内 (齿轮)图标下的 打印 菜单中,以及在 PDF 文件名中)。

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

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

  • 从附件重新加载:在报表首次生成时将其作为附件保存在记录上,之后每次都重新加载报表的原始版本。发票在法律上要求如此,这主要用于这种情况。

  • 限制以下用户组可见:将 PDF 报表的可用范围限制为特定的 用户组 。

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

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

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

报表编辑器

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

Tip

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

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

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

Important

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

条件块

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

查看应用于某个块的条件。

选择一个值可预览其对应的输出,如有必要可进行编辑。

预览另一个条件的输出。

Note

条件只能在 XML 中编辑。

其他内容

报表中有两种文本内容:

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

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

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

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

如需进行更高级的更改,您可以 直接在 XML 中编辑报表 。

添加字段

要添加字段,请输入 / 并选择 字段 命令。在打开的列表中选择或搜索该字段;如有需要,点击字段名称旁的右箭头可访问相关字段列表。然后指定当记录中未填写该字段时显示的默认值,并按 Enter 。

选择关联的字段。
添加或编辑表格

报表中有两种表格:

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

  • 动态表格 ,用于显示来自 关系字段 的数据。对于此类表格,您在添加表格时只需定义列数。生成报表中的行数将取决于相关模型中与当前模型相链接的记录数。

    Example

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

添加或编辑静态表格

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

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

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

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

在单元格中添加 您所需的字段 ,或者直接输入静态文本。

Tip

要在不使用表格的情况下以结构化方式添加文本,您可以使用分栏。输入 / 并选择相应的命令来添加分栏:2 列 、 3 列 或 4 列 。

添加或编辑动态表格

Note

  • 只有类型为 one2many 或 many2many 的关系才能显示为动态表格。

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

要添加动态表格,请输入 / 并选择 动态表格 命令。在打开的列表中选择或搜索表格所基于的关系,然后按 Enter 。表格添加后,即可开始编辑。

您可以像操作 静态表格 一样,使用表格工具插入、移动和删除列。也可以插入静态行,这些行会显示在生成的行之上或之下。

要向单元格添加字段,请删除所有占位符文本,然后添加 您所需的字段 。打开的对话框会显示该字段的源对象(例如 订单行 模型)以及可用字段列表。

销售订单行模型的可用字段列表。

将 列名称 标签替换为您想要的标签。

Note

默认行会自动遍历字段的内容,为每个字段值在报表中生成一行(例如,每个订单行一行)。

格式化

要设置报表中文本的格式,请选中该文本,然后使用 文本编辑器 中的选项进行格式设置。

使用文本编辑器设置文本格式。

编辑报表的 XML

Warning

直接修改 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>

形式发票 标题会根据某些上下文条件使用。如果这些条件不满足,且文档状态为 draft 或 sent ,则使用 报价单。如果这些条件都不满足,报表标题为 订单。

在报表中处理图像可能颇具挑战,因为对图像大小和行为的精确控制并不总是显而易见的。您可以使用报表编辑器插入图像字段(通过 字段命令 ),但在 XML 中使用 t-field 指令及配套的 t-options 属性插入图像,可以更好地控制尺寸和位置。

例如,以下代码将订单行产品的 image_128 字段输出为宽度 64px 的图像(高度根据图像的宽高比自动确定)。

<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:style 属性;相比使用 Bootstrap 类 ,它可以更自由地覆盖样式。

这些属性必须包含字符串,即在引号内用引号括起来的文本,例如 t-options-width="'64px'" (或者,也可以使用有效的 Python 表达式)。

Note

图像小组件不能用于 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 类会创建带圆角和阴影的缩略图式边框。

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