ARTICLE

Creating and Opening Microsoft Word Document from .NET Using C#

Posted by Mike Gold Articles | Windows Forms C# March 08, 2002
This article is being written in response to a couple inquiries on the question, "How do I open a word document from .NET?".
Reader Level:

WordInterop.jpg

Figure 1 - Word Launched from .NET Form

This article is being written in response to a couple inquiries on the question, "How do I open a word document from .NET?". I guess after people read my excel article, they were under the impression that I knew how to do this in Word.  Luckily, after some hunting around on the forums and feedback from other C# Corner members I got the gist of it.

The First Step in manipulating Word in .NET is that you'll need to add a COM reference to your project by right clicking in the solution explorer on References->Add Reference.  Click on the COM tab and look for the Microsoft Word 9.0 Object Library.  Click Select and OK.

ChoosingWordCOM.gif

This will automatically place an assembly in your application directory that wraps COM access to Word.  Now we are ready to create a word object in our code. To instantiate an instance of a Word application, you just declare the line below in your class:

private Word.ApplicationClass WordApp = new Word.ApplicationClass();

Now you can call the interesting methods and properties that Microsoft Word provides to you to manipulate documents in Word. Personally, I never want to figure the Microsoft Word code out myself, because the Word hierarchy and properties, although rich in features, has a bit of a learning curve. So in order to jump straight over the learning curve, I simple turn the Macro Recorder on in Word and let Word write the code for me.  (Of course this is VBA code, but...close enough). To start the macro recorder in Word, go to  Tools->Macro->Record New Macro inside Microsoft Word. Now anything you type, open, delete, or format, will get recorded in VBA, so you have a clue how to write your Word Interoperability code.

The application in this particular article is divided into two methods based on the button that is pressed in the form. The first  button opens an existing Word Document and adds a copyright line to the document. The second button creates a new document, and brings up a dialog to allow you to enter a title to the document.

Below is the code for the first button event handler:

private void button1_Click(object sender, System.EventArgs e)
{
// Use the open file dialog to choose a word document
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
// set the file name from the open file dialog
object fileName = openFileDialog1.FileName;
object readOnly = false;
object isVisible = true;
// Here is the way to handle parameters you don't care about in .NET
object missing = System.Reflection.Missing.Value;
// Make word visible, so you can see what's happening
WordApp.Visible = true;
// Open the document that was chosen by the dialog
Word.Document aDoc = WordApp.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible);
// Activate the document so it shows up in front
aDoc.Activate();
// Add the copyright text and a line break
WordApp.Selection.TypeText("Copyright C# Corner");
WordApp.Selection.TypeParagraph();
}
}

The code above opens a document based on the file chosen in the OpenFileDialog. Notice the parameters passed to the Document.Open method are all references. Don't ask me why it was done this way, but it seems like when Microsoft goes through a call with optional parameters, they had no choice but to make everything a variant so on the C# side of  the parameter list  looks like a bunch of references to objects. If you want to skip over a parameter in the call to Open, use the System.Reflection.Missing.Value and assign it to an object. Once you know this trick, the rest of the interoperability used with Word is pretty straightforward.

Below is the code for creating a document from scratch:

private void button2_Click(object sender, System.EventArgs e)
{
// Use the custom dialog to get the title of the document from the user
TitleQuery theQueryDialog = new TitleQuery();
if (theQueryDialog.ShowDialog() == DialogResult.OK)
{
// vba code generated from recorded macro to "remind me" how to do it.
//**********************************************************
// Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
// Selection.Font.Bold = wdToggle
// Selection.TypeText Text:="Creating a Title"
// Documents.Add Template:="C:\My Documents\CSharp Book Project\Normal.dot",
// NewTemplate:=False, DocumentType:=0
// **********************************************************
// Set up all the parameters as generic objects so we can pass them in Documents.Add
object missing = System.Reflection.Missing.Value;
object fileName = "normal.dot"; // template file name
object newTemplate = false;
object docType = 0;
object isVisible = true;
// Create a new Document, by calling the Add function in the Documents collection
Word.Document aDoc = WordApp.Documents.Add(ref fileName, ref newTemplate, ref docType, ref isVisible);
// need to see the created document, so make it visible
WordApp.Visible = true;
aDoc.Activate();
// Global Constant enumerations are members of Word and can be assigned to Properties
// Set alignment to the center of the document
WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
// Toggle the title to a Bold Font
WordApp.Selection.Font.Bold = (int)Word.WdConstants.wdToggle;
// Type the Text of the Title that was inputted by the user in the Custom Dialog
WordApp.Selection.TypeText(theQueryDialog.Title);
}
}

