【问题标题】:Underline doesn't display in OoxmlOoxml 中不显示下划线
【发布时间】: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。我知道&lt;w:b /&gt;&lt;w:i /&gt; 是切换,而&lt;w:u /&gt; 可能不是——我需要以不同的方式处理吗?有没有其他人遇到过这个问题,有人可以指出 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


【解决方案1】:

虽然我不太确定“隐藏部分”的要求,但这里有两种 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:fldChar 子元素中包含 w:r 元素,因此您的文本将始终可见并带有下划线。此外,Word 会将w:instrText 转换为w:t,因此您将回到我的第一个示例。

2020 年 3 月 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>

请注意,您必须在域代码中转义冒号 (:) 和分号 (;)。

【讨论】:

  • 您好 Thomas,感谢您的回复。我编辑了我的问题,以便您可以看到完整的上下文。我已经包含了 w:fldChar 开始和结束元素。
  • 为什么我的回答被否决了?如果认为没有帮助,很高兴删除。
  • @NedBalzer,你为什么要使用w:instrText 元素?这是针对字段的,您正在尝试插入非字段文本(至少看起来如此)。
  • 我没有投反对票,抱歉,我认为它很有帮助,但仍在尝试找出解决方案。我在 StackOverflow 上还没有足够的声誉/信誉来支持或反对。
  • 我确实从另一个程序员那里继承了这段代码,所以我不确定为什么要使用 w:instrText。这是我的第一个 OoXml 和 Word-js 项目。我很高兴听到任何其他改进代码的建议——这对我来说似乎过于复杂。我会尝试一些更简单的东西。
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多