相关疑难解决方法(0)

如何正确清理Excel互操作对象?

我在C#(ApplicationClass)中使用Excel互操作,并在我的finally子句中放置了以下代码:

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

虽然这种工作,Excel.exe即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.

我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?

c# excel interop com-interop

733
推荐指数
20
解决办法
30万
查看次数

用于学习c#Excel互操作的资源

有哪些资源可以帮助我在C#中使用Excel互操作快速启动并运行?

c# excel resources interop

24
推荐指数
3
解决办法
1万
查看次数

为什么Microsoft.Office.Interop.Excel.Application.Quit()会让后台进程运行?

以下代码将运行Microsoft Excel后台进程,直到我的程序退出为止:

var excelApplication = new Application();
var workbooks = excelApplication.Workbooks;
var workbook = excelApplication.Workbooks.Open(file.FullName);

workbook.Close();
excelApplication.Workbooks.Close();
excelApplication.Quit();

Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApplication);
Run Code Online (Sandbox Code Playgroud)

为什么?我错过了什么?

c# excel office-interop excel-interop

14
推荐指数
3
解决办法
2万
查看次数

C#和Excel互操作

我的一个用户在尝试通过我的C#应用​​程序打开Excel文件时遇到问题.

当我从我的机器运行它时,一切正常,它适用于其他用户.我不是Excel互操作专家所以希望你们可以帮助我.

以下是它的设置方式:

我将我的应用程序的引用添加到Microsoft.Office.Interop.Excel.dll,版本10.0.4504.0(我相信是Excel 2002).在我的机器上,我安装了Excel 2007.在我的代码中,我尝试打开这样的工作表:

using Microsoft.Office.Interop
...
Microsoft.Office.Interop.Excel.ApplicationClass _excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook excelWorkbook = _excelApp.Workbooks.Open(workbookPath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", false, false, 0, true, false, false);
Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets;
Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(1);
Run Code Online (Sandbox Code Playgroud)

我将用户版本记录为Excel 9.0(即2000).用户获得的错误是:

Exception='System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object …
Run Code Online (Sandbox Code Playgroud)

c# excel interop

10
推荐指数
1
解决办法
2万
查看次数

.NET和COM互操作性:从.NET客户端发布COM

假设我有一个COM对象(非托管)和.NET客户端.

是否需要从.NET客户端Marshal.FinalReleaseComObject方法调用才能释放COM对象?

.net com com-interop

7
推荐指数
1
解决办法
845
查看次数

Excel进程仍在后台运行

我正在使用互操作库从一张excel文件中读取一些数据.我通过使用Microsoft.Office.Interop.Excel然后读取工作表中的所有数据来获得数据.

Application ExcelApp = new Excel.Application();
Workbook excelWorkbook = ExcelApp2.Workbooks.Open(excelFileNamePath);
_Worksheet excelWorksheet = excelWorkbook.Sheets[excelSheetName];
Range excelRange = excelWorksheet.UsedRange;
//...for loops for reading data
ExcelApp.Quit();
Run Code Online (Sandbox Code Playgroud)

但是在我的应用程序终止后,我尝试编辑我的excel文件,并在打开时遇到一些问题.显然,即使我打电话,excel进程仍在后台运行ExcelApp.Quit().有没有办法正确关闭应用程序使用的excel文件?我是c#的新手,所以我可能在这里遗漏了一些东西.

编辑:解决了!显然,com对象的规则不鼓励使用2个点.

Excel.Application ExcelApp2 = new Excel.Application();
Excel.Workbooks excelWorkbooks = ExcelApp2.Workbooks;
Excel.Workbook excelWorkbook = excelWorkbooks.Open(excelFileName);
Excel._Worksheet excelWorksheet = excelWorkbook.Sheets[excelSheetName];
//...
excelWorkbook.Close();       
Marshal.ReleaseComObject(excelWorkbook);
Marshal.ReleaseComObject(excelWorksheet);
Marshal.ReleaseComObject(excelRange);
ExcelApp2.Quit();
Run Code Online (Sandbox Code Playgroud)

.net c# excel

5
推荐指数
1
解决办法
9117
查看次数