我正在使用JACOB从Java对PowerPoint和其他Office应用程序进行COM调用。在特定的Windows 7机器上,我经常收到以下消息,但并非总是如此:
Source: Microsoft Office PowerPoint 2007
Description: PowerPoint could not open the file.
从excel我得到:
ERROR - Invoke of: Open
Source: Microsoft Office Excel
Description: Microsoft Office Excel cannot access the file 'c:\marchena\marchena10\work\marchena\batch_58288\input\content_1.xlsx'. There are several possible reasons:
? The file name or path does not exist.
? The file is being used by another program.
? The workbook you are trying to save has the same name as a currently open workbook.
Word错误只是:
VariantChangeType failed
以下是我正在运行的内容,错误来自最后一行。
ComThread.InitSTA();
slideApp = new ActiveXComponent("PowerPoint.Application");
Dispatch presentations = slideApp.getProperty("Presentations").toDispatch();
Dispatch presentation = Dispatch.call(presentations, "Open", inputFile.getAbsolutePath(),
MsoTriState.msoTrue.getInteger(), // ReadOnly
MsoTriState.msoFalse.getInteger(), // Untitled The Untitled parameter is used to create a copy of the presentation.
MsoTriState.msoFalse.getInteger() // WithWindow
).toDispatch();
我尝试在Open调用之前放置一个断点,文件就在那里,我实际上可以在GUI中使用PowerPoint打开它,但是当我执行步骤时抛出异常。
关于这个问题的令人讨厌的事情是它似乎不断发生,但是在对它进行了一段时间(重新运行相同的代码)之后,它最终成功完成,之后再也不会再出现。
进一步的研究我发现这只发生在.ppt,.doc和.xls文件中,而不是.pptx,.docx和.xlsx。据我所知,它与文件系统无关(我已经交换了复制文件并尝试将文件放在不同文件系统上的机制)。
我刚才注意到这只发生在Java应用程序作为服务运行时,而不是从命令行运行catalina.bat start
时。
答案 0 :(得分:3)
我遇到了同样的问题(服务中的jacob无法正常工作),这个有用的帖子(更改dcomcnfg)就可以了:
答案 1 :(得分:2)
这对你有用吗?
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class PPT {
private static final String inputFile = "c:\\learning.ppt";
public static void main(String[] args) {
ActiveXComponent slideApp = new ActiveXComponent("PowerPoint.Application");
slideApp.setProperty("Visible", new Variant(true));
ActiveXComponent presentations = slideApp.getPropertyAsComponent("Presentations");
ActiveXComponent presentation = presentations.invokeGetComponent("Open",new Variant(inputFile), new Variant(true));
ComThread.Release();
}
}
更新:如果这对客户端起作用并且只是导致问题的自动化,您可以查看http://support.microsoft.com/kb/257757以查看可能的问题。错误代码明显不同,但它可以帮助您解决所有相同问题。