Introduction
I faced this problem when I was developing a small tool to write official letters. My requirements were, letter template & content can be changed any time and application will help to get only inputs like, sent to name, organization name, date, etc. and after that when user presses finish button, the letter should be ready for print out along with predefined content & inputs.
Background
To solve this, I used Microsoft VS 2005 with C# 2.0.
Here are the steps I followed:
Add Microsoft.Office.Interop.Word
reference to the project from COM Component as follows:
This will automatically add VBIDE, Microsoft.Office.Core
along with Microsoft.Office.Interop.Word
as references.
Now create a Microsoft Word document with the fields <Name>
, <Date>
, <Subject>
and letter body. Then place all 3 variables (I called these variables because these will be changed automatically based on user input) where they belong. I did the following:
Now design your form in VS IDE. I did it like this:
Using the Code
- Now let's do some coding…..ya….. so here is my sample coding.
using Word = Microsoft.Office.Interop.Word;
- Code behind the button:
private void btnlettergen_Click(object sender, EventArgs e)
{
try
{
killprocess("winword");
File.Copy("C:\\OfferLetter.doc", "c:\\temp.doc", true);
object missing = Missing.Value;
Word.Application wordApp = new Word.ApplicationClass();
Word.Document aDoc = null;
object filename = "c:\\temp.doc";
if (File.Exists((string)filename))
{
object readOnly = false;
object isVisible = false;
wordApp.Visible = false;
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, ref missing, ref missing,
ref missing, ref missing);
aDoc.Activate();
this.FindAndReplace(wordApp, "<Date>", dtpDate.Text);
this.FindAndReplace(wordApp, "<Name>", txName.Text.Trim());
this.FindAndReplace(wordApp, "<Subject>",
txtSubject.Text.Trim());
aDoc.Save();
}
else
MessageBox.Show("File does not exist.",
"No File", MessageBoxButtons.OK,
MessageBoxIcon.Information);
killprocess("winword");
}
catch (Exception)
{
MessageBox.Show("Error in process.", "Internal Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
- Create
FindAndReplace()
:
private void FindAndReplace(Word.Application wordApp,
object findText, object replaceText)
{
object matchCase = true;
object matchWholeWord = true;
object matchWildCards = false;
object matchSoundsLike = false;
object matchAllWordForms = false;
object forward = true;
object format = false;
object matchKashida = false;
object matchDiacritics = false;
object matchAlefHamza = false;
object matchControl = false;
object read_only = false;
object visible = true;
object replace = 2;
object wrap = 1;
wordApp.Selection.Find.Execute(ref findText, ref matchCase,
ref matchWholeWord, ref matchWildCards, ref matchSoundsLike,
ref matchAllWordForms, ref forward, ref wrap, ref format,
ref replaceText, ref replace, ref matchKashida,
ref matchDiacritics,
ref matchAlefHamza, ref matchControl);
}
Now check out your temp.doc file in C:\, all variables defined under ‘<>
’ are replaced with the input values. How's that!
So, enjoy your coding….. happy coding!
History
- 14th May, 2009: Initial post