简体中文
English 简体中文 繁體中文
Methodox 首页

智能对象

智能对象是 Impulse 文档中或 Expo 幻灯片上的一段文本、一个表格或一张图片,其内容来自别处:文档旁某个工作簿中的单元格、区域或名称,一个 Lua、C# 或 Python 表达式,文档中的某个 Divooka 图,或者一个 Data Source。典型用法是一份数据取自预算工作簿的报告:修改工作簿,刷新报告,报告中的每个数字都会随之更新。

智能对象属于 Functions:刷新它们只会计算其值并写入文档,不做其他任何事情。

创建智能对象

Insert ▸ Smart Object 在两个应用程序中打开同一个对话框。

  • 在 Impulse 中,将插入点放在值要出现的位置,或选中它要替换的文本,或将插入点放在表格中以填充该表格。
  • 在 Expo 中,将插入点放在文本框中,以在其文本中插入一个值;或在幻灯片上创建表格或图片:如果幻灯片有空的内容占位符,智能表格或图片会放入其中。

对话框会询问:

  • Name:其他智能对象引用它时使用的名称,例如 Revenue。

  • Language 和 Source:

    • Formula:针对文档旁某个工作簿的公式,工作簿名称写在方括号中:=[Budget.xlsx]Summary!B4、=[Budget.xlsx]TotalRevenue(一个已定义名称)、=SUM([Budget.xlsx]Summary!B2:B5),或者用于填充表格的区域,例如 =[Budget.xlsx]Summary!A1:D6。
    • Lua:以 smart.Name 形式读取其他智能对象的表达式:(smart.Revenue - smart.Cost) / smart.Revenue。
    • C#:以 Smart["Name"] 形式读取它们的表达式,并用 Num() 和 Text() 进行转换:Math.Round(Num(Smart["Revenue"]) * 0.08, 2)。
    • Python:smart.Revenue * 0.2,或一个返回值的函数体;参见 Python。
    • Divooka:文档中的某个 Function 图,按名称调用:LOANPAYMENT(param.Principal, param.Rate, param.Years)。

    Lua、C#、Python 和 Divooka 源还可以读取文档的参数(param.Name、Param["Name"]),更改某个参数时,恰好会刷新读取它的那些智能对象。对于公式或图调用,Source 框是单行输入框;对于 Lua、C# 和 Python,则是多行文本区域。Lua 和 Python 源可以调用文档函数脚本中的函数。

  • Object Type:文本、表格或 Image。Image 是由返回图片的 Function 填充的图片,例如由图绘制的图表或 host.getImage(url)。返回图片的 Function 图总是生成图像智能对象。

  • Format:值的数字格式,例如 #,##0 或 0.0%,使用 Formula 所用的格式代码。将鼠标悬停在该框上,可以查看每个符号的含义及示例。图像没有格式,因此选择 Image 时该框会消失。

如果文档的脚本已禁用,选择 Lua、C#、Python 或 Divooka 时会显示 Scripts are disabled on this document,旁边有一个 Enable 按钮。

Preview 会在插入任何内容之前显示智能对象将呈现的内容。在你按下它之前,它不会运行任何东西。打开预览后,每次更改稍过片刻,对话框就会像刷新时一样计算源,并显示值、表格的前几行或图片,或者说明为何没有结果。这样,输错的公式或意外的表格形状会在这里被发现,而不是在文档中。

智能报告中的 Insert Smart Object,源为 =[Budget.xlsx]Summary!A1:D6,预览显示它将填充的五行四列 预览会读取文档的其他智能对象、参数和授权,不写入任何内容;只有在文档的代码已启用时,才会运行 Lua、C#、Python 和图源,在此之前它会给出相应提示。

Insert ▸ Data Source… 则改为从 Data Source 创建智能表格。

智能对象会立即创建并刷新,作为一个撤消步骤。它在文档中以底纹显示,将鼠标悬停在上面时,指针旁会显示其名称、源和上次刷新时间。在 Expo 文本框中,智能值随周围的文字一起移动,不能在其中键入内容。

