Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging Word documents in folder using c#

Tags:

c#

merge

ms-word

I currently have a window-form that when a button is pressed, will merge 3 separate word docx's into one combined file.

 private void button1_Click(object sender, EventArgs e)
    {

            string document1 = @"C:\Test\Test1.docx";
            string document2 = @"C:\Test\Test2.docx";
            string document3 = @"C:\Test\Test3.docx";

            string[] documentsToMerge = { document1, document2, document3 };

            string outputFileName = String.Format(@"C:\Test\Merge\Combined.docx", Guid.NewGuid());

            MsWord.Merge(documentsToMerge, outputFileName, true);}

however, I want to select the containing folder ("C:\Test") as opposed to each individual file. This will allow me to combine alot more files without having to code them into the program individually, which would make it much more practical when using.

Is there any suggestions how to achieve this?

public static void Merge(string[] filesToMerge, string outputFilename, bool insertPageBreaks, string documentTemplate)
    {
        object defaultTemplate = documentTemplate;
        object missing = System.Type.Missing;
        object pageBreak = Word.WdBreakType.wdSectionBreakNextPage;
        object outputFile = outputFilename;

        // Create a new Word application
        Word._Application wordApplication = new Word.Application();

        try
        {
            // Create a new file based on our template
            Word.Document wordDocument = wordApplication.Documents.Add(
                                          ref missing
                                        , ref missing
                                        , ref missing
                                        , ref missing);

            // Make a Word selection object.
            Word.Selection selection = wordApplication.Selection;

            //Count the number of documents to insert;
            int documentCount = filesToMerge.Length;

            //A counter that signals that we shoudn't insert a page break at the end of document.
            int breakStop = 0;

            // Loop thru each of the Word documents
            foreach (string file in filesToMerge)
            {
                breakStop++;
                // Insert the files to our template
                selection.InsertFile(
                                            file
                                        , ref missing
                                        , ref missing
                                        , ref missing
                                        , ref missing);

                //Do we want page breaks added after each documents?
                if (insertPageBreaks && breakStop != documentCount)
                {
                    selection.InsertBreak(ref pageBreak);
                }
            }

            // Save the document to it's output file.
            wordDocument.SaveAs(
                            ref outputFile
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing
                        , ref missing);

            // Clean up!
            wordDocument = null;
        }
        catch (Exception ex)
        {
            //I didn't include a default error handler so i'm just throwing the error
            throw ex;
        }
        finally
        {
            // Finally, Close our Word application
            wordApplication.Quit(ref missing, ref missing, ref missing);
        }
    }
}

this is the MsWord.merge referenced in the first section of code. i've attempted using ' lnkResult.NavigateUrl = ' however i was unsuccessful.

like image 728
cgraham720 Avatar asked Mar 14 '16 08:03

cgraham720


People also ask

How do I merge two Word documents with track changes?

Click Review > Compare > Combine. Under Original document, click the arrow and then click the document that contains the combined changes. Under Revised document, click the next copy you want to merge. In the Label unmarked changes with box, type a name or phrase so you'll know who suggested the changes.

What happens when you merge Word documents?

The contents of the selected Word document will be combined with your open document. If it's a new document, the contents will appear from the beginning. If you're merging Word files into an existing document, the contents of your inserted files will appear below any existing content.


2 Answers

got the issue resolved using the getFiles method

string[] filePaths = Directory.GetFiles(@"c:\Test\");

string[] documentsToMerge = filePaths;

string outputFileName = (@"C:\Test\Merge\Combined.docx");

MsWord.Merge(documentsToMerge, outputFileName, true);

thank you for the help.

like image 179
cgraham720 Avatar answered Oct 06 '22 01:10

cgraham720


Since GetFiles() will get you all files the 2nd overload fits way better. To get all word docs (*.doc & *.docx) call:

//Add *.doc
string[] allWordDocuments = Directory.GetFiles("YourDirectory", "*.doc", SearchOptions.AllDirectorys); //Or if you want only SearchOptions.TopDirectoryOnly

As NineBerry told in his comment this will include also *.docx !!!

This will get you all *.doc & *.docx and ignore all other file types. This will avoide errors, since GetFiles("directoryName") will get all files which can lead to errors in MsWord.Merge() if you hand over files such as *.exe

So a simple approach would be:

string outputPath = @"C:\Test\Merge\Combined.docx";

MsWord.Merge(allWordDocuments, outputPath, true); 
like image 26
Felix D. Avatar answered Oct 05 '22 23:10

Felix D.