我在使用使用 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已正确安装并激活,修复安装也没有解决问题。
你们中有人遇到过类似的问题吗?
慕桂英4014372
相关分类