【问题标题】:Inserting table at cursor in Word document with Javascript API使用 Javascript API 在 Word 文档中的光标处插入表格
【发布时间】:2018-02-13 12:10:21
【问题描述】:

问题

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

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

使用的技术是 React 和 typescript。


内容控制表

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 认为这可能与段落有关。表格应位于一个段落中。由于我在指定简单数组而不是二维数组时出错,我无法使其工作。这似乎现在起作用了。我现在将尝试使其与内容控件一起使用。

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

【问题讨论】:

  • Word 无法在段落中间插入表格 - 选择必须位于不包含任何其他内容的段落中。你确定选择在一个有效的地方吗?尝试插入一个段落并将表格放在该范围内...
  • 感谢您的意见!我明天测试一下!
  • 不幸的是,我无法完成这项工作。我在答案中添加了代码。也许我忽略了一些东西。
  • @CindyMeister 看来你是对的!添加段落允许添加表格!谢谢!将其添加为答案,我会接受。
  • 如果你已经完成了代码,请写下答案。我擅长 Word,但不擅长编写 office-js 代码(还)。如果您在答案中提及我,那就足够了。写另一条评论,“ping”我,我会投赞成票:-)

标签: javascript typescript office-js word-addins


【解决方案1】:

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

private placeTable() {

    Word.run(function (context) {
        var values = [["Apple"]];
        var selectionRange = context.document.getSelection();
        var paragraph = selectionRange.insertParagraph("", "Before");

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

【讨论】:

  • 写得非常干净——这有助于我学习这个:-)谢谢。
【解决方案2】:

作为第二个选项,您可以选择在选择“之后”插入表格,它将为您创建段落。看看这个:(然后你可以做 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();
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多