Office 2016 的 Excel 互操作应用程序出现问题



我在使用 Excel 互操作的应用程序时遇到问题。使用Excel 2010和2013,它可以正常工作。不幸的是,它不再适用于我的同事,因为他已经升级到Office 2016。我也将很快升级,需要找到解决方案。

正在做什么?

单击事件触发后台辅助角色...

private void btnPrep_Click(object sender, EventArgs e)
{
lblWorking.Visible = true;
pBar1.Visible = true;
//...
//...
bwPrep.RunWorkerAsync(args);
}

。它反过来调用一个方法 "Xls2Xml"...

private void bwPrep_DoWork(object sender, DoWorkEventArgs e)
{
//...
//...
foreach (var x in y)
{
var fils = di.GetFiles();
if (fils.Any(f => f.Name.Contains(".xls"))) 
{
bwPrep.ReportProgress(0, lang);
Xls2Xml(fils.First(f => f.Name.Contains(".xls")).FullName, dest);
}   
}
}

。我在其中使用互操作:

private void Xls2Xml(string xlsPath, string destination)
{
var pfad = xlsPath;
var xlapp = new XL.Application();
var wbooks = xlapp.Workbooks;
var wb = wbooks.Open(pfad);
var sheets = wb.Sheets;
XL.Worksheet sheet = sheets[1];
//...
//...
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(wbooks);
Marshal.ReleaseComObject(xlapp);
}

这适用于 Excel 2010 和 2013。Excel 2016 会导致 COM 错误。首先,它是RPC_E_SERVERCALL_RETRYLATER("应用程序繁忙"(。

谷歌搜索给了我一个建议,在调用后台工作人员之前添加这一行:

System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());

这样做是将生成的错误更改为"呼叫被调用方拒绝"(RPC_E_CALL_REJECTED(。

我确保引用了正确版本的 Excel 互操作和 Office 库 (1.9/16(。

错误发生在var xlapp = new XL.Application();行上,在此行之前未创建 Excel 应用程序的其他实例。Excel已正确安装和激活,修复安装也没有解决问题。

你们中有人遇到过类似的问题吗?

已解决。

事实证明,这是我的同事方便地忘记提及的事情,因为他完全忘记了它:罪魁祸首是Kutools加载项。

尽管它以前安装过并且当时没有引起问题,但最新的 Office 更新之一必须更改了一些行为。停用库工具就是它所需要的。

最新更新