- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Office JS API 开发一个 Word 插件,试图在文档中的表格绑定(bind)周围添加一个内容控件。
我遇到的问题是在使用 goToByIdAsync()
选择表格周围的绑定(bind)后,仅在表格的最后一行周围创建内容控件,而不是选择。返回 ctx.document.getSelection()
的值我可以看到选定的范围只是选定表中的最后一行。我需要使用 Binding 对象来了解 Table 的选定单元格范围。我做错了什么吗?
var bindingId = '123';
var doc = Office.context.document;
// Create table in document.
doc.setSelectedDataAsync(tableValue, { coercionType: Office.CoercionType.Table }, function (asyncResult) {
// Add Binding to table
doc.bindings.addFromSelectionAsync(Office.BindingType.Table, { id: bindingId }, function (asyncResult) {
// Select the table object
doc.goToByIdAsync(bindingId, Office.GoToType.Binding, { selectionMode: 'selected' }, function (asyncResult) {
// Create Content Control
createCC();
});
});
});
function createCC(){
Word.run(function (ctx) {
var range = ctx.document.getSelection();
var html = range.getHtml();
return ctx.sync().then(function () {
console.log('Selected Range', html.value); // Only displays last row in the table.
var myContentControl = range.insertContentControl();
myContentControl.tag = bindingId;
myContentControl.title = 'My Content Control';
return ctx.sync().then(function () {
//Content control for table created
});
}).catch(function (err) {
errorHandler(err);
});
});
}
最佳答案
这是一个很好的问题!谢谢你的提问。我会建议你改变一下如何实现你想要的场景的方法。首先,goToById 不应用于获取任何对象的范围,这仅用于导航目的。如果你可以插入一个表,用一个命名的内容控件包装它(为其分配一个标题),创建一个绑定(bind)(使用 addFromNamedItem 而不是使用 addFromSelection 因为你没有可靠的选择 :) ) ,然后只需订阅 bindingSelectionChanged 事件并对表格或所选单元格执行任何需要执行的操作。
下面的代码就说明了这一点。希望它能让你朝着正确的方向前进。我为上面描述的每个步骤添加了一堆评论。
谢谢,编码愉快!
function insertTableCreateABindingAndSubscribeToEvents() {
Word.run(function (context) {
//ok first we insert a table... 2 rows, 3 columns
var myTableData = [["Banana", "Mango", "Cherry"],["10","20","30"]];
var myTable = context.document.body.insertTable(2, 3, "end", myTableData); //insert at the end of the body of the document.
context.load(myTable);
return context.sync()
.then(function () {
//then we wrap the isnerted table with a content control
var myCC = myTable.insertContentControl();
myCC.title = "myTableTitle"; //important: assing a title so then i can use it to bind by namedItem!
return context.sync()
.then(function () {
//Now we create the binding and subscribe to the events...
//since we know the content control title, we can use addFromNamedItem!
Office.context.document.bindings.addFromNamedItemAsync("myTableTitle", "table", {}, function (result) {
//boom now lets subscribe to the event...
if (result.status == "succeeded") {
//now lets subscribe to the selectionChanged event.\
result.value.addHandlerAsync(Office.EventType.BindingSelectionChanged, handler);
}
else {
console.log("error");
}
} )
})
})
})
.catch(function (e) {
console.log(e.message);
})
}
function handler(args) {
//check out all the values you can get, see below how we use it to display the selected cell value...
// console.log("selection changed!" + args.startRow + " " + args.startColumn + " " + args.rowCount + " " + args.columnCount);
var row;
if (args.startRow == undefined) {
//menas the selection is in the header!
row = 0;
}
else {
//selection not in the header...
row = args.startRow + 1
}
// the other thing you can try here is to get the table, and print the selected cell value..
Word.run(function (context) {
//this instruction selected cell of the table within the content control named "myTableTite"
var mySelectedCellBody = context.document.contentControls.getByTitle("myTableTitle").getFirst().tables.getFirst().getCell(row,args.startColumn).body;
context.load(mySelectedCellBody);
return context.sync()
.then(function () {
//lets write the value of the cell (assumes single cell selected.)
console.log(mySelectedCellBody.text);
})
})
.catch(function (e) {
console.log("handler:" + e.message);
})
}
关于javascript - Office Word JS - 表格选择的内容控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43331952/
我对 Office Scripts 和 Office Lab 感到困惑。 两者都可以在 Excel 中运行 javascript,但似乎无法在它们中共享代码。 对于 Office 脚本,一些代码如 f
如果我们加载一个引用 office.js 的网页在 Office 客户端之外,我们会收到警告:Office.js is loaded outside of Office client . 这些信息很有
我试图找到一种将 Outlook 插件发布到办公商店的方法。但我发现我们只能发布 Office 应用程序,而不能发布 Office 商店的加载项。因此我想知道 Office 应用程序和 Office
我想使用 Ooxml 以编程方式自定义“Heading1”和“Heading2”样式通过 office.js Visual Studio 代码中的库。我已经搜索过谷歌和许多文档,但仍然没有得到任何内容
我想使用 Microsoft.Office.Interop.Excel 从 XLS 文件中提取一些数据。我安装了 Visual Studio 2010 和 Office 开发人员工具。但是,我在 va
最近,Microsoft 推出了 Office 插件架构,该架构允许开发远程托管并在 Office 内的 IFrame 中运行的插件。我读了很多文章,试图了解这个架构是否是 VSTO 的替代品,或者它
我开发了一个将数据导入 Microsoft Excel 的应用程序。 我使用 VS2005 + .NET 2.0,并且我的计算机上安装了 Microsoft Office 2007 (Office 1
是否有推荐的方法(包、框架等)来设置 Office 加载项的自动化端到端测试。我对测试的所有搜索都导致侧加载应用程序和手动测试。 例如:https://dev.office.com/docs/add-
我们正在为 Excel 和 Word 开发 javascript Office 插件。我们的用户将使用 Office Desktop 和 Office Online。 当用户在加载项中创建新记录时,我
我在电子表格上有一个表格,我想删除所有现有数据。我使用下面的代码,除非表格已经是空的。 // Get the row count let rowCount = table.getRangeBetwee
所以我正在尝试开始开发 Office 365 加载项(以前的 Office 应用程序),我想知道 Office 在呈现您的应用程序时使用什么浏览器或浏览器引擎。我尝试使用 JavaScript 的 n
我正在寻找一些关于在 网上商店 上托管我们当前托管应用程序的更新版本的信息。 我的查询是,我们现有版本的应用程序说的 list 文件 版本。 1.0 托管在网上商店指向源位置(天蓝色 网站)说 mya
在我们的组织中,我们构建了一个 Office 加载项。现在我们想在我们的加载项中添加打印功能。谁能帮助我如何使用 Office javascript API 添加打印功能。 最佳答案 Office.J
我有兴趣了解有关 Microsoft Office Communicator 的更多信息IM 客户端,以及它如何确定您的存在(即您是在计算机旁还是不在)。任何人都可以向我指出解释这一点的教程或 API
问题: 我有两个电子表格,每个电子表格都有不同的用途,但包含一个特定的数据,这两个电子表格中的数据需要相同。这条数据(其中一列)在电子表格 A 中更新,但也需要在电子表格 B 中更新。 目标: 以某种
可在此处获得office.js的正式版本: https://appsforoffice.microsoft.com/lib/1/hosted/office.js 它在代码中包含以下几行: window
不久前我有了一个发现。只需按照以下步骤操作: 在 Office 2003 中创建一个 .doc/.xls/.ppt 文件。在其中保留一些测试数据并关闭该文件。现在重命名该文件以将其文件扩展名更改为随机
姓名:来自:file:///D:/Samples/TestUpdatedVersion/bin/Debug/TestUpdatedVersion.vsto 无法安装自定义,因为当前已安装另一个版本并且
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我对使用 Office 2007 在 2007 之前的二进制格式(.doc、.xls、.ppt)和新的 Office Open XML 格式(.docx、.xlsx、.pptx)之间进行转换很感兴趣
我是一名优秀的程序员,十分优秀!