`
feohoo
  • 浏览: 112542 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

jacob 抽取word文档

阅读更多

介绍一下jacob:
jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用!
下载地址:

http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368

可用的版本很多,现在我用的是:jacob_1.11.1
功能:可以实现word与pdf和excel的操作,与转换!
JDK版本:jdk1.4
我实现的作用:使用插件:按照word规定的格式创建word 文件

配置说明::

解压文件:jacob_1.11.1.zip ,copy jacob.jar文件加入到classpath

copy jacob.dll 放在java jdk bin目录下

copy template.doc到web-inf下

 

注:template: 可以修改为自己的任意格式的doc
先看一下我的template.doc:
下面是我的类文件:Java2Word.java

  1. package com.cenbow.web.produceword;
  2. /*************************************
  3. *
  4. *作用:利用jacob插件根据模板word生成word 文件!
  5. *
  6. *传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。
  7. * word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……,以免执行错误的替换。
  8. * 所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、.jpg、.gif)。
  9. * 要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表word模板中的第N张表格;
  10. * Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代表一行数据,ArrayList中第一条记录为特殊记录,
  11. * 记录的是表格中要替换的列号,如:要替换第一列、第三列、第五列的数据,则第一条记录为String[3] {“1”,”3”,”5”}。
  12. *
  13. *
  14. *create on 2007.3.6
  15. *author fgl
  16. *
  17. *
  18. ************************************/
  19.  
  20. import java.util.Iterator;
  21. import java.util.List;
  22. import java.util.HashMap;
  23.  
  24. import com.jacob.activeX.ActiveXComponent;
  25. import com.jacob.com.ComThread;
  26. import com.jacob.com.Dispatch;
  27. import com.jacob.com.Variant;
  28.  
  29. public class Java2Word {
  30. private boolean saveOnExit;
  31. /**
  32. * word文档
  33. */
  34. private Dispatch doc = null;
  35. /**
  36. * word运行程序对象
  37. */
  38. private ActiveXComponent word;
  39. /**
  40. * 所有word文档
  41. */
  42. private Dispatch documents;
  43. /**
  44. * 构造函数
  45. */
  46. public Java2Word() {
  47. saveOnExit = false;
  48. word = new ActiveXComponent("Word.Application");
  49. word.setProperty("Visible",new Variant(false));
  50. documents = word.getProperty("Documents").toDispatch();
  51. }
  52. /**
  53. * 设置参数:退出时是否保存
  54. * @param saveOnExit true-退出时保存文件,false-退出时不保存文件
  55. */
  56. public void setSaveOnExit(boolean saveOnExit) {
  57. this.saveOnExit = saveOnExit;
  58. }
  59. /**
  60. * 得到参数:退出时是否保存
  61. * @return boolean true-退出时保存文件,false-退出时不保存文件
  62. */
  63. public boolean getSaveOnExit() {
  64. return saveOnExit;
  65. }
  66. /**
  67. * 打开文件
  68. * @param inputDoc 要打开的文件,全路径
  69. * @return Dispatch 打开的文件
  70. */
  71. public Dispatch open(String inputDoc) {
  72. return Dispatch.call(documents,"Open",inputDoc).toDispatch();
  73. }
  74. /**
  75. * 选定内容
  76. * @return Dispatch 选定的范围或插入点
  77. */
  78. public Dispatch select() {
  79. return word.getProperty("Selection").toDispatch();
  80. }
  81. /**
  82. * 把选定内容或插入点向上移动
  83. * @param selection 要移动的内容
  84. * @param count 移动的距离
  85. */
  86. public void moveUp(Dispatch selection,int count) {
  87. for(int i = 0;i < count;i++)
  88. Dispatch.call(selection,"MoveUp");
  89. }
  90. /**
  91. * 把选定内容或插入点向下移动
  92. * @param selection 要移动的内容
  93. * @param count 移动的距离
  94. */
  95. public void moveDown(Dispatch selection,int count) {
  96. for(int i = 0;i < count;i++)
  97. Dispatch.call(selection,"MoveDown");
  98. }
  99. /**
  100. * 把选定内容或插入点向左移动
  101. * @param selection 要移动的内容
  102. * @param count 移动的距离
  103. */
  104. public void moveLeft(Dispatch selection,int count) {
  105. for(int i = 0;i < count;i++)
  106. Dispatch.call(selection,"MoveLeft");
  107. }
  108. /**
  109. * 把选定内容或插入点向右移动
  110. * @param selection 要移动的内容
  111. * @param count 移动的距离
  112. */
  113. public void moveRight(Dispatch selection,int count) {
  114. for(int i = 0;i < count;i++)
  115. Dispatch.call(selection,"MoveRight");
  116. }
  117. /**
  118. * 把插入点移动到文件首位置
  119. * @param selection 插入点
  120. */
  121. public void moveStart(Dispatch selection) {
  122. Dispatch.call(selection,"HomeKey",new Variant(6));
  123. }
  124. /**
  125. * 从选定内容或插入点开始查找文本
  126. * @param selection 选定内容
  127. * @param toFindText 要查找的文本
  128. * @return boolean true-查找到并选中该文本,false-未查找到文本
  129. */
  130. public boolean find(Dispatch selection,String toFindText) {
  131. // 从selection所在位置开始查询
  132. Dispatch find = Dispatch.call(selection,"Find").toDispatch();
  133. // 设置要查找的内容
  134. Dispatch.put(find,"Text",toFindText);
  135. // 向前查找
  136. Dispatch.put(find,"Forward","True");
  137. // 设置格式
  138. Dispatch.put(find,"Format","True");
  139. // 大小写匹配
  140. Dispatch.put(find,"MatchCase","True");
  141. // 全字匹配
  142. Dispatch.put(find,"MatchWholeWord","True");
  143. // 查找并选中
  144. return Dispatch.call(find,"Execute").getBoolean();
  145. }
  146. /**
  147. * 把选定内容替换为设定文本
  148. * @param selection 选定内容
  149. * @param newText 替换为文本
  150. */
  151. public void replace(Dispatch selection,String newText) {
  152. // 设置替换文本
  153. Dispatch.put(selection,"Text",newText);
  154. }
  155. /**
  156. * 全局替换
  157. * @param selection 选定内容或起始插入点
  158. * @param oldText 要替换的文本
  159. * @param newText 替换为文本
  160. */
  161. public void replaceAll(Dispatch selection,String oldText,Object replaceObj) {
  162. // 移动到文件开头
  163. moveStart(selection);
  164. if(oldText.startsWith("table") || replaceObj instanceof List) {
  165. replaceTable(selection,oldText,(List) replaceObj);
  166. } else {
  167. String newText = (String) replaceObj;
  168. if(oldText.indexOf("image") != -1
  169. || newText.lastIndexOf(".bmp") != -1
  170. || newText.lastIndexOf(".jpg") != -1
  171. || newText.lastIndexOf(".gif") != -1)
  172. while (find(selection,oldText)) {
  173. replaceImage(selection,newText);
  174. Dispatch.call(selection,"MoveRight");
  175. }
  176. else
  177. while (find(selection,oldText)) {
  178. replace(selection,newText);
  179. Dispatch.call(selection,"MoveRight");
  180. }
  181. }
  182. }
  183. /**
  184. * 替换图片
  185. * @param selection 图片的插入点
  186. * @param imagePath 图片文件(全路径)
  187. */
  188. public void replaceImage(Dispatch selection,String imagePath) {
  189. Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);
  190. }
  191. /**
  192. * 替换表格
  193. * @param selection 插入点
  194. * @param tableName 表格名称,形如table$1@1、table$2@1...table$R@N,R代表从表格中的第N行开始填充,
  195. *                  N代表word文件中的第N张表
  196. * @param fields 表格中要替换的字段与数据的对应表
  197. */
  198. public void replaceTable(Dispatch selection,String tableName,List dataList) {
  199. if(dataList.size() <= 1) {
  200. System.out.println("Empty table!");
  201. return;
  202. }
  203. // 要填充的列
  204. String[] cols = (String[]) dataList.get(0);
  205. // 表格序号
  206. String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1);
  207. // 从第几行开始填充
  208. int fromRow = Integer.parseInt(tableName.substring(tableName
  209. .lastIndexOf("$") + 1,tableName.lastIndexOf("@")));
  210. // 所有表格
  211. Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();
  212. // 要填充的表格
  213. Dispatch table = Dispatch.call(tables,"Item",new Variant(tbIndex))
  214. .toDispatch();
  215. // 表格的所有行
  216. Dispatch rows = Dispatch.get(table,"Rows").toDispatch();
  217. // 填充表格
  218. for(int i = 1;i < dataList.size();i++) {
  219. // 某一行数据
  220. String[] datas = (String[]) dataList.get(i);
  221. // 在表格中添加一行
  222. if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1)
  223. Dispatch.call(rows,"Add");
  224. // 填充该行的相关列
  225. for(int j = 0;j < datas.length;j++) {
  226. // 得到单元格
  227. Dispatch cell = Dispatch.call(table,"Cell",
  228. Integer.toString(fromRow + i - 1),cols[j]).toDispatch();
  229. // 选中单元格
  230. Dispatch.call(cell,"Select");
  231. // 设置格式
  232. Dispatch font = Dispatch.get(selection,"Font").toDispatch();
  233. Dispatch.put(font,"Bold","0");
  234. Dispatch.put(font,"Italic","0");
  235. // 输入数据
  236. Dispatch.put(selection,"Text",datas[j]);
  237. }
  238. }
  239. }
  240. /**
  241. * 保存文件
  242. * @param outputPath 输出文件(包含路径)
  243. */
  244. public void save(String outputPath) {
  245. Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);
  246. }
  247. /**
  248. * 关闭文件
  249. * @param document 要关闭的文件
  250. */
  251. public void close(Dispatch doc) {
  252. Dispatch.call(doc,"Close",new Variant(saveOnExit));
  253. }
  254.  
  255. /**
  256. * 退出程序
  257. */
  258. public void quit() {
  259. word.invoke("Quit",new Variant[0]);
  260. ComThread.Release();
  261. }
  262. /**
  263. * 根据模板、数据生成word文件
  264. * @param inputPath 模板文件(包含路径)
  265. * @param outPath 输出文件(包含路径)
  266. * @param data 数据包(包含要填充的字段、对应的数据)
  267. */
  268. public void toWord(String inputPath,String outPath,HashMap data)color: gr
    分享到:
    评论

相关推荐

    Java抽取Word及PDF编程

    ### Java抽取Word及PDF编程 #### 一、引言 在日常工作中,处理Word和PDF文档的需求非常普遍,尤其是在企业级应用中。无论是自动化办公流程还是数据处理任务,能够有效地从这些格式的文档中提取信息变得至关重要。...

    Java抽取Word和PDF格式文件

    以下是一个使用POI抽取Word文档内容的简单示例: ```java import java.io.*; import org.apache.poi.hwpf.extractor.*; import org.apache.poi.poifs.filesystem.*; public class WordExtractorExample { public ...

    Java抽取Word和PDF格式文件的四种武器.doc

    本文将介绍四种主要的Java库,它们可以帮助开发者有效地抽取Word和PDF文档的内容。 首先,我们来看JACOB(Java COM Bridge)。JACOB是一个Java库,用于连接Java和COM组件,允许Java程序调用Windows API和Microsoft ...

    JAVA读取WORD-pdf等.docx

    - `java2word` 是一个专门用于Java中调用MS Office Word文档的组件,它提供了一些简单的API来操作Word文档。 - `XPDF` 是另一个处理PDF的工具,也可以用于文本抽取,但它通常在命令行环境下使用,而非Java库。 ...

    office

    JACOB(Java COM Bridge)则是一个用于Java调用COM组件的库,例如,通过它可以与Office应用程序直接交互,实现自动化操作,比如打开Word文档、编辑内容、保存并关闭文档等。这种方法虽然功能强大,但可能需要对COM...

    JAVA上百实例源码以及开源项目源代码

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    java开源包1

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包11

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包2

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包3

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包6

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包5

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包10

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包4

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包8

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包7

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包9

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包101

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    Java资源包01

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

Global site tag (gtag.js) - Google Analytics