Ooxml 中不显示下划线
Underline doesn't display in Ooxml
我正在调试 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 和 />:
之间的 space
<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>
虽然我不确定 "hidden section" 的要求,但这里有两种 Open XML 标记变体,Word 将呈现为粗体、斜体和带下划线的文本。
让我们从普通文本开始,您将为此使用 w:t
元素。但是,下面的文本并未隐藏。如果您想隐藏它,您必须将 w:vanish
元素添加到 w:rPr
。在这种情况下,Word 将呈现一条细虚线而不显示正常的下划线(无论如何都不应该在专业排版文档中使用)。
<w:p>
<w:r>
<w:rPr>
<w:b/>
<w:i/>
<w:u w:val="single"/>
</w:rPr>
<w:t>string of text</w:t>
</w:r>
</w:p>
在您的问题中,您使用的是 w:instrText
元素,该元素通常是复杂字段的一部分。因此,下一个示例显示了一个复杂的字段:
<w:p>
<w:r>
<w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
<w:rPr>
<w:b/>
<w:i/>
<w:u w:val="single"/>
</w:rPr>
<w:instrText>string of text</w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="separate"/>
</w:r>
<!--
Note that Word will insert a w:r with an error message (Bookmark not found)
at this point, if you ever update fields.
-->
<w:r>
<w:fldChar w:fldCharType="end"/>
</w:r>
</w:p>
字段代码通常不会显示,因此文本被隐藏。但是,如果您更新字段,Word 将在您放置字段的位置显示一条错误消息。
在您的问题中,您没有将 w:r
元素包含在 w:fldChar
子元素中,因此您的文本将始终可见并带有下划线。此外,Word 会将 w:instrText
转换为 w:t
,因此您将回到我的第一个示例。
更新2020-03-12
如果您想创建索引,如果您使用内置功能标记条目并插入索引并显示段落标记,您将在 Word 中看到以下内容:
如果不显示段落标记,用于标记条目的字段将被隐藏:
我刚刚手动格式化了花括号中的文本。需要注意的关键是,这是一个实际的 XE
(索引条目)字段。因此,您需要为实际字段生成标记(如我的第二个示例所示)并确保该字段看起来像这样(以第一段为例):
<w:p>
<w:r>
<w:t>This is some</w:t>
</w:r>
<!-- Your field begins here -->
<w:r>
<w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
<w:instrText xml:space="preserve"> XE "</w:instrText>
</w:r>
<w:r>
<w:rPr>
<w:i/>
</w:rPr>
<w:instrText>Defoe</w:instrText>
</w:r>
<w:r>
<w:instrText xml:space="preserve">, Daniel\; </w:instrText>
</w:r>
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:instrText>Moby Dick</w:instrText>
</w:r>
<w:r>
<w:instrText xml:space="preserve">" </w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="end"/>
</w:r>
<!-- Your field ends here -->
<w:r>
<w:t xml:space="preserve"> text.</w:t>
</w:r>
</w:p>
注意字段代码中的冒号(:)和分号(;)必须转义。
我正在调试 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 和 />:
之间的 space<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>
虽然我不确定 "hidden section" 的要求,但这里有两种 Open XML 标记变体,Word 将呈现为粗体、斜体和带下划线的文本。
让我们从普通文本开始,您将为此使用 w:t
元素。但是,下面的文本并未隐藏。如果您想隐藏它,您必须将 w:vanish
元素添加到 w:rPr
。在这种情况下,Word 将呈现一条细虚线而不显示正常的下划线(无论如何都不应该在专业排版文档中使用)。
<w:p>
<w:r>
<w:rPr>
<w:b/>
<w:i/>
<w:u w:val="single"/>
</w:rPr>
<w:t>string of text</w:t>
</w:r>
</w:p>
在您的问题中,您使用的是 w:instrText
元素,该元素通常是复杂字段的一部分。因此,下一个示例显示了一个复杂的字段:
<w:p>
<w:r>
<w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
<w:rPr>
<w:b/>
<w:i/>
<w:u w:val="single"/>
</w:rPr>
<w:instrText>string of text</w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="separate"/>
</w:r>
<!--
Note that Word will insert a w:r with an error message (Bookmark not found)
at this point, if you ever update fields.
-->
<w:r>
<w:fldChar w:fldCharType="end"/>
</w:r>
</w:p>
字段代码通常不会显示,因此文本被隐藏。但是,如果您更新字段,Word 将在您放置字段的位置显示一条错误消息。
在您的问题中,您没有将 w:r
元素包含在 w:fldChar
子元素中,因此您的文本将始终可见并带有下划线。此外,Word 会将 w:instrText
转换为 w:t
,因此您将回到我的第一个示例。
更新2020-03-12
如果您想创建索引,如果您使用内置功能标记条目并插入索引并显示段落标记,您将在 Word 中看到以下内容:
如果不显示段落标记,用于标记条目的字段将被隐藏:
我刚刚手动格式化了花括号中的文本。需要注意的关键是,这是一个实际的 XE
(索引条目)字段。因此,您需要为实际字段生成标记(如我的第二个示例所示)并确保该字段看起来像这样(以第一段为例):
<w:p>
<w:r>
<w:t>This is some</w:t>
</w:r>
<!-- Your field begins here -->
<w:r>
<w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
<w:instrText xml:space="preserve"> XE "</w:instrText>
</w:r>
<w:r>
<w:rPr>
<w:i/>
</w:rPr>
<w:instrText>Defoe</w:instrText>
</w:r>
<w:r>
<w:instrText xml:space="preserve">, Daniel\; </w:instrText>
</w:r>
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:instrText>Moby Dick</w:instrText>
</w:r>
<w:r>
<w:instrText xml:space="preserve">" </w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="end"/>
</w:r>
<!-- Your field ends here -->
<w:r>
<w:t xml:space="preserve"> text.</w:t>
</w:r>
</w:p>
注意字段代码中的冒号(:)和分号(;)必须转义。