使用Javascript API在Word文档中的光标处插入表格

时间:2018-02-13 12:10:21

标签: javascript typescript office-js word-addins

问题

目前我正在开发一个Word插件,为客户端提供模板功能。我想在光标附近放置一个包含单个单元格表的ContentControl。 Javascript API提供此功能,可以看作here (ContentControl class)。不幸的是,可以在控件内容之前或之后放置表,但是不可能用表替换内容。每当我尝试实现后者时,我都会收到InvalidArgument异常。

同样,我无法在选择的文档中直接添加表(没有ContentControl)。抛出相同的异常。但是,在这种情况下,指定哪个位置选项(在之前,之后,替换内容等)并不重要。

使用的技术是React和打字稿。

内容控制表

private placeTableControl() {
    Word.run(function (context) {
        var values = [["Apple"]];

        let selectionRange = context.document.getSelection();
        let contentControl = selectionRange.insertContentControl();

        // This works
        // let table = contentControl.insertTable(1, 1, 'Start', values);

        // This doesn't
        let table = contentControl.insertTable(1, 1, 'Replace', values);

        return context.sync()
            .catch(function (error) {
                console.log(error);
            });
    });
}

在没有ContentControl的情况下添加表

private placeTable() {
    Word.run(function (context) {
        var values = [["Apple"]];

        let selectionRange = context.document.getSelection();

        // This doesn't work.
        let table = selectionRange.insertTable(1, 1, 'Replace', values);

        // Neither does this.
        //let table = selectionRange.insertTable(1, 1, 'Start', values);

        // Or this.
        //let table = selectionRange.insertTable(1, 1, 'End', values);

        return context.sync()
            .catch(function (error) {
                console.log(error);
            });
    });
}

部分解决 - 建议Cindy Meister

Cindy Meister建议它可能与段落有关。表应位于段落中。由于我在指定简单数组而不是2D数组时出错,我无法使其工作。这似乎现在正在起作用。我现在将尝试使用内容控件。

private placeTable() {
    Word.run(function (context) {
        var values = [["Apple"]];

        var selectionRange = context.document.getSelection();

        var paragraph = selectionRange.insertParagraph("", "Before");

        return context.sync()
            .then(function () {
                paragraph.insertTable(1, 1, "Before", values);
            })
            .then(context.sync)
            .catch(function (error) {
                console.log(error);
            });
    });
}

类似问题

发现了类似的问题here

2 个答案:

答案 0 :(得分:3)

Cindy Meister建议首先插入一个段落,因为表格不能插入包含其他内容的段落中。结果证明是解决方案,请参阅下面的代码。所有学分都属于Cindy Meister。

{{1}}

答案 1 :(得分:1)

作为第二个选项,您可以选择在“选择之后”插入表格,它将为您创建段落。检查一下:(然后你可以用table.insertContentControl来包装内容控件)

async function insertTable() {
    await Word.run(async (context) => {
        // We need a 2D array to hold the initial table values
        let data = [["Apple", "Orange", "Pineapple"], ["Tokyo", "Beijing", "Seattle"]];
        let table = context.document.getSelection().insertTable(3, 3, "after", data);
        table.styleBuiltIn = Word.Style.gridTable5Dark_Accent2;

        await context.sync();
    });
}