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>

注意字段代码中的冒号(:)和分号(;)必须转义。