栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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的问题,均未能解决。
后来发现程序打断点的时候代码就能正常运行,根据此现象发现了问题所在。
下面是我对前人代码的改进。

    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里就可以了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/855626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号