【发布时间】:2020-03-03 22:01:54
【问题描述】:
我正在调试一个 Word office js 插件。它需要做的一件事是在 word 文档中创建一个隐藏部分。为此,我将一些信息传递给创建 OoXML 字符串的 javascript 函数。我让用户能够在部分中嵌入一些文本,并且用户需要能够将斜体、粗体、下划线或将这些格式的任何组合应用于嵌入的文本。斜体和粗体可以正常工作,但下划线不起作用。
嵌入的文本被输入到加载项的 html 文本框中。用户可以单击一个按钮来斜体,另一个按钮来加粗,第三个按钮来下划线,或者第四个按钮来删除这些装饰。按钮的点击事件会添加和添加 html 标签,因此会发送一串粗体、斜体和下划线的文本,如下所示:
<b><i><u>string of text</u></i></b>
然后另一个函数将其转换为 Ooxml。生成的 ooxml 如下所示:
<w:r> <w:rPr> <w:b /> <w:i /> <w:u /> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>
(我可以在控制台日志中看到 ooxml 字符串)。
代码将它插入到文档中后,它被加粗和斜体,但没有下划线。我尝试过使用生成代码的函数,例如删除 w:u 和 /> 之间的空格:
<w:r> <w:rPr> <w:b/> <w:i/> <w:u/> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>
我尝试删除这些标签上的尾随反斜杠,但这破坏了 range.insertOoxml() 调用。我还尝试添加 w:val="single" 属性,因为我不确定是否需要 val,即:
<w:r> <w:rPr> <w:b /> <w:i /> <w:u w:val="single" /> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>
在这一点上我很难过。代码对于使用什么标签是不可知的——它不关心它是 b、i 还是 u。我知道<w:b /> 和<w:i /> 是切换,而<w:u /> 可能不是——我需要以不同的方式处理吗?有没有其他人遇到过这个问题,有人可以指出 Ooxml 有什么问题吗?
谢谢。
编辑:澄清一下,我最初包含的只是隐藏部分内文本的格式。下面是代码创建的完整 OoXml。我将原始格式化文本之前和之后的代码分开,以便您可以看到它适合整个 OoXml 代码的位置:
格式化文本字符串之前:
<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:r> <w:fldChar w:fldCharType='begin' /> </w:r> <w:r><w:rPr><w:color w:val='C00000'/></w:rPr><w:instrText xml:space="preserve">
"XE Startindex_1_id_000014_e"</w:instrText> </w:r>
格式化的文本字符串:
<w:r> <w:rPr> <w:b /> <w:i /> <w:u /> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>
格式化后的文本字符串:
<w:r><w:rPr><w:color w:val='C00000'/></w:rPr><w:instrText xml:space="preserve">"XE Endindex_1_id_000014"</w:instrText> </w:r> <w:r> <w:fldChar w:fldCharType='end' /> </w:r></w:p></w:body></w:document></pkg:xmlData></pkg:part></pkg:package>
【问题讨论】:
-
您似乎正在将其写入域代码,但没有提供有关 什么样的域 的信息 - 这可能是一个因素。最简单的方法是在 Word(作为用户)中创建一个包含基本内容(字段)的文档。根据需要格式化(如果下划线被接受!),保存并关闭。在 Open XML SDK Productivity Tool 中打开文档并检查 XML - 查看它是否/如何与您的代码生成的不同。
-
谢谢辛迪。我不知道 Open XML SDK Productivity 工具——它非常有用。我正在处理您的建议。
-
我看到的很奇怪。如果我使用 Word 的粗体和斜体功能,我可以看到(使用 Open XML SDK Productivity 工具)文档中的 和 标记。我可以在自己生成的代码中看到 标记,但 标记根本不存在。尽管验证了要插入的文本在我调用之前立即显示 标记: var range = context.document.getSelection(); range.insertOoxml(txt, "开始");
标签: javascript ms-word office-js openxml word-addins