多个word合并

先下载jacob.jar包。

如果是32位系统 将jacob-1.18-x86.dll 文件复制到下面目录下,如果是64位操作系统 将jacob-1.18-x64.dll C:\Program Files\Java\jdk1.8.0_45\jre\bin

将jacob.jar增加项目。

这样项目的环境基本上搭建完毕,接下来就是书写相关的代码:

/**
* 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段。Value代表用来替换的值。
* word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾。
* 如:$code$、$date$……。以免执行错误的替换。

* 全部要替换为图片的字段,Key中需包括image或者Value为图片的全路径
* (眼下仅仅推断文件后缀名为:.bmp、.jpg、.gif)。

* 要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,当中:
* R代表从表格的第R行開始替换,N代表word模板中的第N张表格;
* Value为ArrayList对象,ArrayList中包括的对象统一为String[],一条String[]代表一行数据。
* ArrayList中第一条记录为特殊记录。记录的是表格中要替换的列号,
* 如:要替换第一列、第二列、第三列的数据。则第一条记录为String[3] {"1","2","3"}。
*/import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;/*** 利用word模板生成word文件* @typename:Java2word* @author: FishRoad* @since: 2015年8月24日 下午2:47:41**/
public class Java2word {private boolean saveOnExit;/*** word文档*/Dispatch doc = null;/*** word执行程序对象s*/private   ActiveXComponent word;/*** 全部word文档*/private   Dispatch documents;/*** 构造函数*/public Java2word() {if(word==null){word = new ActiveXComponent("Word.Application");word.setProperty("Visible",new Variant(false));}if(documents==null)documents = word.getProperty("Documents").toDispatch();saveOnExit = false;}/*** 设置參数:退出时是否保存* @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件*/public void setSaveOnExit(boolean saveOnExit) {this.saveOnExit = saveOnExit;}/*** 得到參数:退出时是否保存* @return boolean true-退出时保存文件,false-退出时不保存文件*/public boolean getSaveOnExit() {return saveOnExit;}/*** 打开文件* @param inputDoc String 要打开的文件,全路径* @return Dispatch 打开的文件*/public Dispatch open(String inputDoc) {return Dispatch.call(documents,"Open",inputDoc).toDispatch();}/*** 选定内容* @return Dispatch 选定的范围或插入点*/public Dispatch select() {return word.getProperty("Selection").toDispatch();}/*** 把选定内容或插入点向上移动* @param selection Dispatch 要移动的内容* @param count int 移动的距离*/public void moveUp(Dispatch selection,int count) {for(int i = 0;i < count;i ++)Dispatch.call(selection,"MoveUp");}/*** 把选定内容或插入点向下移动* @param selection Dispatch 要移动的内容* @param count int 移动的距离*/public void moveDown(Dispatch selection,int count) {for(int i = 0;i < count;i ++)Dispatch.call(selection,"MoveDown");}/*** 把选定内容或插入点向左移动* @param selection Dispatch 要移动的内容* @param count int 移动的距离*/public void moveLeft(Dispatch selection,int count) {for(int i = 0;i < count;i ++) {Dispatch.call(selection,"MoveLeft");}}/*** 把选定内容或插入点向右移动* @param selection Dispatch 要移动的内容* @param count int 移动的距离*/public void moveRight(Dispatch selection,int count) {for(int i = 0;i < count;i ++)Dispatch.call(selection,"MoveRight");}/*** 把插入点移动到文件首位置* @param selection Dispatch 插入点*/public void moveStart(Dispatch selection) {Dispatch.call(selection,"HomeKey",new Variant(6));}/*** 从选定内容或插入点開始查找文本* @param selection Dispatch 选定内容* @param toFindText String 要查找的文本* @return boolean true-查找到并选中该文本。false-未查找到文本*/public boolean find(Dispatch selection,String toFindText) {//从selection所在位置開始查询Dispatch find = word.call(selection,"Find").toDispatch();//设置要查找的内容Dispatch.put(find,"Text",toFindText);//向前查找Dispatch.put(find,"Forward","True");//设置格式Dispatch.put(find,"Format","True");//大写和小写匹配Dispatch.put(find,"MatchCase","True");//全字匹配Dispatch.put(find,"MatchWholeWord","True");//查找并选中return Dispatch.call(find,"Execute").getBoolean();}/*** 把选定内容替换为设定文本* @param selection Dispatch 选定内容* @param newText String 替换为文本*/public void replace(Dispatch selection,String newText) {//设置替换文本Dispatch.put(selection,"Text",newText);}/*** 全局替换* @param selection Dispatch 选定内容或起始插入点* @param oldText String 要替换的文本* @param newText String 替换为文本*/public void replaceAll(Dispatch selection,String oldText,Object replaceObj) {//移动到文件开头moveStart(selection);if(oldText.startsWith("table") || replaceObj instanceof ArrayList)replaceTable(selection,oldText,(ArrayList) replaceObj);else {String newText = (String) replaceObj;if(newText==null)newText="";if(oldText.indexOf("image") != -1&!newText.trim().equals("") || newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 || newText.lastIndexOf(".gif") != -1){while(find(selection,oldText)) {replaceImage(selection,newText);Dispatch.call(selection,"MoveRight");}}else{while(find(selection,oldText)) {replace(selection,newText);Dispatch.call(selection,"MoveRight");}}}}/*** 替换图片* @param selection Dispatch 图片的插入点* @param imagePath String 图片文件(全路径)*/public void replaceImage(Dispatch selection,String imagePath) {Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);}/*** 替换表格* @param selection Dispatch 插入点* @param tableName String 表格名称。* 形如table$1@1、table$2@1...table$R@N。R代表从表格中的第N行開始填充,N代表word文件里的第N张表* @param fields HashMap 表格中要替换的字段与数据的相应表*/public void replaceTable(Dispatch selection,String tableName,ArrayList dataList) {if(dataList.size() <= 1) {System.out.println("Empty table!");return;}//要填充的列String[] cols = (String[]) dataList.get(0);//表格序号String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1);//从第几行開始填充int fromRow = Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") + 1,tableName.lastIndexOf("@")));//全部表格Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();//要填充的表格Dispatch table = Dispatch.call(tables,"Item",new Variant(tbIndex)).toDispatch();//表格的全部行Dispatch rows = Dispatch.get(table,"Rows").toDispatch();//填充表格for(int i = 1;i < dataList.size();i ++) {//某一行数据String[] datas = (String[]) dataList.get(i);//在表格中加入一行if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1)Dispatch.call(rows,"Add");//填充该行的相关列for(int j = 0;j < datas.length;j ++) {//得到单元格Dispatch cell = Dispatch.call(table,"Cell",Integer.toString(fromRow + i - 1),cols[j]).toDispatch();//选中单元格Dispatch.call(cell,"Select");//设置格式Dispatch font = Dispatch.get(selection,"Font").toDispatch();Dispatch.put(font,"Bold","0");Dispatch.put(font,"Italic","0");//输入数据Dispatch.put(selection,"Text",datas[j]);}}}/*** 保存文件* @param outputPath String 输出文件(包括路径)*/public void save(String outputPath) {Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);}/*** 关闭文件* @param document Dispatch 要关闭的文件*/public void close(Dispatch doc) {Dispatch.call(doc,"Close",new Variant(saveOnExit));word.invoke("Quit",new Variant[]{});word = null;}/*** 依据模板、数据生成word文件* @param inputPath String 模板文件(包括路径)* @param outPath String 输出文件(包括路径)* @param data HashMap 数据包(包括要填充的字段、相应的数据)*/public void toWord(String inputPath,String outPath,HashMap data) {String oldText;Object newValue;try {if(doc==null)doc = open(inputPath);Dispatch selection = select();Iterator keys = data.keySet().iterator();while(keys.hasNext()) {oldText = (String) keys.next();newValue = data.get(oldText);replaceAll(selection,oldText,newValue);}save(outPath);} catch(Exception e) {System.out.println("操作word文件失败!");e.printStackTrace();} finally {if(doc != null)close(doc);}}public synchronized static void word(String inputPath,String outPath,HashMap data){Java2word j2w = new Java2word();j2w.toWord(inputPath,outPath,data);}@SuppressWarnings({ "rawtypes", "unchecked" })public static void main(String[] args) {//替换word中相关的字段HashMap data = new HashMap();data.put("$reportDept$","2007-8-1");data.put("$findDate$","2007-8-2");data.put("$finder$","kdl");data.put("$lineName$","5号线");data.put("$voltageRate$","11月13日");data.put("$towerNumberBound$","2004年11月10日");data.put("$image1$","C:\\Users\\Administrator\\Pictures\\1.jpg");data.put("$name$", "FishRoad");data.put("$age$", "24");//替换word中表格的数据/*** 要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,当中:* R代表从表格的第R行開始替换,N代表word模板中的第N张表格;* Value为ArrayList对象,ArrayList中包括的对象统一为String[]。* 一条String[]代表一行数据,ArrayList中第一条记录为特殊记录。记录的是表格中要替换的列号。* 如:要替换第一列、第二列、第三列的数据,则第一条记录为String[3] {"1","2","3"}*/ArrayList table1 = new ArrayList(3);String[] fieldName1 = {"1","2","3"};table1.add(fieldName1);String[] field11 = {"1","751002","华夏证券"};table1.add(field11);String[] field21 = {"2","751004","国泰君安"};table1.add(field21);String[] field31 = {"3","751005","海通证券"};table1.add(field31);data.put("table$2@2",table1);Java2word j2w = new Java2word();long time1 = System.currentTimeMillis();j2w.toWord("E:/template.doc","E:/result.doc",data);System.out.println("time cost : " + (System.currentTimeMillis() - time1));}
}

以上是相关的代码。接下来就要配置word模板,例如以下:

导出的结果例如以下图:

Java通过jacob生成动态word,还有一种方法通过word书签实现相关推荐

