Question:
How to merge data into a Word document using the mail merge functionality?Using mail merge in MS Word with a data file.
Answer:
Follow these steps:
- You need a MS Word document with merge fields in it. Let's say we've got two merge fields: "name" and "town".
- Create a console project and add a reference to Microsoft.Office.Interop.Word.dll. My dll is version 14.
- We have our data in a dictionary. But you cannot pass a dictionary to Word's mail merger object. So we write the names and values to a text file.
- Finally we ask Word to open our file that contains the merge fields and merge it with the data file. The result file is saved under a new name.
Here is the merger code
private void MailMergeWithData(string pTemplFileName, string pWorkingName, Dictionary<string, string> pValTable)
{
if (!File.Exists(pTemplFileName))
{
Console.WriteLine("templatePath does not exist : " + pTemplFileName);
return;
}
Application wordApp = null;
Document wordDoc = null;
Document wordDoc2 = null;
string tempDataFile = "c:\\tmp\\data_doc.txt";
try
{
wordApp = new Application();
wordDoc = wordApp.Documents.Open(pTemplFileName);
MailMerge mm = wordDoc.MailMerge;
//wordApp.Visible = true;
CreateDataFile(tempDataFile, pValTable);
// use unicode if you use more than ascii
mm.OpenDataSource(tempDataFile, WdOpenFormat.wdOpenFormatUnicodeText, false, true, false, false);
mm.Destination = WdMailMergeDestination.wdSendToNewDocument;
mm.Execute(false);
// the merged doc becomes the active document
if (wordApp.ActiveDocument != null)
{
wordDoc2 = wordApp.ActiveDocument;
// you need to use a word save format constant to do a save as.
object wdFormat = WdSaveFormat.wdFormatDocument;
wordDoc2.SaveAs(pWorkingName, wdFormat);
wordDoc2.Saved = true;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (wordDoc != null)
{
wordDoc.Close(false);
wordDoc = null;
}
if (wordDoc2 != null)
{
wordDoc2.Close(false);
wordDoc2 = null;
}
wordApp.Quit(false);
wordApp = null;
File.Delete(tempDataFile);
}
}
And this it the data file writer code
private void CreateDataFile(string fName, Dictionary<string, string> valTable)
{
StringBuilder sbHeader = new StringBuilder();
StringBuilder sbValues = new StringBuilder();
string header = "";
string values = "";
foreach(KeyValuePair<string, string> item in valTable)
{
sbHeader.Append(item.Key);
sbHeader.Append("\t");
sbValues.Append(item.Value);
sbValues.Append("\t");
}
header = sbHeader.ToString().Trim('\t');
values = sbValues.ToString().Trim('\t');
using (FileStream fs = File.OpenWrite(fName))
{
using (StreamWriter file = new StreamWriter(fs, Encoding.UTF8))
{
file.WriteLine(header);
file.WriteLine(values);
file.Close();
}
}
}
No comments:
Post a Comment