如何在Java中打开word文档并等待用户结束编辑

如何在Java中打开word文档并等待用户结束编辑,java,ms-word,Java,Ms Word,在Java进程内部,可以执行以下操作: 调用Microsoft Word打开文档 休眠Java进程,直到用户完成对文档的编辑 当用户在Microsoft Word中“关闭”文档时,恢复Java进程并继续执行 我可以使用桌面或进程类从Java打开Microsoft Word,但我不能等到Microsoft Word关闭。启动Microsoft Word时,我的Java进程始终会继续处理 是否可以在没有任何COM库的情况下执行此操作 我所做的尝试: 1) 直接调用winword.exe Proc

在Java进程内部,可以执行以下操作:

  • 调用Microsoft Word打开文档
  • 休眠Java进程,直到用户完成对文档的编辑
  • 当用户在Microsoft Word中“关闭”文档时,恢复Java进程并继续执行
我可以使用
桌面
进程
类从Java打开Microsoft Word,但我不能等到Microsoft Word关闭。启动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进程不会继续执行并保持等待。此外,我必须知道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();

这很好,但是。。。我不太喜欢它,因为有几种技术可以达到这个目的。在以后的更新中,我不知道它是否能正常工作。

您可以使用
Process.waitFor()
方法

与其他人(L.Carbone和Seelenvirtuose)提到的启动Microsoft Word的流程对应的流程,您可以使用
process.waitFor()
方法。下面是一个工作示例,它将调用Word并等待退出,然后再打印“完成”


也许吧?嗨,欢迎来到这个网站!感谢您清楚地说明您正在尝试做什么,但您能否编辑您的问题,以显示您尝试过的内容以及尝试时出现的错误/正确之处的一些示例?此外,有关如何改进问题的更多提示,请参阅。一个更好的问题会得到越来越多的答案,所以让问题和答案尽可能好符合每个人的利益:)。尝试检查文档文件是否可锁定。谢谢大家,我会尽我所能改进我的问题。谢谢非常有趣的文件锁,我会试试。谢谢这不起作用,因为当打开Microsoft Word时,Process.waitFor()将被解锁。它不会等到Microsoft Word关闭()。谢谢这是个坏消息,Microsoft Word可能会在其运行期间创建另一个进程。另一种方法是创建VBA宏,该宏在microsoft word关闭时执行。该宏可以与Java程序通信并发出关闭信号。这应该是可行的,但这需要更长的时间才能到位。。。很好,卢卡斯,我对L.Carbone说,这不起作用,因为当打开Microsoft Word时,会打印“完成”。关闭Microsoft Word时,我需要打印“完成”。谢谢你的帮助!在我这方面似乎很高兴,但你有不同的配置。您可以尝试将示例中的
cmd
字符串更改为“cmd/c start/wait c:\a.docx”
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");
}