The code above is a little less intuitive, so I used the Macro Recorder in VBA to spit out the VBA code for creating a document. Creating a document is done through the Documents Collection. The Add method of the Documents Collection creates a new document and brings it up in Word. The Add method allows you to specify the template to use and the document type. Note that the Add method also takes optional parameters, so as a result, you need to pass it a series of references to objects that box the types you would normally pass.

The title being placed in the document is formatted using some of the existing Word global enumeration constants. These constants tend to be constants nested in constants for organizational purposes. Although VBA gives you a clue to the relative name of the constants, you need to hunt for them a little bit using intellisense to find the parent enumeration. The code above uses the global enumerations to first center the title and then make it bold. The final line is similar to the previous listing in that it types the title into the Document.

Conclusion

I hope this article gives you a head start in controlling word from .NET and C#. It's a little more cumbersome than VBA but it's much less cumbersome than Visual C++ and MFC. Remember to take advantage of the Microsoft Word Macro Recorder to help you along (this helpful hint also applies to coding in excel and other Microsoft products). Hopefully with a little coding and the power of .NET Rapid Application Development, you can add some very powerful reporting features to your applications that incorporate Microsoft Word.

Login to add your contents and source code to this article
post comment
     

hai it is very usefull to me thanks to you

Posted by murugan ggr Mar 05, 2012

Hi, I am trying to create a word document and read the same to modify the content using c#. When I host the same functionality as a windows service, it throws an error at the Activate() method call. Even I tried to schedule a windows task for the exe, it gives the same error. But if I run the same as an executable it works fine. What could be the problem ?

Posted by Pratik Baser Jan 29, 2011

Hi Mike,All, the above article is nice to refer to..

I am using VS 2005, .NET framework 2.0, MS Word 2007, C# ASP.NET

and added reference using Microsoft Word 12.0 Object Library .


Also i have the correct references/ namespaces used as below,

using
System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;
using System.Data.Sql;
using System.Net.Mail;
using System.Runtime.Remoting;
using System.Reflection;
using System.Reflection.Emit;

using Microsoft.Office;

using Microsoft.Office.Core;

using System.Runtime.InteropServices;

using Outlook = Microsoft.Office.Interop.Outlook;

using Word = Microsoft.Office.Interop.Word;

using System.IO;



Note:
------- 
For testing purposes i put script in the cancel button i guess this should not matter..


Would you know why Word 2007 would not show up using below code?
Actually i can see the winword.exe instance running in task manager, but what i could see
during debug is that  oWord.Visible = true changes/flips back to false, not sure if is this the reason word does
not show up. 

Also the second concern is that the word instance does not get removed from task manager, how to handle this issue ? 

Word document does not open up at on click of button script even if i keep MSWord open. While running below script i do not have MS Word open..

Can you pls. suggest ?

I am using the below code in an .aspx page.

protected void btnCancel_Click(object sender, ImageClickEventArgs e)
        {
            Word._Application oWord = new Word.Application();
           //Word.ApplicationClass oWord = new Word.ApplicationClass();

            //Word.Document oWordDoc = new Word.Document();
           
            object missing = System.Reflection.Missing.Value;
            object fileName = @"C:\Working\3rd partyReimbursement.dot";
            object readOnly = false;
            object isVisible = true;
            oWord.Visible = true;
            Word.Document aDoc = oWord.Documents.Open( ref fileName, ref missing, ref readOnly, ref missing, ref

missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible,ref missing,ref

missing,ref missing,ref missing);
           
            aDoc.Activate();
            oWord.Selection.TypeText("Copyright C# Corner");
            oWord.Selection.TypeParagraph();
}            oWord.Visible = true;




adv. thanks
Manish
manish_kale@hotmail.com

Posted by manish kale Dec 23, 2009

I want to create a Windows form with similar feature. I would like to know how to create like this one. Appreciate if you could let me know. Thanks.

Posted by Chandra Srinivasan Jun 25, 2009

This is quite basic stuff, but I need to create a preview page for a report that will use only one object containing collections of objects underneath. I need to list 4 or 5 small collections in dynamic grids on the word Document. As an example : The main object has 20 accessible properties that I can access and it may have a small collection of cities which I need to list in a grid (the number of rows in each grid on the word document must be different every time depending on the quantity of cities). Is Word the best tool for this kind of dynamic report ? Thank you in advance. Marcel

Posted by Marcel Nollet Mar 30, 2009
COMMENT USING
PREMIUM SPONSORS
Over-C is a holistic consortium of communications and technology specialists. We build, deploy and market both business as well as consumer products and solutions.
SPONSORED BY
  • PDF reports have never been easier to create. With our included WYSIWYG Designer, you can layout your reports, set up your data source and let DynamicPDF ReportWriter do the rest.