com jacob.com ComFailException: invoke of: Paste Source: Microsoft Word Description:此方法或属性无效,因为剪贴板是空

项目场景:

使用jacob粘贴文件时
com jacob.com ComFailException: invoke of: Paste
Source: Microsoft Word
Description:此方法或属性无效,因为剪贴板是空的或无效的。


问题描述

最近有合并word的需求,在网上翻阅了前人的帖子后,发现并不能使用。
百度找了很多出现问题的解决方法,包括jar包,dll文件,office的问题,均未能解决。
后来发现程序打断点的时候代码就能正常运行,根据此现象发现了问题所在。
下面是我对前人代码的改进。
后来发现这么改也不对,有时候文件实在是太大,延迟不够用了,此时我的想法是try出异常就循环调用,加个次数限制,至于为什么没这么写,是因为我发现Free Spire.Office for Java这个插件很好用,注意Free是免费版的,这个是官网地址,jar包可以去里面下载冰蓝科技官网
本人的Free Spire.Office for Java使用示例

下面的代码是对于jacob的问题修改

/**
     * Word合并功能
     * 将文件地址为fileRealPath的文件内容复制到文件地址为saveNewRealpath的文件内容后面后面
     * @param fileRealPath
     * @param saveNewRealpath
     */
    public static void wordMerge(String fileRealPath,String saveNewRealpath) {
        //这是copy全文方法
        ComThread.InitSTA();//初始化线程
        //被复制的文档
        ActiveXComponent word2 = new ActiveXComponent("Word.Application");
        word2.setProperty("Visible", new Variant(false));
        Dispatch documents2 = word2.getProperty("Documents").toDispatch();
        //复制的文档
        ActiveXComponent word = new ActiveXComponent("Word.Application");
        word.setProperty("Visible", new Variant(false));
        Dispatch documents = word.getProperty("Documents").toDispatch();

        Dispatch doc2 = Dispatch.call(documents2, "Open", saveNewRealpath).toDispatch();
        //复制模板的内容
        Dispatch doc = Dispatch.call(documents, "Open", fileRealPath).toDispatch();
        Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch();
        try {
            Dispatch.call(wordContent, "Copy");
            Thread.sleep(1000); //使java程序暂停一秒钟,当服务器出现卡顿时,会出现文件内容还未粘贴到粘贴板中,下方代码中调用剪切板时,会报错
            Dispatch selection = Dispatch.get(word2, "Selection").toDispatch();
            Dispatch.call(selection, "EndKey", new Variant(6));
            Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
            Dispatch.call(textRange, "Paste");
            Dispatch.call(doc2, "Save");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Dispatch.call(doc2, "Close", new Variant(true));
            Dispatch.call(word2, "Quit");
            doc2 = null;
            word2 = null;
            Dispatch.call(doc, "Close", new Variant(true));
            Dispatch.call(word, "Quit");
            doc = null;
            word = null;
            documents2 = null;
            ComThread.Release();//释放线程
        }
    }

原因分析:

相信大家也看出了问题所在,原因是系统卡顿,还未将word内容复制到剪切板的时候,java就要读取剪切板,导致系统出现异常,文件也未能正常关闭,后续再操作这个文件时,也会出现无法打开的异常。


解决方案:

只需在复制word内容到剪切板时,让java程序暂停一下,在读取就可以了,并且把关闭文件的代码写在finally里就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值