【问题标题】:How to modify the contents of a word document by changing Office Open XML representation of the file?如何通过更改文件的 Office Open XML 表示来修改 word 文档的内容?
【发布时间】:2017-03-11 05:48:47
【问题描述】:

我正在使用 Word JavaScript API 为 Office Word 2016 构建加载项。由于它不提供对文档所需的控制级别,因此我试图通过直接更改文档的 OOXML 来实现这一点。由于用户可以拥有包含任意页数的文档,因此我不确定这是否是正确的方法。我想知道是否有任何方法可以简化此操作,例如仅提取文档的一部分并将其插入回去。

【问题讨论】:

    标签: javascript ms-word ms-office office-js office-addins


    【解决方案1】:

    很好的问题,对于初学者来说,我很想知道您期望在 API 中的控制级别,我想知道您是否可以分享有关潜在差距的更多详细信息(提前致谢!)。

    现在,回答您的问题:绝对!我们通过 OOXML 打开门与文档进行交互。这是一个非常强大的工具,尽管可能很复杂(但您似乎对 WordML 很了解)而且速度可能很慢,尤其是在 Win32 或 Mac 以外的平台上(Word Online XML 注入很慢)。

    完成您需要的关键是您获得一个范围(我需要一个关于您提到的“文档的提取部分”更详细的标准,但归根结底,它是关于获得一个范围)。一旦你有了它,你实际上可以做一个 range.insertOoxml("your OOXML","re​​place") 用你拥有的任何 OOXML 替换那个范围。

    您可以通过 API 中的多种不同方式获取范围。例如,搜索方法返回一个范围的集合。所有对象都有一个可用于此的 .getRange() 方法。

    以下示例将文档中第一段的第一个单词替换为给定的 OOXML。

      Word.run(function (ctx) {
    
                 var myTempOOXML = "get some valid  OOXML!"
                 ctx.document.body.paragraphs.getFirst().split([" "],false,false,false).getFirst().insertOoxml(myTempOOXML, "replace");
                 return ctx.sync();
    
    
             }).catch(function (e) { app.showNotification(e.message)})

    希望这能让您朝着正确的方向前进。 顺便说一句,here is a useful article about ooxml and word.js

    【讨论】:

    • 感谢您的回答。我仍然很难弄清楚有效的 OOXML 字符串是什么样的。每次我得到一个范围并打印出它的 OOXML 时,我都会得到整个文档的 OOXML,而不仅仅是我期望的范围的 OOXML。 var paragraph = context.document.body.paragraphs.getFirst(); paragraph.load(); var paragraphooxml = paragraph.getOoxml(); return context.sync().then(function () { console.log(paragraphooxml.value); }); 这会打印出整个文档的 OOXML,而不仅仅是第一段。
    • 是的,请阅读我转发的文章,它讨论了如何生成尽可能少的 XML github.com/OfficeDev/office-js-docs/blob/master/docs/word/…
    • 如果您将刚刚读回的 XML 写入文档,您将看到它只是段落。
    • @JuanBalmori,死链接。 :(
    最近更新 更多