项目场景:
使用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里就可以了。