Question

I'm trying to save an existing docx file on the desktop after I automate the word document in C#. I'm using the window form to execute my application. I'm able to save the document when there's no same file name exists on the desktop. However when I try to save the same file name again it will give me this error message:

You cannot save while the file is in use by another process. Try saving the file with a new name. (C:...\Desktop\TempWord.docx)

I read it in the Microsoft website I'm able to use SaveAs if there's an existing file name, it will automatically override it.

I'm not too sure why this kind of message appears because I did not open any other word document at all when this program is being run.

I'm not too sure how to resolve this problem. Maybe I did something very stupid that I did not see :(


This is my code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection; 
using Microsoft.Office;
using Word = Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;


namespace TestWordAutoWithTemplate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void butGenerate_Click(object sender, EventArgs e)
        {


            //OBJECT OF MISSING "NULL VALUE"
            Object oMissing = Missing.Value;

            //OBJECTS OF FALSE AND TRUE
            Object oTrue = true;
            Object oFalse = false;

            //CREATING OBJECTS OF WORD AND DOCUMENT
            Word.Application oWord = new Word.Application();
            Word.Document oWordDoc = new Word.Document();

            //SETTING THE VISIBILITY TO TRUE
            //oWord.Visible = true;

            //THE LOCATION OF THE TEMPLATE FILE ON THE MACHINE
            Object oTemplatePath = @"C:\Documents and Settings\YYC\Desktop\TestTemplate.dotx";

            //ADDING A NEW DOCUMENT FROM A TEMPLATE
            oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
            int iTotalFields = 0; 

            foreach (Word.Field myMergeField in oWordDoc.Fields)
            {
                iTotalFields++;
                Word.Range rngFieldCode = myMergeField.Code;
                String fieldText = rngFieldCode.Text;

                // ONLY GETTING THE MAILMERGE FIELDS
                if (fieldText.StartsWith(" MERGEFIELD"))
                {
                    // THE TEXT COMES IN THE FORMAT OF
                    // MERGEFIELD  MyFieldName  \\* MERGEFORMAT
                    // THIS HAS TO BE EDITED TO GET ONLY THE FIELDNAME "MyFieldName"
                    Int32 endMerge = fieldText.IndexOf("\\");
                    Int32 fieldNameLength = fieldText.Length - endMerge;
                    String fieldName = fieldText.Substring(11, endMerge - 11);

                    // GIVES THE FIELDNAMES AS THE USER HAD ENTERED IN .dot FILE
                    fieldName = fieldName.Trim();

                    // **** FIELD REPLACEMENT IMPLEMENTATION GOES HERE ****//
                    // THE PROGRAMMER CAN HAVE HIS OWN IMPLEMENTATIONS HERE
                    if (fieldName == "Name")
                    {
                        myMergeField.Select();
                        //Check whether the control text is empty
                        if (txtName.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtName.Text); 
                        }
                    }
                    if (fieldName == "Address")
                    {
                        myMergeField.Select();
                        //Check whether the control text is empty
                        if (txtAddress.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtAddress.Text);
                        }
                    }

                    if (fieldName == "Age")
                    {
                        myMergeField.Select();
                        // check whether the control text is empty
                        if (txtAge.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtAge.Text); 
                        }
                    }

                    if (fieldName == "EAddress")
                    {
                        myMergeField.Select();
                        // check whether the control text is empty
                        if (txtEmail.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtEmail.Text);
                        }
                    }

                    if (fieldName == "Company")
                    {
                        myMergeField.Select();
                        // Check whether the control text is empty
                        if (txtCompany.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtCompany.Text);
                        }
                    }

                    if (fieldName == "TelNo")
                    {
                        myMergeField.Select();
                        // Check whether the control text is empty
                        if (txtTelephone.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtCompany.Text);
                        }
                    }

                    if (fieldName == "ODetails")
                    {
                        myMergeField.Select();
                        // Check whether the control text is empty
                        if (txtOther.Text == "")
                        {
                            oWord.Selection.TypeText(" ");
                        }
                        else
                        {
                            oWord.Selection.TypeText(txtOther.Text);
                        }
                    }

                }
            }

            oWord.Visible = false;

            //Marshal.ReleaseComObject(oWordDoc.Fields);
            //Marshal.ReleaseComObject(oWordDoc);
            //Marshal.;


            // If you want your document to be saved as docx
            Object savePath = @"C:\Documents and Settings\YYC\Desktop\TempWord.doc";
            //oWordDoc.Save();
            oWordDoc.SaveAs(ref savePath
                //, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing, 
                //ref oMissing
               );



            // Close the Word document, but leave the Word application open.
            // doc has to be cast to type _Document so that it will find the 
            // correct Close method. 
            object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
            ((Word._Document)oWordDoc).Close(ref doNotSaveChanges, ref oMissing, ref oMissing);
            oWordDoc = null; 
            // word has to be case to type _Application so that it will find 
            // the correct Quit method. 
            ((Word._Application)oWord).Quit(ref doNotSaveChanges, ref oMissing, ref oMissing);
            oWord = null;
            GC.Collect();


        }
    }
}

