C# EXCEL 互操作问题。清理不起作用
C# EXCEL Interop Issues. Cleanup doesn't work
我在堆栈和其他网站上阅读了很多不同的线程和文章,但是在我完成我的应用程序后,我在清理 EXCEL Interop COM 进程时仍然遇到一些问题。
我自己创建了一些 class,它允许我加载工作 sheet、修改单元格、重命名工作 sheet 以及格式化不同的单元格。
这是我使用的变量和构造函数。
Excel.Application _excelApp = null;
Excel.Workbook _excelBook = null;
Excel.Worksheet _excelSheet = null;
Excel.Range _excelRange = null;
当我创建 class 对象时,构造函数会这样做:
FileName = excelFileName; // Just used to reference a creation name
_excelApp = new Excel.Application();
现在,我接下来要做的是加载 sheet 进行修改:
public bool LoadExcelSheet(string location, string file)
{
string startupPath = Environment.CurrentDirectory; // Get the path where the software is held
_excelBook = _excelApp.Workbooks.Open(Path.Combine(startupPath, location, file)); // Load in the workbook
_excelSheet = _excelBook.Worksheets[1]; // sets the excel sheet to the init worksheet
sheetName = _excelSheet.Name; // set the sheetname variable
isSheetLoaded = CheckIfWorkBookExists(); // a little check to see if the workbook exists - yes shows it has been loaded, if a no then it hasn't
return isSheetLoaded;
}
我在我的软件中做的下一件事是 运行 通过允许我设置任何单元格(通过定义行和列的 int ID)并使用给定字符串修改它的函数:
public void ModifyCell(int row, int column, string data)
{
int[] cellRange = new int[2] { row, column };
_excelRange = _excelSheet.Cells;
_excelRange.set_Item(row, column, data);
dataFormat.Add(cellRange); // this adds each row and column into a list which holds every modified cell for easy formatting
Marshal.ReleaseComObject(_excelRange); // Releases the COM object
}
因此,当我完成 excel 操作后,我将调用我的清理函数:
public void Cleanup()
{
if (_excelApp != null) // if a cleanup hasn't been initiated
{
// set all the com objects to null, this is so the GC can clean them up
_excelRange = null;
_excelSheet = null;
_excelBook = null;
_excelApp = null;
}
// These garbage collectors will free any unused memory - more specifically the EXCEL.EXE*32 process that LOVES to stay, forever and ever. Like a mother inlaw...
GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);
}
}
我 运行 当我完成修改 excel sheet 时进行清理,并且当我关闭程序只是为了仔细检查所有内容是否已清理。不过,那个该死的 EXCEL.EXE*32
还在那里!
使用 Excel(实际上是任何 Office 应用程序)互操作,您在管理资源时必须非常勤奋。您应该始终尽可能短地使用资源,并在不再需要它们时立即释放它们。您还应该明确释放所有对象以确保它们被正确清理。
这是我的一个更详细的旧答案:COM object excel interop clean up
如果您按照答案中列出的步骤操作,就不会有 Excel 个体游离。
我在堆栈和其他网站上阅读了很多不同的线程和文章,但是在我完成我的应用程序后,我在清理 EXCEL Interop COM 进程时仍然遇到一些问题。
我自己创建了一些 class,它允许我加载工作 sheet、修改单元格、重命名工作 sheet 以及格式化不同的单元格。
这是我使用的变量和构造函数。
Excel.Application _excelApp = null;
Excel.Workbook _excelBook = null;
Excel.Worksheet _excelSheet = null;
Excel.Range _excelRange = null;
当我创建 class 对象时,构造函数会这样做:
FileName = excelFileName; // Just used to reference a creation name
_excelApp = new Excel.Application();
现在,我接下来要做的是加载 sheet 进行修改:
public bool LoadExcelSheet(string location, string file)
{
string startupPath = Environment.CurrentDirectory; // Get the path where the software is held
_excelBook = _excelApp.Workbooks.Open(Path.Combine(startupPath, location, file)); // Load in the workbook
_excelSheet = _excelBook.Worksheets[1]; // sets the excel sheet to the init worksheet
sheetName = _excelSheet.Name; // set the sheetname variable
isSheetLoaded = CheckIfWorkBookExists(); // a little check to see if the workbook exists - yes shows it has been loaded, if a no then it hasn't
return isSheetLoaded;
}
我在我的软件中做的下一件事是 运行 通过允许我设置任何单元格(通过定义行和列的 int ID)并使用给定字符串修改它的函数:
public void ModifyCell(int row, int column, string data)
{
int[] cellRange = new int[2] { row, column };
_excelRange = _excelSheet.Cells;
_excelRange.set_Item(row, column, data);
dataFormat.Add(cellRange); // this adds each row and column into a list which holds every modified cell for easy formatting
Marshal.ReleaseComObject(_excelRange); // Releases the COM object
}
因此,当我完成 excel 操作后,我将调用我的清理函数:
public void Cleanup()
{
if (_excelApp != null) // if a cleanup hasn't been initiated
{
// set all the com objects to null, this is so the GC can clean them up
_excelRange = null;
_excelSheet = null;
_excelBook = null;
_excelApp = null;
}
// These garbage collectors will free any unused memory - more specifically the EXCEL.EXE*32 process that LOVES to stay, forever and ever. Like a mother inlaw...
GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);
}
}
我 运行 当我完成修改 excel sheet 时进行清理,并且当我关闭程序只是为了仔细检查所有内容是否已清理。不过,那个该死的 EXCEL.EXE*32
还在那里!
使用 Excel(实际上是任何 Office 应用程序)互操作,您在管理资源时必须非常勤奋。您应该始终尽可能短地使用资源,并在不再需要它们时立即释放它们。您还应该明确释放所有对象以确保它们被正确清理。
这是我的一个更详细的旧答案:COM object excel interop clean up
如果您按照答案中列出的步骤操作,就不会有 Excel 个体游离。