在我的网站上,有一个功能可以打开机器上的Excel文件并通过雅各布库(jacob-1.14.3)来处理它。
每次从新线程调用此代码:
//In a new thread everytime
ActiveXComponent excelApp = null;
try {
info("Openning Excel application..", 1);
ComThread.InitSTA();
//ComThread.InitMTA();
//ComThread.InitSTA(true);
//ComThread.InitMTA(true);
excelApp = new ActiveXComponent("Excel.Application");
excelApp.setProperty("DisplayAlerts", false);
excelApp.setProperty("Visible", false);
[...]
catch (Exception e) {
throw e;
} finally {
if (excelApp != null) {
info("Closing Excel app..", 1);
excelApp.invoke("Quit");
ComThread.Release();
System.gc();
}
}
只要有超过1个线程处理Excel,我就会收到此错误:
com.jacob.com.ComFailException:无法将名称映射到dispid:XXX
XXX代表我正在寻找的任何属性(名称,工作簿,退出等)。运行1个单线程时不会出现错误。
在互联网上花了好几个小时后,我只有一份我不理解的文件:http://danadler.com/jacob/JacobThreading.html
我已经尝试过ComThread.InitSTA / MTA功能,但似乎没有解决问题。
如何让多个Excel实例与我的应用程序从不同的线程进行通信?