在Java进程内部,可以执行以下操作:
我可以使用Desktop
或Process
类从Java打开Microsoft Word,但我无法等到Microsoft Words关闭。启动Microsoft Word时,我的Java进程始终继续处理。
是否可以在没有任何COM
库的情况下执行此操作?
尝试我做了:
1)直接调用winword.exe
Process p = Runtime.getRuntime().exec("C:\\Program Files (x86)\\Microsoft Office\\Office14\\WINWORD.EXE \""+FILEPATH+"\"");
p.waitFor();
但是如果我在编辑打开的文档时打开另一个Word文档,则winword.exe不会关闭,因此,Java Process不会继续执行并继续等待。另外,我必须知道Microsoft Word安装在哪里 - 这是个坏主意 -
2)调用rundll32和fileprotocolhandler
Process p = Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "+FILEPATH);
p.waitFor();
File file = new File(FILEPATH);
while(true){
try{
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
FileLock lock = channel.lock();
break;
}catch(Exception e){
Thread.sleep(3*1000);
}
}
打开时,我尝试锁定文件。如果我可以锁定文件,我认为Microsoft Word已关闭。问题是有时此代码在打开Microsoft Word之前锁定文件,p.waitFor()无法正常工作。
3)创建一个可打开Word文档的visual basic .exe,当它关闭时,然后是.exe完成
Process p = Runtime.getRuntime().exec("C:/openWordAndWaitClose.exe "+FILEPATH);
p.waitFor();
这很好,但是......我不太喜欢它,因为有几种技术可以达到目的。在未来的更新中,我不知道它是否会运作良好。
答案 0 :(得分:2)
您可以使用Process.waitFor()
方法
使用启动Microsoft Word的进程的进程对应
答案 1 :(得分:1)
正如其他人(L. Carbonne和Seelenvirtuose)所提到的,您可以使用Process.waitFor()
方法。这是一个工作示例,它将调用Word并等待在打印之前退出"完成"。
public static void main(String[] args) throws IOException, InterruptedException {
String cmd = "c:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.exe C:\\a.docx";
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
System.out.println("Done");
}