刷新

  • Refresh All(Ctrl+Shift+F9:在 Impulse 中为 References ▸ Refresh All,在 Expo 中为 Insert ▸ Refresh Smart Objects)按依赖关系所需的顺序刷新每个智能对象:Margin 在 Revenue 和 Cost 之后刷新,智能表格的图表在该表格之后刷新。
  • Impulse 中的 References ▸ Refresh Selection 和 Expo 中的 Insert ▸ Refresh Selected Smart Object 会刷新插入点处或所选的智能对象,智能对象右键菜单中的 Refresh 也是如此。

刷新时,每个工作簿只读取一次,且不运行其中携带的任何代码;先计算所有值,然后将它们作为一个撤消步骤全部写入:文本、表格和图片一起写入。一段文本会保留其格式;表格会随行数增减,并按列名保留格式。失败的智能对象保留其上一次的值,状态栏会显示刷新成功和失败的数量。

Smart Objects 选项卡

Tools ▸ Smart Objects(在 Impulse 中也可用 References ▸ Smart Objects)会在底部托盘中打开一个选项卡,列出每个智能对象及其种类、语言、源和上次刷新时间,或者失败原因,或者自上次刷新后已被手动编辑。读取其他文件的智能对象和 Data Source 列在 Data sources 下;文档的脚本列在 Scripts 下。Expo 会为每一项列出其幻灯片编号。刷新失败时,该选项卡会自动打开。

启用后执行 Refresh All 的智能报告示例:来自 Budget.xlsx 的数字出现在文本和表格中,Smart Objects 选项卡在 Smart objects 下列出 Lua 利润率,在 Data sources 下列出从工作簿读取的五个值,均已刷新

  • 双击某一行可转到该智能对象:文档滚动到它所在位置并选中它;在 Expo 中会转到对应幻灯片并选中形状,或打开文本框并选中该值。
  • Show Definition 会打开 Scripts 选项卡,定位到计算它的脚本或图中的节点。
  • 在 Impulse 中,工具条上的按钮可以刷新全部或所选的智能对象,Unbind 会将智能对象变回普通文本。

在文档中右键单击智能对象,会提供相同的功能:Show in Smart Objects(Impulse)、Show Definition、Refresh;对于智能表格还有 Column Number Format…;对于 Data Source 还有 Edit Data Source…。

设置智能表格的格式

像设置任何表格一样设置智能表格的格式。刷新会重写表格,其列可能以另一种顺序返回,或者多一列、少一列,因此格式归属于每个列的名称,并在每次刷新后重新应用:在 Impulse 中是每列的单元格格式、文本格式和宽度;在 Expo 中是每列的标题单元格和第一个正文单元格的格式,应用到每一行。右键菜单中的 Column Number Format… 设置某列数字的显示方式。Data Source 或脚本可能会为新列建议格式,而你设置的格式优先;参见按列名设置表格格式。

必须启用脚本

Lua、C#、Python 和图智能对象都是代码,因此在你通过 Scripts disabled 栏上的 Enable 按钮启用文档之前,它们不会刷新;参见 Trust。读取工作簿的智能对象以及 Data Source 属于数据,无论是否启用都会刷新,前提是它们访问的内容已获允许。

存储方式

Impulse:每个智能对象的值是 .docx 中的普通文本或普通表格,位于一个以其名称命名的 Word 内容控件中。Word、LibreOffice 和 PDF 显示最后一次的值;Word 保存时会保留内容控件,因此文档可以在 Word 中往返编辑后仍能刷新。

Expo:文本框中的值是文本中的一个字段(a:fld),智能表格或图片是普通的 PowerPoint 表格或图片,通过其形状名称重新找到。PowerPoint 和 LibreOffice 显示最后一次的值。

在两者中,绑定信息都保存在文档的项目部件中。

从脚本中使用

在 Impulse 脚本中,doc.smartObjects 可以列出智能对象(count、[i]、find(name)),添加智能对象(add(range, source, { language, name, format })、addTable(table, source, options)、insertTable(afterParagraph, source, options)),以及刷新智能对象(refresh()、refreshOnly(names))。每个智能对象都有 name、kind、language、source、format、text、refreshed、error、isEdited 和 unbind()。

试一试

  • Examples\Automation\Smart report 中有绑定到 Budget.xlsx 的 Report.docx。打开报告,启用其脚本,在工作簿中修改一个数字并保存,然后在报告中执行 References ▸ Refresh All。
  • Weather Report 整页都是智能对象,而 Loan Letter 中的数字来自 Divooka 图。

另请参阅