Не удается сохранить существующий документ Word - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь сохранить существующий файл docx на рабочем столе после того, как автоматизирую документ Word в C #. Я использую форму окна, чтобы выполнить мое приложение. Я могу сохранить документ, если на рабочем столе нет такого же имени файла. Однако, когда я снова пытаюсь сохранить то же имя файла, он выдаст мне следующее сообщение об ошибке:

Нельзя сохранить, пока файл используется другим процессом. Пытаться Сохранение файла с новым именем. (C: ... \ Desktop \ TempWord.docx)

Я прочитал его на веб-сайте Microsoft Я могу использовать SaveAs, если имя файла уже существует, оно автоматически переопределит его.

Я не слишком уверен, почему появляется такое сообщение, потому что я вообще не открывал никаких других документов Word, когда эта программа запущена.

Я не слишком уверен, как решить эту проблему. Может я сделал что-то очень глупое, чего не увидел :(


Это мой код:

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();


        }
    }
}

Я не слишком уверен, где я сделал это неправильно.

Редактировать: я вставил оригинальный код.

1 Ответ

1 голос
/ 10 февраля 2012

Я сделал метод из этого, поэтому поместите эту строку кода, избавьтесь от нее в кнопке создания и скопируйте новый метод ниже, чтобы ваш новый код выглядел так

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);
}
...