2019-07-12_Java通过JACOB生成页眉
Java通过JACOB生成页眉
1概述
JACOB-JavaCOMBridge标准的操作word、excel工具包。用户本地系统中安装Word的应用程序可选(office、wps有其一即可)。
1.1 wps创建分节符宏指令
新建一个wps的word,然后点击视图,宏,定义宏的名称为:InsertBreakWdSectionBreakNextPage。
输入如内容:
Sub InsertBreakWdSectionBreakNextPage()
'
' InsertBreakWdSectionBreakNextPage Macro
'
Selection.InsertBreak Type:=wdSectionBreakNextPage
End Sub



1.2 office创建分节符宏指令



要注意到分页符和分节符的区别,分页符是Selection.InsertBreak Type:=0
1.3环境准备
在程序中用jacob调用它。
Dispatch.call(app, "Run",
new Variant("InsertBreakWdSectionBreakNextPage"));
2 wps实战
2.1 合并多个Word为一个Word
2.1.1 merge
/**
* 合并多个word为一个Word
*
* @param srcdocs
* @param destDoc
* @return
*/
public boolean mergeMultipleWord2Single2(java.util.List srcdocs, String destDoc) {
//1.校验
if (srcdocs.size() == 0 || srcdocs == null) {
return false;
}
System.out.println("启动 Word...");
long start = System.currentTimeMillis();
//2.判断
ActiveXComponent app = null;
Object currentDoc = null;
try {
// app = new ActiveXComponent("Word.Application"); // 基于microsoft office
app = new ActiveXComponent("KWPS.Application"); // 基于kwps的方式,具体和调用ActiveX控件有关
// 2.1.设置word不可见
app.setProperty("Visible", new Variant(false));
//获得Documents对象
Object docs = app.getProperty("Documents").toDispatch();
currentDoc = Dispatch.call((Dispatch) docs, "Add").toDispatch();
Dispatch selection = app.getProperty("Selection").toDispatch();
// 2.3.追加后续文件(排除最后一个)
for (int i = 0; i < srcdocs.size(); i++) {
Dispatch.call(selection, "MoveDown");
Dispatch.call(selection, "insertFile",srcdocs.get(i));
Dispatch.call(selection, "EndKey", new Variant(6));
if (i < srcdocs.size() - 1) {
Dispatch.call(app, "Run", new Variant("InsertBreakWdSectionBreakNextPage"));
}
}
//2.4.如果目的word存在,则删除
File tofile = new File(destDoc);
if (tofile.exists()) { // 目标pdf存在,则删除,前提未使用
tofile.delete();
}
// 2.5.保存为新的word
Dispatch.invoke((Dispatch) currentDoc, "SaveAs", Dispatch.Method, new Object[]{destDoc, new Variant(1)}, new int[3]);
Variant f = new Variant(false);
Dispatch.call((Dispatch) currentDoc, "Close", f); // 把close属性赋值个f
long end = System.currentTimeMillis();
System.out.println("转换完成..用时:" + (end - start) + "ms.");
} catch (Exception e) {
System.out.println("========合并Word文件失败:" + e.getMessage());
//throw new RuntimeException("========合并Word文件失败:" + e);
return false;
} finally {
System.out.println("关闭文档");
if (app != null) {
app.invoke("Quit", new Variant[]{});
}
}
// 如果没有这句话,winword.exe进程将不会关闭
ComThread.Release();
return true;
}
2.2 测试
package com.tech.ability.myjacob;
/**
-
@author kikop
-
@version 1.0
-
@project Name: TechnicalAbilityToolBox
-
@file Name: MyWord2PDFTest
-
@desc 功能描述
-
@date 2019/7/8
-
@time 23:04
-
@by IDE: IntelliJ IDEA
*/
public class MyWord2PDFTest {
/**
*
* @param args
*/
public static void main(String[] args) {
MyWord2PDF d = new MyWord2PDF();
d.wordToPDF("D:/Java通过jacob操作wps记录.doc", "D:/Java通过jacob操作wps记录.pdf");
}
}
2.3 结果查看
[图片上传失败...(image-1aa8d-1562946473126)]
[图片上传失败...(image-666976-1562946473126)]
3 参考
1.合并word文档时,用Jacob 插入分节符以达到保持原来的页眉的一个可行方案
https://blog.csdn.net/gaokao_20110607/article/details/8824116