使用merge(SimpleField)字段从.dotx生成.docx

时间:2012-03-22 15:57:56

标签: c# openxml mailmerge

所以,首先这里是我的代码,打开dotx并创建一个新的docx副本(然后修改其副本)。为简洁起见,但基本上需要3个参数数据表(以使其可用于遗留系统),UNC路径作为模板的字符串,UNC路径作为输出文档的字符串:

using (WordprocessingDocument docGenerated = WordprocessingDocument.Open(outputPath, true))
{
    docGenerated.ChangeDocumentType(WordprocessingDocumentType.Document);

    foreach (SimpleField field in docGenerated.MainDocumentPart.Document.Descendants<SimpleField>())
    {
        string mergeFieldName = GetFieldName(field).Trim();

        DataRow[] dr = dtSchema.Select("FieldName = '" + mergeFieldName + "'");

        if (dr.Length > 0)
        {
            string runProperties = string.Empty;
            foreach (RunProperties property in field.Descendants<RunProperties>())
            {
                runProperties = property.OuterXml;
                break;
            }

            Run run = new Run();
            run.Append(new RunProperties(runProperties));
            run.Append(new Text(dr[0]["FieldDataValue"].ToString()));

            field.Parent.ReplaceChild<SimpleField>(run, field);
        }
    }

    docGenerated.MainDocumentPart.Document.Save();
}

我最初做的是拿一个.dot模板并将其重新保存为.dotx并交叉我的手指,不起作用。所以我尝试删除.dotx中的所有合并字段并再次添加它们。这工作 - 但它只会找到一个合并字段(作为SimpleField),特别是在保存.dotx之前添加的最后一个。使用开放式XML生产力工具进一步查看模板,我可以看到所有其他合并字段都是w:instrText类型,这就是为什么它们被忽略的原因。

我真的刚刚开始使用OpenXML,因为我们正在寻找用它替换我们当前的办公自动化,所以我现在知之甚少。有人可以请进一步指导我或指出一个好的资源吗?我已经谷歌了一下,但我找不到我的具体问题。我试图推迟阅读整个SDK文档(我知道,我知道!)因为我需要快速将解决方案放在一起所以我专注于一个单独的任务,即采用我们现有的.dot模板,将它们转换为.dotx,只需用数据替换合并字段即可得到.docx。

提前致谢!

3 个答案:

答案 0 :(得分:4)

使用OpenXml - 您不需要使用.dotx作为模板,而是可以直接使用DocX制作模板。学习OpenXML的好资源显然是http://openxmldeveloper.org/,你可以在那里找到一个好的pdf

另外值得一看的是我现在用于为我的公司开发服务器端doc自动化解决方案的第三方API docx.codeplex.com。请参阅示例http://cathalscorner.blogspot.co.uk/2009/08/docx-v1007-released.html,它与您的场景类似。将字段与数据合并.. 希望这会有所帮助..

答案 1 :(得分:2)

以下是“C#OpenXML邮件合并完成示例”http://www.jarredcapellman.com/2012/10/22/c-openxml-mail-merge-complete-example/

的链接

我用它来更新我的Web应用程序代码,该代码曾用于处理.DOC(.DOT)文件中的合并域(以及要安装的所需MS Word以及要在Web服务器上配置的相应DCOM)。现在解决方案只需要在Web服务器上安装OpenXML SDK 2.0,并将.DOC(.DOT)模板保存为.DOCX(.DOTX)。

答案 2 :(得分:0)

如果要使用内容控件,还可以尝试使用WordDocumentGenerator。 WordDocumentGenerator是一个使用Visual Studio 2010和Open XML 2.0 SDK @ http://worddocgenerator.codeplex.com

从模板生成Word文档的实用程序