Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用合并(SimpleField)字段从.dotx生成.docx_C#_Openxml_Mailmerge - Fatal编程技术网

C# 使用合并(SimpleField)字段从.dotx生成.docx

C# 使用合并(SimpleField)字段从.dotx生成.docx,c#,openxml,mailmerge,C#,Openxml,Mailmerge,因此,首先,这里是我打开dotx并创建一个新的docx副本(然后修改副本)的代码。为简洁起见,剪切,但本质上需要3个参数:数据表(以使其可供遗留系统使用)、模板的UNC路径作为字符串、输出文档的UNC路径作为字符串: using (WordprocessingDocument docGenerated = WordprocessingDocument.Open(outputPath, true)) { docGenerated.ChangeDocumentType(Wordprocess

因此,首先,这里是我打开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();
}
使用(WordprocessingDocument docGenerated=WordprocessingDocument.Open(outputPath,true))
{
docGenerated.ChangeDocumentType(WordprocessingDocumentType.Document);
foreach(docGenerated.MainDocumentPart.Document.Substanders()中的SimpleField字段)
{
字符串mergeFieldName=GetFieldName(field).Trim();
DataRow[]dr=dtSchema。选择(“FieldName=”+mergeFieldName+”);
如果(dr.Length>0)
{
string runProperties=string.Empty;
foreach(field.subjects()中的RunProperties属性)
{
runProperties=property.OuterXml;
打破
}
运行=新运行();
Append(新的RunProperties(RunProperties));
run.Append(新文本(dr[0][“FieldDataValue”].ToString());
field.Parent.ReplaceChild(运行,字段);
}
}
docGenerated.MainDocumentPart.Document.Save();
}
我最初做的是使用.dot模板并将其重新保存为.dotx,然后祈祷成功,但没有成功。因此,我尝试删除.dotx中的所有合并字段并再次添加它们。这是可行的,但它只能找到一个合并字段(作为SimpleField),特别是保存.dotx之前添加的最后一个合并字段。通过使用OpenXMLProductivity工具进一步查看模板,我可以看到所有其他合并字段的类型都是w:instrText,这就是它们被忽略的原因

我只是从OpenXML开始,因为我们希望用它来取代目前的办公自动化,所以目前我所知甚少。有没有人能再进一步告诉我,或者给我指一个好的资源?我用谷歌搜索了一下,但找不到我的具体问题。我试图推迟阅读整个SDK文档(我知道,我知道!),因为我需要快速找到一个解决方案,所以我只专注于一项任务,即获取现有的.dot模板,将其转换为.dotx,并用数据替换合并字段以派生.docx


提前谢谢

使用OpenXml—您不需要严格地将.dotx用于模板,相反,您可以直接使用DocX制作模板。学习OpenXML的一个很好的资源显然是,你可以在那里找到一本很好的读物

还值得一看第三方API docx.codeplex.com,我现在使用它为我的公司开发服务器端文档自动化解决方案。请参见与您的场景类似的示例。。正在将字段与数据合并。。
希望这对使用OpenXml有所帮助。

您不需要严格使用.dotx作为模板,您可以直接使用DocX制作模板。学习OpenXML的一个很好的资源显然是,你可以在那里找到一本很好的读物

还值得一看第三方API docx.codeplex.com,我现在使用它为我的公司开发服务器端文档自动化解决方案。请参见与您的场景类似的示例。。正在将字段与数据合并。。
希望这对您有所帮助。

如果您想使用内容控件,也可以尝试WordDocumentGenerator。WordDocumentGenerator是一个使用Visual Studio 2010和Open XML 2.0 SDK从模板生成Word文档的实用工具@

如果要使用内容控件,也可以尝试使用WordDocumentGenerator。WordDocumentGenerator是一个使用Visual Studio 2010和Open XML 2.0 SDK从模板生成Word文档的实用工具@

以下是指向“C#OpenXML邮件合并完整示例”的链接

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

以下是指向“C#OpenXML邮件合并完整示例”的链接


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

谢谢!这里有一些非常好的链接,docxapi看起来很有趣,将首先尝试一下。谢谢!这里有一些非常好的链接,docxapi看起来很有趣,会先尝试一下。谢谢,但我正在尝试在代码中这样做,而不(希望)依赖第三方。一旦我从.dotx中创建了这个.docx,那么我就需要着手处理更复杂的事情,然后我就有时间对OpenXML文档进行更多的阅读。谢谢,但我正试图在代码中做到这一点,而不(希望)依赖第三方。一旦我从.dotx中创建了这个.docx,那么我就需要开始更复杂的工作,然后我就有时间阅读OpenXML文档了。