.NET中调用Excel将数据写入到Excel文件中,程序结束后,系统中会残留一个Excel进程没有退出。
查资料后,解决的方法是调用System.Runtime.InteropServices.Marshal.ReleaseComObject方法,然后将引用的对象赋值为null。
参照下面:
经过实验,上面文章的说法是有一定效果的,文中的重点就是要使用对象类型进行操作,并且为每个要引用的对象创建变量,而且一定要在使用后释放。
查资料后,解决的方法是调用System.Runtime.InteropServices.Marshal.ReleaseComObject方法,然后将引用的对象赋值为null。
参照下面:
public
static
void
CleanComObject(
ref
Excel.Range range)
... {
//オブジェクトをリリースする
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);
}
... {
//オブジェクトをリリースする
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);
}
经过实验,上面文章的说法是有一定效果的,文中的重点就是要使用对象类型进行操作,并且为每个要引用的对象创建变量,而且一定要在使用后释放。