我在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模板文件.我想当用户关闭应用程序时,excel应用程序进程已关闭,而不保存excel文件.多次运行应用程序后,请参阅我的任务管理器.

我使用此代码打开excel文件:
public Excel.Application excelApp = new Excel.Application();
public Excel.Workbook excelBook;
excelBook = excelApp.Workbooks.Add(@"C:/pape.xltx");
Run Code Online (Sandbox Code Playgroud)
对于数据访问,我使用以下代码:
Excel.Worksheet excelSheet = (Worksheet)(excelBook.Worksheets[1]);
excelSheet.DisplayRightToLeft = true;
Range rng;
rng = excelSheet.get_Range("C2");
rng.Value2 = txtName.Text;
Run Code Online (Sandbox Code Playgroud)
在我的公司中,发布Excel Interop Objects的常用方法是使用IDisposable,方法如下:
Public Sub Dispose() Implements IDisposable.Dispose
If Not bolDisposed Then
Finalize()
System.GC.SuppressFinalize(Me)
End If
End Sub
Protected Overrides Sub Finalize()
_xlApp = Nothing
bolDisposed = True
MyBase.Finalize()
End Sub
Run Code Online (Sandbox Code Playgroud)
在IDisposable构造函数中以下列方式创建的位置:
Try
_xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
Catch e As Exception
_xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
End Try
Run Code Online (Sandbox Code Playgroud)
并且客户端使用_xlApp执行有关excel互操作对象的代码.
我们完全避免使用双点规则.现在我开始研究如何重新发布(Excel)互操作对象以及我发现的几乎所有关于它的讨论如何正确清理excel互操作对象或释放Excel对象主要使用Marshal.ReleaseComObject(),它们都没有使用IDisposable接口.
我的问题是:使用IDisposable Interace释放excel互操作对象有什么缺点吗?如果是这样,这些不利因素是什么.
我有一个处理excel的应用程序.最近我遇到了Excel对象创建速度非常慢的问题.
我用这个简单的代码重新创建了这个问题:
Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application();
Run Code Online (Sandbox Code Playgroud)
第二行导致延迟.
为了测量新对象分配所需的时间,上面的代码已经扩展了时间跟踪解决方案,结果是确凿的.在NORMAL情况下,上面的代码在0.5秒内执行,而在FAULTY-BEHAVIOR的情况下,它可能需要长达5分钟.
没有内存泄漏,并且正确释放了excel对象.我的解决方案全年24/7运行,没有任何问题.我不确定它是否重要但是应用程序在20个单独的用户会话(服务器机器)上运行.因此,此应用程序有20个副本同时运行,可能会导致同时运行20个Excel副本.
这个问题第一次在2个月前被注意到,并且已通过升级办公室(2010年 - > 2013年)得到解决.这次我有更多时间进行调查,遗憾的是结果并不乐观.
事实:
主要问题:
外部内容
编辑 - 附加测试
PowerPoint构造函数不受延迟的影响
ppApp = new Microsoft.Office.Interop.PowerPoint.Application();
Run Code Online (Sandbox Code Playgroud) 我正在使用互操作库从一张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) 我已经在这个问题上苦苦挣扎了几天,我已经进行了研究并应用了我在各种论坛上发现的所有建议,但我仍然无法解决它.
我的问题是excel使用互操作库,我有一个excel文件用作模板,所以我打开它并保存在一个新名称的新位置.一切都很好,除了Excel进程在创建和关闭文件后继续运行.
这是我的代码
protected string CreateExcel(string strProjectID, string strFileMapPath)
{
string strCurrentDir = HttpContext.Current.Server.MapPath("~/Reports/Templates/");
string strFile = "Not_Created";
Application oXL;
Workbook oWB;
oXL = new Application();
oXL.Visible = false;
Workbooks wbks = oXL.Workbooks;
//opening template file
oWB = wbks.Open(strFileMapPath);
oXL.Visible = false;
oXL.UserControl = false;
strFile = strProjectID + "_" + DateTime.Now.Ticks.ToString() + ".xlsx";
//Saving file with new name
oWB.SaveAs(strCurrentDir + strFile, XlFileFormat.xlWorkbookDefault, null, null, false, false, XlSaveAsAccessMode.xlExclusive, false, false, null, null);
oWB.Close(false, strCurrentDir + strFile, Type.Missing);
wbks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Powershell将完整的CSV导出到Excel.我坚持使用静态列名称.但是,如果我的CSV具有通用的未知标头名称,则此功能无效.
打开PowerShell ISE并复制并粘贴以下独立代码.使用"C:\ Windows\system32\WindowsPowerShell\v1.0\powershell_ise.exe"运行它F5
Get-Process | Export-Csv -Path $env:temp\process.csv -NoTypeInformation
$processes = Import-Csv -Path $env:temp\process.csv
$Excel = New-Object -ComObject excel.application
$workbook = $Excel.workbooks.add()
$i = 1
foreach($process in $processes)
{
$excel.cells.item($i,1) = $process.name
$excel.cells.item($i,2) = $process.vm
$i++
}
Remove-Item $env:temp\process.csv
$Excel.visible = $true
Run Code Online (Sandbox Code Playgroud)
$processes变量下name和vm列中的所有值写入Excelname和vm).如何解决我不知道其标题名称的值?Import-Csv)我只想用Powershell将整个CSV写入Excel
excel ×6
c# ×5
.net ×2
com-interop ×2
interop ×2
asp.net ×1
kill-process ×1
office-2013 ×1
powershell ×1
vb.net ×1
windows-7 ×1