关于this post我一直在使用Word的Open XML和可用的库。大多数人似乎都不知道的是,有一些很好的resources以编程方式处理Word的Open XML格式(我并不是指手动将XML写入文件流!)。
我的问题是关于我正在做的事情。基本上,我是手动创建邮件合并。现在,邮件合并实际上工作正常,但不能正常工作的是将邮件合并字段放在文档中。这就是我正在做的事情:
string mergeFieldName = m.Value.Replace("[", string.Empty).Replace("]", string.Empty);
Body body = new Body();
DocumentFormat.OpenXml.Wordprocessing.Paragraph p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph();
SimpleField simpleField = new SimpleField() { Instruction = " MERGEFIELD " + mergeFieldName + " " };
Run run = new Run();
RunProperties runProperties = new RunProperties();
NoProof noProof = new NoProof();
runProperties.Append(noProof);
Text text = new Text("«" + mergeFieldName + "»");
run.Append(runProperties);
run.Append(text);
simpleField.Append(run);
p.Append(simpleField);
body.Append(p);
docXml.InnerXml = docXml.InnerXml.Replace(m.Value, body.InnerXml);
变量m
实际上是一个Match
对象,它基于我的正则表达式,匹配方括号内的所有内容。 (你可能想知道我为什么这样做,就像我一样 - 这里没有关系)
我的问题是生成的XML无效,因为我有以下内容:
<w:p w:rsidR="00945DC1" w:rsidRDefault="006878CA">
<w:r>
<w:t xml:space="preserve">
<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:fldSimple w:instr=" MERGEFIELD FullName ">
<w:r>
<w:rPr>
<w:noProof />
</w:rPr>
<w:t>«FullName»</w:t>
</w:r>
</w:fldSimple>
</w:p>
</w:t>
</w:r>
</w:p>
这是一个从手动创建的文档中使用XML的示例:
<w:p w:rsidR="001B2242" w:rsidRDefault="001B2242">
<w:r>
<w:tab/>
</w:r>
<w:fldSimple w:instr=" MERGEFIELD "SalutationName" ">
<w:r>
<w:rPr>
<w:noProof/>
</w:rPr>
<w:t>«SalutationName»</w:t>
</w:r>
</w:fldSimple>
</w:p>
我得到的实际错误是“因为内容有问题而无法打开文件”。如果我不写出邮件合并字段,加载文档,然后插入邮件合并字段,它的工作原理。所以实际的邮件合并是正确的,它只是不正确的邮件合并字段。 (请参阅我的参考文章,了解如何合并邮件)。
关于这个的任何想法?
干杯
答案 0 :(得分:0)
我看到的是你错了。你正在把你正在创建的新XML放在一个w:t标签里面,这是一个文本标签如果我没有弄错的话
跳过Body创建并用m.Values parent的innerXml替换Paragraph p的InnerXml。
如果我正确地理解了这一点。