  1. java数组循环扩容_Java中实现数组动态扩容的两种方法

    Java中实现数组动态扩容的两种方法 java中初始化一个数组需要定义数组的容量,而在我们使用数组时往往会遇到数组容量不够的情况,此时我们就需要通过动态扩容的方式来来根据需求扩大数组的容量. 我们可以 ...

  2. matlab 图像转视频教程,Matlab制作视频并转换成gif动态图的两种方法

    一.第一个方法比较简单,就是使用movie(f)直接取生成AVI视频文件. %% f(t)-->f(4*t+12) 并且验证%% function Signal_change() tic%记录程 ...

  3. [转]DES加密 java与.net可以相互加密解密两种方法

    [转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...

  4. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  5. 生成唯一id的几种方法

    生成唯一id的几种方法 生成唯一id的方式有很多,UUID,自动增长列,雪花算法,redis等等. 生成id的要求: 全局唯一 趋势递增 效率高(生成.使用.索引) 控制并发 1.雪花算法(twitt ...

  6. php imagick 取得psd缩略图,PHP利用imagick读取PDF生成png缩略图的两种方法

    PHP利用imagick读取PDF生成png缩略图的两种方法 发表于2019-04-24 06:08| 次阅读| 来源网络整理| 作者session 摘要:PHP利用imagick读取PDF生成png ...

  7. 产生随机字符java_java生成随机字符串的两种方法

    本文实例为大家分享了java生成随机字符串的具体代码,供大家参考,具体内容如下 import java.util.Random; public class CharacterUtils { //方法1 ...

  8. linux动态库查找,Linux查找动态库的3种方法

    Linux查找动态库的3种方法 linux默认加载动态库的路径是 /lib或者是/lib64, 32位的系统是前者,64位是后者. 如果找不到还有3个地方 LD_LIBRARY_PATH rpath ...

  9. php 自动生成查询密码,php自动生成新密码的两种方法

    php自动生成新密码的两种方法,方法一采用的是随机种子,方法是乱序数组,异曲同工吧. 有需要的朋友可以参考下. 方法1: 代码示例: /* * php自动生成新密码自定义函数 适用环境: PHP5.2 ...

最新文章

  1. 柱状折线图2-双柱状重合堆积折线-重写图例点击事件
  2. Ajax异步请求-简单模版
  3. windows组件中没有IIS解决方法
  4. C++ POD(Plain Old Data)类型
  5. iptables 配置后连接不上数据库_Linux服务器配置-VSFTP服务配置(三)
  6. oracle 客户端连接数_转载:查看Oracle连接数
  7. ubuntu14.04+ROS indigo+kinectV1 骨骼点检测
  8. 第一次冲刺-个人总结05
  9. word转pdf公式乱码_word转pdf乱码
  10. Centos7 Zabbix监控部署
  11. 软考中级网络工程师学习技巧
  12. Django中的views
  13. 联想服务器如何u盘启动盘装系统,联想如何设置u盘启动
  14. 西魏拓地与侯景防线之关系
  15. 02 C/C++创建tcl自定义命令
  16. php狼找兔子问题算法,算法 狼找兔子问题
  17. 公积金网厅显示连接服务器错误,住房公积金网厅解决方案
  18. 青蛙的约会—POJ1061
  19. 7-55 查询水果价格 (15分)
  20. python中matplotlib绘图中文显示问题

热门文章

  1. Java-List常用方法
  2. 网红为什么能增加ROI?什么样的网红才能增加ROI
  3. 零基础学习PS——Photoshop的167个技能
  4. 抖音计算机学猫叫视频,抖音短视频我们一起学猫叫是什么歌
  5. 01.使用.svg格式图片生成app图标详细步骤和注意事项
  6. 中华女子学院计算机考试题库,中华女子学院综合素质测试面试题历年总结
  7. 抖音小程序基础之 TTSS 样式是什么
  8. 福特FORD EDI流程指南
  9. Think Pad E570重装Win10系统没有外放喇叭声音
  10. Ubuntu系统耳机没声音