Я пытаюсь сохранить существующий файл 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();
}
}
}
Я не слишком уверен, где я сделал это неправильно.
Редактировать: я вставил оригинальный код.