使用OpenXML替换DOCX文件中的文本 - 奇怪的内容

时间:2015-11-30 16:03:55

标签: c# docx openxml-sdk

我正在尝试使用OpenXML SDK和Microsoft页面上的示例将替换占位符替换为Word文档中的实际内容。

它过去像here所描述的那样工作,但是在Word中编辑模板文件后添加页眉和页脚它就停止了工作。我想知道为什么和一些调试告诉我这个:

enter image description here

这段代码中texts的内容是什么:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(DocumentFile, true))
{
    var texts = wordDoc.MainDocumentPart.Document.Body.Descendants<Text>().ToList();
}

所以我在这里看到的是文档的主体是“碎片化的”,即使在Word中内容看起来像这样:

enter image description here

有人可以告诉我如何解决这个问题吗?

我被问到我想要实现的目标。基本上我想用真实内容替换用户定义的“占位符”。我想将Word文档视为模板。占位符可以是任何东西。在上面的示例中,它们看起来像{var:Template1},但这只是我正在玩的东西。它基本上可以是任何字。

例如,如果文档包含以下段落:

  

使用名称 USER_NAME

用户应该能够将USER_NAME占位符替换为单词admin,例如,保持格式不变。结果应该是

  

使用名称 admin

我看到处理段落级别的问题,连接内容和然后替换段落的内容,我担心我会丢失应保留的格式

  

请勿使用名称admin

2 个答案:

答案 0 :(得分:1)

各种事情都可以分解文本运行。最常见的校对标记(在这里显然就是这种情况,有“波浪形”)或rsid(用于比较文档和跟踪谁编辑了什么,何时),以及后面的“返回”书签Word集。如果您在document.xml“part”中查看基础WordOpenXML(例如,使用Open XML SDK Productivity Tool),这些就变得很明显了。

通常有助于将元素级别“更高”。在这种情况下,获取Paragraph后代列表,然后从中获取所有Text后代并连接其InnerText。

答案 1 :(得分:1)

OpenXML确实会破坏你的文字:

我创建了一个library来完成此操作:使用JSON中的值渲染单词模板。

来自documenation of docxtemplater

  

为什么要为此使用库

     

Docx是一种包含一些xml的压缩格式。如果您想通过值系统构建一个简单的替换{tag},它可能已经变得复杂,因为{tag}在内部被分为<w:t>{</w:t><w:t>tag</w:t><w:t>}</w:t>。如果你想嵌入循环迭代一个数组,那就变得非常麻烦了。

该库基本上将执行以下操作以保持格式化:

如果文字是:

<w:t>Hello</w:t>
<w:t>{name</w:t>
<w:t>} !</w:t>
<w:t>How are you ?</w:t>

结果将是:

<w:t>Hello</w:t>
<w:t>John !</w:t>
<w:t>How are you ?</w:t>

您还必须用<w:t xml:space=\"preserve\">替换标记,以确保在变量中有空格时不会删除空格。