我有这样的课程:
public class WordInteropFileCreator
{
public void CreateWordDocument(object fileName, object saveAs, string clientFullName, ClientAdressInfo clientAdressInfo)
{
//Set Missing Value parameter - used to represent
// a missing value when calling methods through
// interop.
object missing = System.Reflection.Missing.Value;
//Setup the Word.Application class.
Word.Application wordApp = new Word.ApplicationClass();
//Setup our Word.Document class we'll use.
Word.Document aDoc = null;
// Check to see that file exists
if (File.Exists((string)fileName))
{
DateTime today = DateTime.Now;
object readOnly = false;
object isVisible = false;
//Set Word to be not visible.
wordApp.Visible = false;
//Open the word document
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);
// Activate the document
aDoc.Activate();
// Find Place Holders and Replace them with Values.
this.FindAndReplace(wordApp, "<name>", clientFullName);
this.FindAndReplace(wordApp, "<address>", clientAdressInfo.GetStreetWithNumber());
this.FindAndReplace(wordApp, "<city>", clientAdressInfo.GetCityWithPostalCode());
this.FindAndReplace(wordApp, "<country>",clientAdressInfo.CountryCode != null && clientAdressInfo.CountryCode.ToUpper() == "PL" ? " " : clientAdressInfo.CountryName);
}
else
{
throw new Exception("File dose not exist " + fileName);
}
//object outputFileName = fileName.Replace(".doc", ".pdf");
object fileFormat = Word.WdSaveFormat.wdFormatPDF;
//Save the document as the correct file name.
aDoc.SaveAs(ref saveAs, ref fileFormat, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing);
object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
//Close the document - you have to do this.
aDoc.Close(ref saveChanges, ref missing, ref missing);
}
/// <summary>
/// This is simply a helper method to find/replace
/// text.
/// </summary>
/// <param name="WordApp">Word Application to use</param>
/// <param name="findText">Text to find</param>
/// <param name="replaceWithText">Replacement text</param>
private void FindAndReplace(Word.Application WordApp,
object findText,
object replaceWithText)
{
object matchCase = true;
object matchWholeWord = true;
object matchWildCards = false;
object matchSoundsLike = false;
object nmatchAllWordForms = 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 nmatchAllWordForms, ref forward,
ref wrap, ref format, ref replaceWithText,
ref replace, ref matchKashida,
ref matchDiacritics, ref matchAlefHamza,
ref matchControl);
}
}
我正在使用它:
string firstPart = Path.Combine(reportPathDir, "first.pdf");
string letterPath = Path.Combine(reportPathDir, repType);
var creator = new WordInteropFileCreator();
creator.CreateWordDocument(letterPath, firstPart, logicResult.SpecifcationClients[0].FullName, logicResult.ClientAdressInfo);
var fs = new FileStream(secondPart, FileMode.OpenOrCreate);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
fs.Dispose();
当我用这段代码在午餐时,我有很多内存泄漏。有什么建议吗? var creator = new WordInteropFileCreator()没有dispose方法。
答案 0 :(得分:1)
类似于现有答案,但可以完善您的方法。应该在文档关闭后立即退出。
退出Word应用程序的方法:
wordApp.Quit();
您应该在输入代码后退出Word Application
:
public void CreateWordDocument(object fileName, object saveAs, string clientFullName, ClientAdressInfo clientAdressInfo)
{
//Set Missing Value parameter - used to represent
// a missing value when calling methods through
// interop.
object missing = System.Reflection.Missing.Value;
//Setup the Word.Application class.
Word.Application wordApp = new Word.ApplicationClass();
//Setup our Word.Document class we'll use.
Word.Document aDoc = null;
// Check to see that file exists
if (File.Exists((string)fileName))
{
DateTime today = DateTime.Now;
object readOnly = false;
object isVisible = false;
//Set Word to be not visible.
wordApp.Visible = false;
//Open the word document
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);
// Activate the document
aDoc.Activate();
// Find Place Holders and Replace them with Values.
this.FindAndReplace(wordApp, "<name>", clientFullName);
this.FindAndReplace(wordApp, "<address>", clientAdressInfo.GetStreetWithNumber());
this.FindAndReplace(wordApp, "<city>", clientAdressInfo.GetCityWithPostalCode());
this.FindAndReplace(wordApp, "<country>",clientAdressInfo.CountryCode != null && clientAdressInfo.CountryCode.ToUpper() == "PL" ? " " : clientAdressInfo.CountryName);
}
else
{
throw new Exception("File dose not exist " + fileName);
}
//object outputFileName = fileName.Replace(".doc", ".pdf");
object fileFormat = Word.WdSaveFormat.wdFormatPDF;
//Save the document as the correct file name.
aDoc.SaveAs(ref saveAs, ref fileFormat, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing);
object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
//Close the document - you have to do this.
aDoc.Close(ref saveChanges, ref missing, ref missing);
wordApp.Quit();
}
答案 1 :(得分:0)
您没有关闭Word,因此它将继续在后台运行:在处理结束时调用它。
wordApp.Quit(ref nullObj, ref nullObj, ref nullObj);