Ms word Word Office.js:使用getOoxml()和insertOoxml()更新ContentControls中的表时出现问题

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以编程方

我正在尝试更新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,因此没有帮助

下面是脚本实验室中的简化代码:

$("#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方法。即:

  • 使用table.deleteRows(1,rowCount)删除除第一行以外的所有行
  • 使用table.addRows(“end”,rowCount,values)添加回这些行,其中值是一个二维字符串数组

  • 尝试一下,看看它是否比逐个单元格操作更快。谢谢

    InsertoXML可能更快,但在Word Online中速度较慢

    因为您已经有了一个表,并且您的场景是为每个单元格添加值,所以我建议您使用table.addRows方法。即:

  • 使用table.deleteRow删除除第一行以外的所有行