我在C#中自动化word文档后,我正试图在桌面上保存现有的docx文件。我正在使用窗体来执行我的应用程序。当桌面上没有相同的文件名时,我可以保存文档。但是,当我尝试再次保存相同的文件名时,它会给我这个错误消息:
当文件被其他进程使用时,您无法保存。尝试 使用新名称保存文件。 (C:... \桌面\ TempWord.docx)
我在Microsoft website中读到它,如果有现有文件名,我可以使用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();
}
}
}
我不太确定我错在哪里。
编辑:我将原始代码放入。
答案 0 :(得分:1)
我做了一个方法,所以把这行代码放在按钮生成中并复制下面的新方法,这样你的新代码应该是这样的
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);
}