We have one project that required us to merge serval microsoft word documents into one single file. To achive this, I made a class library, which is able to merge multiple word documents into one follow some sequence. The source code is:
public class DocMerger
{
private ApplicationClass objApp = null;
private Document objDocLast = null;
private Document objDocBeforeLast = null;
/// <summary>
/// Initializes a new instance of the <see cref="DocMerger"/> class.
/// </summary>
public DocMerger()
{
objApp = new ApplicationClass();
}
/// <summary>
/// Opens the specified word document.
/// </summary>
/// <param name="wordDocument">The word document.</param>
private void Open(string wordDocument)
{
object objTempDoc = tempDoc;
object objMissing = System.Reflection.Missing.Value;
objDocLast = objApp.Documents.Open(
ref objTempDoc, //FileName
ref objMissing, //ConfirmVersions
ref objMissing, //ReadOnly
ref objMissing, //AddToRecentFiles
ref objMissing, //PasswordDocument
ref objMissing, //PasswordTemplate
ref objMissing, //Revert
ref objMissing, //WritePasswordDocument
ref objMissing, //WritePasswordTemplate
ref objMissing, //Format
ref objMissing, //Enconding
ref objMissing, //Visible
ref objMissing, //OpenAndRepair
ref objMissing, //DocumentDirection
ref objMissing, //NoEncodingDialog
ref objMissing //XMLTransform
);
objDocLast.Activate();
}
/// <summary>
/// Saves as another word document.
/// </summary>
/// <param name="outWordDocument">The out word document.</param>
private void SaveAs(string outWordDocument)
{
object objMissing = System.Reflection.Missing.Value;
object objOutDoc = outDoc;
objDocLast.SaveAs(
ref objOutDoc, //FileName
ref objMissing, //FileFormat
ref objMissing, //LockComments
ref objMissing, //PassWord
ref objMissing, //AddToRecentFiles
ref objMissing, //WritePassword
ref objMissing, //ReadOnlyRecommended
ref objMissing, //EmbedTrueTypeFonts
ref objMissing, //SaveNativePictureFormat
ref objMissing, //SaveFormsData
ref objMissing, //SaveAsAOCELetter,
ref objMissing, //Encoding
ref objMissing, //InsertLineBreaks
ref objMissing, //AllowSubstitutions
ref objMissing, //LineEnding
ref objMissing //AddBiDiMarks
);
}
/// <summary>
/// Loop the list of word document files and merge it.
/// </summary>
/// <param name="tempDoc">The temp doc.</param>
/// <param name="arrCopies">The file list.</param>
/// <param name="outDoc">The out doc.</param>
public void CopyMerge(string tempDoc, string[] arrCopies, string outDoc)
{
object objMissing = Missing.Value;
object objFalse = false;
object objTarget = WdMergeTarget.wdMergeTargetSelected;
object objUseFormatFrom = WdUseFormattingFrom.wdFormattingFromSelected;
try
{
Open(tempDoc);
foreach (string fileName in arrCopies)
{
objDocLast.Merge(
fileName, //FileName
ref objTarget, //MergeTarget
ref objMissing, //DetectFormatChanges
ref objUseFormatFrom, //UseFormattingFrom
ref objMissing //AddToRecentFiles
);
objDocBeforeLast = objDocLast;
objDocLast = objApp.ActiveDocument;
if (objDocBeforeLast != null)
{
objDocBeforeLast.Close(
ref objFalse, //SaveChanges
ref objMissing, //OriginalFormat
ref objMissing //RouteDocument
);
}
}
SaveAs(outDoc);
foreach (Document objDocument in objApp.Documents)
{
objDocument.Close(
ref objFalse, //SaveChanges
ref objMissing, //OriginalFormat
ref objMissing //RouteDocument
);
}
}
finally
{
objApp.Quit(
ref objMissing, //SaveChanges
ref objMissing, //OriginalFormat
ref objMissing //RoutDocument
);
objApp = null;
}
}
/// <summary>
/// Copies the merge.
/// </summary>
/// <param name="tempDoc">The temp doc.</param>
/// <param name="sourceFolder">The source folder.</param>
/// <param name="outputDocument">The output document.</param>
public void CopyMerge(string tempDoc, string sourceFolder, string outputDocument)
{
string[] arrFiles = Directory.GetFiles(sourceFolder);
CopyMerge(tempDoc, arrFiles, outputDocument);
}
/// <summary>
/// Inserts the merge.
/// </summary>
/// <param name="tempDoc">The temp doc.</param>
/// <param name="fileList">The file list.</param>
/// <param name="outDoc">The out doc.</param>
public void InsertMerge(string tempDoc, string[] fileList, string outDoc)
{
object objMissing = Missing.Value;
object objFalse = false;
object confirmConversion = false;
object link = false;
object attachment = false;
try
{
Open(tempDoc);
foreach (string strCopy in fileList)
{
objApp.Selection.InsertFile(
strCopy,
ref objMissing,
ref confirmConversion,
ref link,
ref attachment
);
}
SaveAs(outDoc);
foreach (Document objDocument in objApp.Documents)
{
objDocument.Close(
ref objFalse, //SaveChanges
ref objMissing, //OriginalFormat
ref objMissing //RouteDocument
);
}
}
finally
{
objApp.Quit(
ref objMissing, //SaveChanges
ref objMissing, //OriginalFormat
ref objMissing //RoutDocument
);
objApp = null;
}
}
/// <summary>
/// Inserts the merge.
/// </summary>
/// <param name="tempDoc">The temp doc.</param>
/// <param name="strCopyFolder">The STR copy folder.</param>
/// <param name="outDoc">The out doc.</param>
public void InsertMerge(string tempDoc, string strCopyFolder, string outDoc)
{
string[] arrFiles = Directory.GetFiles(strCopyFolder);
InsertMerge(tempDoc, arrFiles, outDoc);
}
}
You can download it by click Here.