Ms word Word Office.js:使用getOoxml()和insertOoxml()更新ContentControls中的表时出现问题
我正在尝试更新Word表格单元格中的文本(在内容控件[CCs]中)。我已经使用表对象成功地做到了这一点;但是,对于具有多个表的大型文档的客户来说,速度太慢。因此,我希望能够使用getOoxml和insertOoxml来更新表单元格值(希望更快,尽管我看到Word Online中的速度可能非常慢)。 因此,我将使用getOoxml在CCs中获取Ooxml表,然后以编程方式修改xml,然后将rtooxml插入到CCs中 我能够成功地获取Ooxml,并使用C#OpenXMLPowerTools以编程方式成功地修改表Ooxml。但是,我无法成功地将RTOOXML插入CCs 如果CC是围绕选定的表添加的,那么当代码运行时,它总是以“InvalidArgument”失败。请注意,采用这种方式时,CC中表格上方或下方没有换行符(CC适合表格)。我的大多数客户的桌子都是这样的 如果在CC中添加了表格(导致表格上方/下方出现不需要的换行符),则代码将运行,但会导致添加额外的CC和换行符。因此,每次代码运行时,CC计数都会增加1。CCs似乎相互嵌套。额外的CCs是不可接受的,因为它们会弄乱后续代码。每次运行代码时,它还会添加额外的换行符 我尝试了contentControls.items[0].clear()这会删除文本,但不会删除表或CCs,因此没有帮助 下面是脚本实验室中的简化代码:Ms word Word Office.js:使用getOoxml()和insertOoxml()更新ContentControls中的表时出现问题,ms-word,office-js,Ms Word,Office Js,我正在尝试更新Word表格单元格中的文本(在内容控件[CCs]中)。我已经使用表对象成功地做到了这一点;但是,对于具有多个表的大型文档的客户来说,速度太慢。因此,我希望能够使用getOoxml和insertOoxml来更新表单元格值(希望更快,尽管我看到Word Online中的速度可能非常慢)。 因此,我将使用getOoxml在CCs中获取Ooxml表,然后以编程方式修改xml,然后将rtooxml插入到CCs中 我能够成功地获取Ooxml,并使用C#OpenXMLPowerTools以编程方
$("#getooxml").click(getooxml);
function getooxml() {
Word.run(function (context) {
var contentControls = context.document.contentControls;
context.load(contentControls);
return context.sync().then(function () {
var ooxml = contentControls.items[0].getOoxml(); //contains a table
return context.sync().then(function () {
contentControls.items[0].insertOoxml(ooxml.value, Word.InsertLocation.replace);
return context.sync().then(function () {
console.log('inserted OOXM. CC count:' + contentControls.items.length);
});
});
});
})
.catch(function (error) {
console.log('Error: ' + JSON.stringify(error));
if (error instanceof OfficeExtension.Error) {
console.log('Debug info: ' + JSON.stringify(error.debugInfo));
}
});
}
有没有什么潜在的方法可以让它发挥作用?
例如,有没有一种方法可以修改Ooxml使其工作?我怀疑它添加CC的原因是因为getOoxml()包含父CC本身,当插入父CC时,它会添加CC(以及任何嵌套的CC)。如果是这样,如何从Ooxml中删除父CC
我有1704版本(Build 8067.2115)
这里有一个帖子指出,添加的段落问题将在下个月修复:
它还表明存在一个错误,即“替换”选项实际上没有替换(但我认为不是这样)带有表内容控件的替换选项(仅抄送包装表)可能在此处存在错误,感谢您的报告。将进行调查并报告 也就是说,我强烈建议您使用OM表,因为OOXML应该真正用于与API中尚未公开的对象进行交互。正如您所提到的,在Word Online中,OOXML虽然功能强大,但其速度确实很慢。我真的怀疑你会得到更好的性能比如果你使用表OM 如果您看到文档中的性能下降以及您用来更改表格单元格的代码,那将非常棒,这应该非常快。
谢谢 replace选项与表内容控件(cc仅包装表)可能存在错误,感谢您的报告。将进行调查并报告 也就是说,我强烈建议您使用OM表,因为OOXML应该真正用于与API中尚未公开的对象进行交互。正如您所提到的,在Word Online中,OOXML虽然功能强大,但其速度确实很慢。我真的怀疑你会得到更好的性能比如果你使用表OM 如果您看到文档中的性能下降以及您用来更改表格单元格的代码,那将非常棒,这应该非常快。
谢谢 这是出于设计,因为对于表上的内容控件,内容控件的开始标记位于第一个单元格内,结束标记位于最后一个单元格内。因此,从开始标记到结束标记的范围不是整个表 与文本获取/设置函数相比,Ooxml的获取和设置函数也较慢。因此,我建议您这样做: 由于您可能有许多表,因此可以在正在处理的表上添加一个内容控件,并为此内容控件提供一个标记。此内容控件可以位于整个表上,也可以仅位于单元格中 然后可以使用内容控件直接获取表。之后,您可以操纵表的文本 代码可以是这样的:
Word.run(function (context) {
var contentControl = context.document.contentControls.getByTag("forMyTable").getFirst();
var table = contentControl.tables.getFirst();
context.load(table);
return context.sync().then(function () {
var values = table.values;
// add some text to the second cell in the second row.
table.getCell(1, 1).value = values[1][1] + " extra";
return context.sync().then(function () {
console.log("inserted values.");
});
});
}).catch(function (error) {
console.log('Error: ' + JSON.stringify(error));
if (error instanceof OfficeExtension.Error) {
console.log('Debug info: ' + JSON.stringify(error.debugInfo));
}
});
这是出于设计,因为对于表上的内容控件,内容控件的开始标记位于第一个单元格内,结束标记位于最后一个单元格内。因此,从开始标记到结束标记的范围不是整个表 与文本获取/设置函数相比,Ooxml的获取和设置函数也较慢。因此,我建议您这样做: 由于您可能有许多表,因此可以在正在处理的表上添加一个内容控件,并为此内容控件提供一个标记。此内容控件可以位于整个表上,也可以仅位于单元格中 然后可以使用内容控件直接获取表。之后,您可以操纵表的文本 代码可以是这样的:
Word.run(function (context) {
var contentControl = context.document.contentControls.getByTag("forMyTable").getFirst();
var table = contentControl.tables.getFirst();
context.load(table);
return context.sync().then(function () {
var values = table.values;
// add some text to the second cell in the second row.
table.getCell(1, 1).value = values[1][1] + " extra";
return context.sync().then(function () {
console.log("inserted values.");
});
});
}).catch(function (error) {
console.log('Error: ' + JSON.stringify(error));
if (error instanceof OfficeExtension.Error) {
console.log('Debug info: ' + JSON.stringify(error.debugInfo));
}
});
InsertoXML可能更快,但在Word Online中速度较慢 因为您已经有了一个表,并且您的场景是为每个单元格添加值,所以我建议您使用table.addRows方法。即:
尝试一下,看看它是否比逐个单元格操作更快。谢谢 InsertoXML可能更快,但在Word Online中速度较慢 因为您已经有了一个表,并且您的场景是为每个单元格添加值,所以我建议您使用table.addRows方法。即: