问题描述
我想编写一个类,该类具有几种操作Excel文件的方法。我不知道在类构造函数中打开Excel文件(Workbook
并在类析构函数中释放所有内容(通过垃圾回收器)是否是个好主意。
using Excel = Microsoft.Office.Interop.Excel;
public class ExcelConnector
{
private string _path = @"....xlsm";
private readonly Excel.Application _xlApp;
private readonly Excel.Workbook _xlWorkbook;
private Excel.Workbook _xlWorksheet;
public ExcelConnector()
{
_xlApp = new Excel.Application
{
displayAlerts = false,Visible = false
};
try
{
_xlWorkbook = _xlApp.Workbooks.Open(_path);
}
catch (Exception ex)
{
throw new Exception("Unable to open the Excel file!",ex);
}
}
~ExcelConnector()
{
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(_xlWorksheet);
_xlWorkbook.Close();
Marshal.ReleaseComObject(_xlWorkbook);
_xlApp.Quit();
Marshal.ReleaseComObject(_xlApp);
}
public void Process()
{
// Here all "Dynamic View" members of the _xlWorkbook (idem for _xlApp) have the
// "The RPC server is unavailable. (Exception from HRESULT: 0x########)" value
_xlWorksheet = _xlWorkbook.GetWorksheetByName("...");
//...
}
}
有人知道如何解决 RPC服务器不可用。问题?
如果我将所有填充物移至Process
方法内(几乎总是),但是我有不同的方法,并且希望保持Excel文件打开(打开它需要几秒钟/分钟)。我使用Excel 2016 64位。
感谢您的见解!
更新
好吧,我忘记了从调用Process
的方法中重新删除以下方法,其中excel
是ExcelConnector
的实例。
// Makes sure that there is not existing instances from prevIoUs instances
excel.KillExisitingInstances();
我添加了此方法,以在崩溃时杀死所有Excel实例。有点粗鲁,但有帮助...
foreach (var process in Process.GetProcessesByName("EXCEL"))
{
process.Kill();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)