PDF报告¶
With Studio, you can edit existing PDF reports (e.g., invoices, quotations, etc.) or create new ones.
默认布局¶
默认报告布局管理在Studio之外。转到 ,然后,在主页面的 公司 部分中,点击:guilabel:配置文档布局 。布局设置是公司特定的,但适用于所有报告。
小技巧
在 配置文档布局 窗口右侧的报表预览中,可以看到各项设置对报表版式的影响。创建或编辑报表时,可以点击屏幕左侧的 打印预览 查看报表预览。
使用以下设置:
布局 :可选七种布局:
背景 :可选以下背景:
空白 :不显示任何内容。
演示徽标 :在背景中显示一个演示徽标。
自定义 :上传自定义背景图片。
文本 :提供八种字体:Lato、Roboto、Open Sans、Montserrat、Oswald、Raleway(支持阿拉伯语和拉丁文字)以及 Fira Mono。可访问 Google Fonts 网站 预览这些字体。
公司徽标 :点击 编辑 按钮上传或更换徽标。徽标会保存到 公司 模型的公司记录中,可前往 并在 公司 区块点击 更新信息 进行访问。
颜色 :更改用于组织报表的主色和辅色。默认颜色根据徽标颜色自动生成。
地址 :公司名称和地址显示在 外部报表 的页眉中。可以添加多行文本。
标语 :该项显示在使用浅色、条纹、气泡、波浪和文件夹布局的 外部报表 页眉中,以及使用盒装和加粗布局的外部报表页脚中。可以添加多行文本。
纸张格式 :定义报表的默认纸张尺寸。可以选择 A4 (21 cm x 29.7 cm)或 US Letter (21.59 cm x 27.54 cm)。也可以在 Studio 的 纸张格式 字段中为单个报表单独定义。
注解
根据安装的应用或模块,还可能有其他纸张格式,例如库存应用的标签纸或活动应用的活动胸卡。
创建新的 PDF 报表¶
要为某个 模型 (如销售订单)创建新报表,请进入该模型,点击 (切换 Studio) 按钮,然后点击 报表 。点击 新建 ,在打开的弹窗中选择报表类型。该类型仅用于决定页眉和页脚显示的内容:
报表创建完成后,即可开始 编辑报表 。
编辑 PDF 报表¶
要访问某个模型可用的报表,请进入该模型,点击 (切换 Studio) 按钮,然后点击 报表 。选择现有报表将其打开。
或者,您也可以打开 Studio,点击 报表 ,搜索特定报表或模型。
重要
强烈建议 复制 标准报表,并在复制的版本中进行修改。要复制报表,请将鼠标指针悬停在报表右上角,点击 (垂直省略号) 图标,然后选择 复制 。
选项¶
选择或创建报表后,可以使用屏幕左侧的选项来:
报表编辑器¶
报表编辑器允许您修改报表的内容和格式。
小技巧
可以使用相应的按钮或快捷键
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>
标题 Pro-Forma Invoice 依据某些上下文条件使用。若不满足这些条件,且单据状态为 draft 或 sent ,则使用 Quotation。若这些条件都不满足,报表标题为 Order。
在报表中处理图片可能颇具挑战,因为对图片尺寸和行为精确控制并不总是显而易见。您可以使用报表编辑器插入图片字段(通过 字段命令 ),但在 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:样式属性;相比使用 Bootstrap 类,它允许更自由地覆盖样式。
这些属性必须包含字符串,即嵌套在引号内的文本,例如 t-options-width=64px (或者,也可以是一个有效的 Python 表达式)。
注解
图片组件不能用于 img 标签。应将 t-field 指令设置在 span (用于内联内容)或 div (用于块级内容)节点上。
例如,在报价表格中添加一列产品图片:
<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 类会创建带圆角和阴影的缩略图式边框。