我正在尝试使用OpenXML SDK和Microsoft页面上的示例将替换占位符替换为Word文档中的实际内容。
它过去像here所描述的那样工作,但是在Word中编辑模板文件后添加页眉和页脚它就停止了工作。我想知道为什么和一些调试告诉我这个:
这段代码中texts
的内容是什么:
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(DocumentFile, true))
{
var texts = wordDoc.MainDocumentPart.Document.Body.Descendants<Text>().ToList();
}
所以我在这里看到的是文档的主体是“碎片化的”,即使在Word中内容看起来像这样:
有人可以告诉我如何解决这个问题吗?
我被问到我想要实现的目标。基本上我想用真实内容替换用户定义的“占位符”。我想将Word文档视为模板。占位符可以是任何东西。在上面的示例中,它们看起来像{var:Template1}
,但这只是我正在玩的东西。它基本上可以是任何字。
例如,如果文档包含以下段落:
不使用名称 USER_NAME
用户应该能够将USER_NAME
占位符替换为单词admin
,例如,保持格式不变。结果应该是
不使用名称 admin
我看到处理段落级别的问题,连接内容和然后替换段落的内容,我担心我会丢失应保留的格式
请勿使用名称admin
答案 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\">
替换标记,以确保在变量中有空格时不会删除空格。