【发布时间】:2015-04-06 16:17:47
【问题描述】:
我尝试将 Excel 文件设置为 Word 中的 Address-List-Source(作为收件人),以便我可以使用 MailMerge 创建一个单词字母系列(例如用于 100 个地址)。
我使用DocumentFormat.OpenXml编写了以下代码,但是当我打开我的DocX文件时,没有数据源。
我使用以下代码:
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open("Microsoft Word-Dokument (neu).docx", true))
{
var settingsPart = wordDocument.MainDocumentPart.GetPartsOfType<DocumentSettingsPart>().First();
var mailMerge = new MailMerge();
mailMerge.MainDocumentType = new MainDocumentType();
mailMerge.MainDocumentType.SetAttribute(new DocumentFormat.OpenXml.OpenXmlAttribute("val", null, "formatLetters"));
string excel = @"C:\test.xlsx";
mailMerge.LinkToQuery = new LinkToQuery();
mailMerge.DataType = new DataType();
mailMerge.DataType.SetAttribute(new DocumentFormat.OpenXml.OpenXmlAttribute("val", null, "native"));
mailMerge.ConnectString = new ConnectString();
mailMerge.ConnectString.SetAttribute(new OpenXmlAttribute("val", null, "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"));
mailMerge.Query = new Query();
mailMerge.Query.SetAttribute(new OpenXmlAttribute("val", null, "SELECT * FROM `Tabelle1$`"));
mailMerge.ViewMergedData = new ViewMergedData();
mailMerge.DataSourceObject = new DataSourceObject();
mailMerge.DataSourceObject.UdlConnectionString = new UdlConnectionString();
mailMerge.DataSourceObject.UdlConnectionString.SetAttribute(new OpenXmlAttribute("val", null, "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"));
mailMerge.DataSourceObject.DataSourceTableName = new DataSourceTableName();
mailMerge.DataSourceObject.DataSourceTableName.SetAttribute(new OpenXmlAttribute("val", null, "Tabelle1$"));
mailMerge.DataSourceObject.ColumnDelimiter = new ColumnDelimiter();
mailMerge.DataSourceObject.ColumnDelimiter.SetAttribute(new OpenXmlAttribute("val", null, "9"));
settingsPart.Settings.RemoveAllChildren<MailMerge>();
settingsPart.Settings.InsertAt<MailMerge>(mailMerge, 0);
foreach (var relationship in wordDocument.ExternalRelationships.Where(Rel => Rel.RelationshipType == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/mailMergeSource"))
{
wordDocument.DeleteExternalRelationship(relationship);
}
string DataPath = excel;
var dsRelationship = wordDocument.MainDocumentPart.DocumentSettingsPart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/mailMergeSource", new Uri(string.Format("file:///{0}", DataPath)));
if (mailMerge.DataSourceReference == null)
{
mailMerge.DataSourceReference = new DataSourceReference();
}
mailMerge.DataSourceReference.Id = dsRelationship.Id;
mailMerge.ViewMergedData.Val = true;
}
以前有人解决过这个问题吗?
编辑
我添加了关系逻辑,但现在说找不到C:\test.xlsx。但它存在于正确的位置和C:\。
还缺少 SQL 语句:
编辑 2
如果我这样创建查询:
mailMerge.Query = new Query()
{
Val = "SELECT * FROM `Tabelle1$`"
};
选择查询将正确嵌入到 docx 中。
但是缺少Test.xlsx 的错误仍然存在...
【问题讨论】:
-
@bibadia 谢谢,我更改了代码,但遇到了一些新问题。您想阅读我的更改吗?谢谢!
-
@bibadia 如果您想发布任何答案,我会将赏金奖励给您! :)
标签: c# ms-word openxml newsletter mailmerge