Office.js/Word Javascript API 中的 insertOoxml 方法中的错误

Posted

技术标签:

【中文标题】Office.js/Word Javascript API 中的 insertOoxml 方法中的错误【英文标题】:insertOoxml fails silently 【发布时间】:2016-11-04 22:02:48 【问题描述】:

如何报告 Office.js/Word javascript API 中的错误?

错误是,当尝试通过 range.insertOoxml(...) 或 context.document.body.insertOoxml(...) 插入类似锚的书签时,api 指示成功,但生成的文档确实如此没有书签。唯一的解决方法是在带有锚的段落之后插入一个附加段落。不幸的是,这会在正文中引入额外的换行符,从而破坏体验。

基本上,这会默默地失败......

<w:body>
<w:p>
<w:bookmarkStart w:id="0" w:name="bookmarkAnchor"/>
<w:bookmarkEnd w:id="0"/>
</w:p>
</w:body>

...但这有效....

<w:body>
<w:p>
<w:bookmarkStart w:id="0" w:name="bookmarkAnchor"/>
<w:bookmarkEnd w:id="0"/>
</w:p>
<w:p/> <--- this is a miserable workaround!
</w:body>

我很高兴上传一些显示问题的测试代码。

【问题讨论】:

【参考方案1】:

感谢您发送此问题。 这里有 3 个问题:

    首先,您的示例中描述的 XML 是 WordProcessingML,而不是 OOXML。 insertOoxml method 预计会收到完整的 Office Open XML。

    也就是说...我为您的示例找到了一个稍微不同的 OOXML 表示,它可以在不添加新段落的情况下工作,请参见下面的示例。

    为什么要使用书签?从开发人员的角度来看,使用它们超级不可靠,我强烈建议您改用内容控件。书签很容易被最终用户破坏。

好的,首先这里是我正在使用的标记:

<?xml version="1.0" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
  <pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512">
    <pkg:xmlData>
      <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
      </Relationships>
    </pkg:xmlData>
  </pkg:part>

  <pkg:part pkg:name="/word/document.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml">
    <pkg:xmlData>
      <w:document  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <w:body>
          <w:p w:rsidR="00000000" w:rsidRDefault="005C4C17">
            <w:bookmarkStart w:id="0" w:name="MyBookmark"/>
            <w:r>
              <w:t>provides</w:t>
            </w:r>
            <w:bookmarkEnd w:id="0"/>
          </w:p>
          <w:sectPr w:rsidR="00000000">
            <w:pgSz w:w="12240" w:h="15840"/>
            <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
            <w:cols w:space="720"/>
          </w:sectPr>
        </w:body>
      </w:document>
    </pkg:xmlData>
  </pkg:part>
</pkg:package>

这里是代码:

 function insertOOXMLwithBookmark() 

        Word.run(function (context) 
            var myOOXML = "<?xml version='1.0' standalone='yes'?> <?mso-application progid='Word.Document'?> <pkg:package xmlns:pkg='http://schemas.microsoft.com/office/2006/xmlPackage'> <pkg:part pkg:name='/_rels/.rels' pkg:contentType='application/vnd.openxmlformats-package.relationships+xml' pkg:padding='512'> <pkg:xmlData> <Relationships xmlns='http://schemas.openxmlformats.org/package/2006/relationships'> <Relationship Id='rId1' Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument' Target='word/document.xml'/> </Relationships> </pkg:xmlData> </pkg:part> <pkg:part pkg:name='/word/document.xml' pkg:contentType='application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'> <pkg:xmlData> <w:document xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'> <w:body> <w:p w:rsidR='00000000' w:rsidRDefault='005C4C17'> <w:bookmarkStart w:id='0' w:name='MyBookmark'/> <w:r> <w:t>provides</w:t> </w:r> <w:bookmarkEnd w:id='0'/> </w:p> <w:sectPr w:rsidR='00000000'> <w:pgSz w:w='12240' w:h='15840'/> <w:pgMar w:top='1440' w:right='1440' w:bottom='1440' w:left='1440' w:header='720' w:footer='720' w:gutter='0'/> <w:cols w:space='720'/> </w:sectPr> </w:body> </w:document> </pkg:xmlData> </pkg:part> </pkg:package>";

            context.document.getSelection().insertOoxml(myOOXML, "replace");
            return context.sync();

示例代码只是替换当前选择或将其添加到插入点(基本上是一个范围),但当然您可以在任何支持范围的对象中重用这个完全相同的方法 让我知道这是否适合您并祝您编码愉快!!!

顺便说一句,我写了一篇你可能会觉得有用的文章: http://dev.office.com/docs/add-ins/word/create-better-add-ins-for-word-with-office-open-xml

【讨论】:

Juan - 感谢您的回答,但不幸的是它不起作用。让我解释一下……这个想法是插入一个“类似锚点”的书签……这意味着在 bookmarkStart 和 bookmarkEnd 元素之间没有任何意义。如果您打开 word 并将插入符号放在两个字符之间并让 Word 插入书签,您就会明白我的意思。书签不包含任何内容,它只是让您可以跳回。 续我会回答你的 3 个问题 (1) 是的,insertOoxml 采用 OPC; OOXML 是 WordProcessingML、SpreadsheetML、PresentationML。老实说,我认为这是一个名称不佳的函数(2)请参阅我上面的评论,是的,它有效,但不幸的是,这不是我想要做的(3)这里有一个更长的故事,我同时使用两者,故事的要点是内容控件带有视觉行为,这对于我需要在文档中标记的所有结构来说都是不可取的。书签不仅是唯一的其他选项,而且它们在标准中并且具有完美的编辑行为。 书签行为在此处有详细记录:link。用户也可以通过“选项”菜单显示或隐藏它们。此外,即使用户决定通过选项显示它们,也可以通过编程方式将它们从主视图显示中隐藏,方法是给它们一个以“_”开头的唯一名称;只能以编程方式创建。我必须相信其他人正在使用它们来识别文档中的结构(例如发布过程)。 我发布了一个Word Add-in Bookmark Sample,它将书签从外接程序插入到 Word 文档中。 Word 中的错误记录在代码中,以及在 API 中原生支持书签的请求。 有兴趣了解所有细节,谢谢。我听到有关内容控件的唯一原因是关于视觉行为,但是您知道您可以将内容控件的外观更改为不可见吗?那么你也没有你所指的视觉行为。我想了解为什么这不是您的方案的选择。书签非常不可靠,这也是我们明确不在 API 中添加对它们的支持的原因之一。

以上是关于Office.js/Word Javascript API 中的 insertOoxml 方法中的错误的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript介绍

javascript的题。

javascript JavaScript isset()等效: - JavaScript

JavaScript 使用JavaScript更改CSS(JavaScript)

JavaScript之基础-1 JavaScript(概述基础语法)

前端基础-JavaScript的基本概述和语法