查資料後,解決的方法是調用System.Runtime.InteropServices.Marshal.ReleaseComObject方法,然後將引用的對象賦值爲null。
參照下面:
{
//オブジェクトをリリースする
if (range != null)
{
Marshal.ReleaseComObject(range);
range = null;
}
}
public static void CleanComObject(ref Excel.Shape shape)
{
//オブジェクトをリリースする
if (shape != null)
{
Marshal.ReleaseComObject(shape);
shape = null;
}
}
public static void SaveWorkbook(Excel.Workbook workbook, string fileName)
{
#if DEBUG
if ((workbook == null)
|| IsValidString(fileName) == false)
{
throw new ArgumentException();
}
#endif
//Workbookのカーソルを一頁の左上に設定する
Excel.Worksheet worksheet = null;
Excel.Range range = null;
for (int i = workbook.Sheets.Count; i > 0; i--)
{
worksheet = GetIndexWorksheet(workbook, i);
//worksheet.Activate();
((Excel._Worksheet)worksheet).Activate();
Excel.PageSetup pageSetup = worksheet.PageSetup;
pageSetup.PrintArea = string.Empty;
CleanComObject(ref pageSetup);
Excel.Range start = GetRange(worksheet, 1, 1);
Excel.Range end = GetRange(worksheet, 1, 1);
range = worksheet.get_Range(start, end);
range.Select();
CleanComObject(ref start);
CleanComObject(ref end);
CleanComObject(ref range);
CleanComObject(ref worksheet);
}
//ファイルをクローズしますのメッセージを出力します。
workbook.SaveAs((object)fileName,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Excel.XlSaveAsAccessMode.xlNoChange,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value);
CleanComObject(ref worksheet);
}
經過實驗,上面文章的說法是有一定效果的,文中的重點就是要使用對象類型進行操作,並且爲每個要引用的對象創建變量,而且一定要在使用後釋放。