I'm not too sure where I did it wrong.

Edit: I put the original code in.

Was it helpful?

Solution

I made a method out of this so place this line of Code get rid of it in button generate and copy the new method below so your new code should look like this

private void butGenerate_Click(object sender, EventArgs e)
{
   SaveWordTemp2WordDoc();      
}

public void SaveWordTemp2WordDoc()
{
    //OBJECT OF MISSING "NULL VALUE"
    object oMissing = System.Reflection.Missing.Value;
    //OBJECTS OF FALSE AND TRUE
    Object oTrue = true;
    Object oFalse = false;

    //CREATING OBJECTS OF WORD AND DOCUMENT
    Word.Application oWord = new Word.Application();
    Word.Document oWordDoc = new Word.Document();

    //SETTING THE VISIBILITY TO TRUE
    //oWord.Visible = true;

    //THE LOCATION OF THE TEMPLATE FILE ON THE MACHINE
    //Change the path to a path like c:\files\docTemps\
    Object oTemplatePath = @"C:\Documents and Settings\YYC\Desktop\TestTemplate.dotx";

    //ADDING A NEW DOCUMENT FROM A TEMPLATE
    oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
    int iTotalFields = 0;

    foreach (Word.Field myMergeField in oWordDoc.Fields)
    {
        iTotalFields++;
        Word.Range rngFieldCode = myMergeField.Code;
        String fieldText = rngFieldCode.Text;

        // ONLY GETTING THE MAILMERGE FIELDS
        if (fieldText.StartsWith(" MERGEFIELD"))
        {
            // THE TEXT COMES IN THE FORMAT OF
            // MERGEFIELD  MyFieldName  \\* MERGEFORMAT
            // THIS HAS TO BE EDITED TO GET ONLY THE FIELDNAME "MyFieldName"
            Int32 endMerge = fieldText.IndexOf("\\");
            Int32 fieldNameLength = fieldText.Length - endMerge;
            String fieldName = fieldText.Substring(11, endMerge - 11);

            // GIVES THE FIELDNAMES AS THE USER HAD ENTERED IN .dot FILE
            fieldName = fieldName.Trim();

            // **** FIELD REPLACEMENT IMPLEMENTATION GOES HERE ****//
            // THE PROGRAMMER CAN HAVE HIS OWN IMPLEMENTATIONS HERE
            if (fieldName == "Name")
            {
                myMergeField.Select();
                //Check whether the control text is empty
                if (txtName.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtName.Text);
                }
            }
            if (fieldName == "Address")
            {
                myMergeField.Select();
                //Check whether the control text is empty
                if (txtAddress.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtAddress.Text);
                }
            }

            if (fieldName == "Age")
            {
                myMergeField.Select();
                // check whether the control text is empty
                if (txtAge.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtAge.Text);
                }
            }

            if (fieldName == "EAddress")
            {
                myMergeField.Select();
                // check whether the control text is empty
                if (txtEmail.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtEmail.Text);
                }
            }

            if (fieldName == "Company")
            {
                myMergeField.Select();
                // Check whether the control text is empty
                if (txtCompany.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtCompany.Text);
                }
            }

            if (fieldName == "TelNo")
            {
                myMergeField.Select();
                // Check whether the control text is empty
                if (txtTelephone.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtCompany.Text);
                }
            }

            if (fieldName == "ODetails")
            {
                myMergeField.Select();
                // Check whether the control text is empty
                if (txtOther.Text == "")
                {
                    oWord.Selection.TypeText(" ");
                }
                else
                {
                    oWord.Selection.TypeText(txtOther.Text);
                }
            }

        }
    }

    oWord.Visible = false;

    // If you want your document to be saved as docx
    //Change the file Path here to a path other than your desktop
    Object savePath = @"C:\Documents and Settings\YYC\Desktop\TempWord.doc";
    //oWordDoc.Save();
    oWordDoc.SaveAs(ref savePath,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing,
        ref oMissing
       );

    // Close the Word document, but leave the Word application open.
    // doc has to be cast to type _Document so that it will find the 
    // correct Close method. 
    object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordDoc);
    // word has to be case to type _Application so that it will find 
    // the correct Quit method. 
    ((Word._Application)oWord).Quit(ref doNotSaveChanges, ref oMissing, ref oMissing);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top