我们如何使用 Open XML SDK for Office 创建 MS WORD 加载项功能区
How can we create a MS WORD Add-in ribbon uisng Open XML SDK for Office
在一个 VSTO project for MS WORD
, I created a custom Office Ribbon - with a button - for WORD 2010-2016
using VS2017 - Update 1809
as follows. Question: How can I achieve exactly the same using Open XML SDK 2.5 for Office in a similar VS2017 - Open XML for Office 项目中?我在网上没有找到这样的例子:
VSTO 示例中的功能区:
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<ribbon>
<tabs>
<tab idMso="TabAddIns" label="my Ribbon Tab">
<group id="ContentGroup" label="Content">
<button id="textButton" label="Insert Text" screentip="Text" onAction="OnTextButton"
supertip="Inserts text at the cursor location."/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
上面ribbon中按钮的回调方法:
public void OnTextButton(Office.IRibbonControl control)
{
Word.Range currentRange = Globals.ThisAddIn.Application.Selection.Range;
currentRange.Text = "This text was added by the Ribbon.";
}
更新:
动机:我为 MS WORD 创建了一个 VSTO 加载项,它在 WORD 文档的顶部功能区中创建了一个自定义选项卡。该选项卡有多个控件(按钮、复选框等),它们通过各自的回调执行各种操作(类似于我上面 post 中显示的示例)。我想使用 Open XML SDK for Office 将该 VSTO 加载项转换为执行相同的操作,因为 VSTO 加载项无法发布到 Microsoft Stores
,如 所述。新的 Office 加载项功能不支持我的旧版 VSTO 加载项所支持的某些功能。
很遗憾,你想象的是不可能的。
根据设计,功能区 XML 链接到同一 "container" 中的代码。存储在 Office 文档 中的功能区 XML 必须 与同一文档的 VBA 代码中的回调一起使用。如果您要使用 Office Open XML 将 Ribbon XML 插入 Word 文档,那么它所使用的代码必须位于同一文档的 VBA 组件中。 (还值得注意的是,VBA 组件不是 XML 格式,而是 binary,因此不能使用 Open XML 生成 - 只能导入。 )
出于同样的原因,由 COM 加载项(基于 IDTExtensibility2,无论是 VSTO 还是任何其他 COM 加载项)加载的功能区 XML 必须与该加载项中的代码一起使用。 Ribbon 的回调不能在任何其他 "container" 中,尽管回调代码可以调用 "container" 之外的代码。 (请注意,VBA 代码无法调用 VSTO 功能区...并且功能区 未 存储在任何文档中。)
使用 VBA 中的功能区 XML 和 COM 加载项,可以通过为功能区控件分配 Q
ID 来 共享 功能区控件。对于共享控件,任何容器中的代码都可以引用它们,只要知道id即可。
Office JS 加载项中定义的功能区也依赖于同一容器内的代码。然而,Office JS 模型(还没有?)使用共享控件的概念。
结论:与 COM 对象模型相比,Office JS 加载项仍然非常有限,无论是 Office 应用程序的对象模型还是功能区("commands" 用 Office JS 的说法)。该功能正在稳步扩展,最近重点放在 Excel 上。其他事情将(希望)随之而来。
如果您认为某个特定功能应该具有非常高的优先级,您应该转到 UserVoice for Office 开发。如果已经提出请求,请对其进行投票。如果找不到,请创建一个。
在一个 VSTO project for MS WORD
, I created a custom Office Ribbon - with a button - for WORD 2010-2016
using VS2017 - Update 1809
as follows. Question: How can I achieve exactly the same using Open XML SDK 2.5 for Office in a similar VS2017 - Open XML for Office 项目中?我在网上没有找到这样的例子:
VSTO 示例中的功能区:
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<ribbon>
<tabs>
<tab idMso="TabAddIns" label="my Ribbon Tab">
<group id="ContentGroup" label="Content">
<button id="textButton" label="Insert Text" screentip="Text" onAction="OnTextButton"
supertip="Inserts text at the cursor location."/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
上面ribbon中按钮的回调方法:
public void OnTextButton(Office.IRibbonControl control)
{
Word.Range currentRange = Globals.ThisAddIn.Application.Selection.Range;
currentRange.Text = "This text was added by the Ribbon.";
}
更新:
动机:我为 MS WORD 创建了一个 VSTO 加载项,它在 WORD 文档的顶部功能区中创建了一个自定义选项卡。该选项卡有多个控件(按钮、复选框等),它们通过各自的回调执行各种操作(类似于我上面 post 中显示的示例)。我想使用 Open XML SDK for Office 将该 VSTO 加载项转换为执行相同的操作,因为 VSTO 加载项无法发布到 Microsoft Stores
,如
很遗憾,你想象的是不可能的。
根据设计,功能区 XML 链接到同一 "container" 中的代码。存储在 Office 文档 中的功能区 XML 必须 与同一文档的 VBA 代码中的回调一起使用。如果您要使用 Office Open XML 将 Ribbon XML 插入 Word 文档,那么它所使用的代码必须位于同一文档的 VBA 组件中。 (还值得注意的是,VBA 组件不是 XML 格式,而是 binary,因此不能使用 Open XML 生成 - 只能导入。 )
出于同样的原因,由 COM 加载项(基于 IDTExtensibility2,无论是 VSTO 还是任何其他 COM 加载项)加载的功能区 XML 必须与该加载项中的代码一起使用。 Ribbon 的回调不能在任何其他 "container" 中,尽管回调代码可以调用 "container" 之外的代码。 (请注意,VBA 代码无法调用 VSTO 功能区...并且功能区 未 存储在任何文档中。)
使用 VBA 中的功能区 XML 和 COM 加载项,可以通过为功能区控件分配 Q
ID 来 共享 功能区控件。对于共享控件,任何容器中的代码都可以引用它们,只要知道id即可。
Office JS 加载项中定义的功能区也依赖于同一容器内的代码。然而,Office JS 模型(还没有?)使用共享控件的概念。
结论:与 COM 对象模型相比,Office JS 加载项仍然非常有限,无论是 Office 应用程序的对象模型还是功能区("commands" 用 Office JS 的说法)。该功能正在稳步扩展,最近重点放在 Excel 上。其他事情将(希望)随之而来。
如果您认为某个特定功能应该具有非常高的优先级,您应该转到 UserVoice for Office 开发。如果已经提出请求,请对其进行投票。如果找不到,请创建一个。