致访客
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。
JACOB一个Java-COM中间件,通过这个组件你可以在Java应用程序中调用COM组件和Win32程序库。
本文使用Jacob版本为1.20,示例源码使用SpringBoot构建,相关工具放在JacobUtils中
地址:https://gitee.com/pangdonghai/jacob-document-merge-api
文档合并
如果在处理过程中抛出异常,word会提示是否保存文件,导致文件一直被占用无法删除。所以将Close方法放到了finally处理。
public static void merge(List<String> fileList, String savePath) {
if (fileList.size() == 0) {
return;
}
// 打开word
Object doc = null;
ActiveXComponent axc = new ActiveXComponent("Word.application");
try {
// 设置word不可见 ---也就是设置ActiveXComponent对象的一个属性
axc.setProperty("Visible", new Variant(false));
// 获得documents对象----Variant。toDispatch()
Object docs = axc.getProperty("Documents").toDispatch();
// 打开第一个文件
// 功能调用,
// 对ActiveX对象docs的"Open"属性执行Dispatch.Method(Dispatch.Put\Dispatch.Get等)操作,
// 执行后"Open"的值为参数4,
// 参数5为错误参数码常定义为new int[1],
// (注:call、get和put方法都是通过该方法实现的)
doc = Dispatch
.invoke(
(Dispatch) docs, //调用目标
"Open",
Dispatch.Method,
new Object[]{fileList.get(0), new Variant(false), new Variant(true)}, //参数4
new int[3]).toDispatch(); // 参数5
// 追加文件
// 和上面一样,不过换种通俗的解释:
// 参数1就是这个invoke方法的主题操作对象,
// 参数2就是要对参数1执行的方法的名字,
// 参数3就是参数2这个方法的具体操作;
// 参数4就是一系列的参数;
// 参数5为错误参数码常定义为new int[1]
for (int i = 1; i < fileList.size(); i++) {
Dispatch.invoke(
axc.getProperty("Selection").toDispatch(), // 参数1
"insertFile", // 参数2
Dispatch.Method, // 参数3
new Object[]{(String) fileList.get(i), "", new Variant(false), new Variant(false), new Variant(false)}, // 参数4
new int[3] // 参数5
);
}
// 保存新的word文件
Dispatch.invoke(
(Dispatch) doc,
"SaveAs",
Dispatch.Method,
new Object[]{savePath, new Variant(12)},
new int[3]);
Variant f = new Variant(false);
// 该方法和get方法非常类似,他是把"Close"属性赋值给f
// Dispatch.call((Dispatch) doc, "Close", f);
} catch (Exception e) {
System.out.println("Merge word file failed:" + e);
} finally {
if (doc != null) {
Dispatch.call((Dispatch) doc, "Close", new Variant(0));
}
axc.invoke("Quit", new Variant[]{});
}
}
将Word文件转换为Html文件
public static void word2Html(String srcPath, String destPath) {
ActiveXComponent axc = new ActiveXComponent("Word.application");
try {
axc.setProperty("Visible", new Variant(false));
Dispatch docs = axc.getProperty("Documents").toDispatch();
Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{srcPath, new Variant(false), new Variant(true)}, new int[1]).toDispatch();
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{destPath, new Variant(8)}, new int[1]);
Variant f = new Variant(false);
Dispatch.call(doc, "Close", f);
} catch (Exception e) {
e.printStackTrace();
} finally {
axc.invoke("Quit", new Variant[]{});
}
}