最近的任务要求根据word模板生成检查报告,选择使用jacob,它对word的支持还可以,它是Java-COM中间件,通过这个组件可以调用COM组件和Win32程序库。

因此它在环境上有一定的局限性。

1.首先需要在C:\Windows\System32下加入jacob.dll动态链接库,如果是web工程,则在部署的服务器中也需要加入链接库。

2.在工程中加入jacob.jar文件。

在这里需要注意的是,不同版本的jacob最好不要混用,最直接的就是直接去其首页下载http://sourceforge.net/projects/jacob-project/files/,下载下来的压缩

文 件中既有32位的也有64位的链接库文件。

jacob操作word类:

public class JacobHelper {// word文档private Dispatch doc;// word运行程序对象private ActiveXComponent word;// 所有word文档集合private Dispatch documents;// 选定的范围或插入点private Dispatch selection;private boolean saveOnExit = true;public JacobHelper(boolean visible) throws Exception {ComThread.InitSTA();//线程启动if (word == null) {word = new ActiveXComponent("Word.Application");word.setProperty("Visible", new Variant(visible)); // 不可见打开wordword.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏}if (documents == null)documents = word.getProperty("Documents").toDispatch();}/*** 设置退出时参数* * @param saveOnExit*            boolean true-退出时保存文件,false-退出时不保存文件*/public void setSaveOnExit(boolean saveOnExit) {this.saveOnExit = saveOnExit;}/*** 创建一个新的word文档* */public void createNewDocument() {doc = Dispatch.call(documents, "Add").toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开一个已存在的文档* * @param docPath*/public void openDocument(String docPath) {
//      closeDocument();doc = Dispatch.call(documents, "Open", docPath).toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 只读方式打开一个加密的文档* * @param docPath-文件全名* @param pwd-密码*/public void openDocumentOnlyRead(String docPath, String pwd)throws Exception {
//      closeDocument();doc = Dispatch.callN(documents,"Open",new Object[] { docPath, new Variant(false), new Variant(true),new Variant(true), pwd, "", new Variant(false) }).toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开一个加密的文档* @param docPath* @param pwd* @throws Exception*/public void openDocument(String docPath, String pwd) throws Exception {
//      closeDocument();doc = Dispatch.callN(documents,"Open",new Object[] { docPath, new Variant(false), new Variant(false),new Variant(true), pwd }).toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 从选定内容或插入点开始查找文本* * @param toFindText*            要查找的文本* @return boolean true-查找到并选中该文本,false-未查找到文本*/@SuppressWarnings("static-access")public boolean find(String toFindText) {if (toFindText == null || toFindText.equals(""))return false;// 从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", "false");// 查找并选中return Dispatch.call(find, "Execute").getBoolean();}/*** 把选定选定内容设定为替换文本* * @param toFindText*            查找字符串* @param newText*            要替换的内容* @return*/public boolean replaceText(String toFindText, String newText) {if (!find(toFindText))return false;Dispatch.put(selection, "Text", newText);return true;}/*** 全局替换文本* * @param toFindText*            查找字符串* @param newText*            要替换的内容*/public void replaceAllText(String toFindText, String newText) {while (find(toFindText)) {Dispatch.put(selection, "Text", newText);Dispatch.call(selection, "MoveRight");}}/*** 在当前插入点插入字符串* * @param newText*            要插入的新字符串*/public void insertText(String newText) {Dispatch.put(selection, "Text", newText);}/*** 设置当前选定内容的字体* * @param boldSize* @param italicSize* @param underLineSize*            下划线* @param colorSize*            字体颜色* @param size*            字体大小* @param name*            字体名称* @param hidden*            是否隐藏*/public void setFont(boolean bold, boolean italic, boolean underLine,String colorSize, String size, String name,boolean hidden) {Dispatch font = Dispatch.get(selection, "Font").toDispatch();Dispatch.put(font, "Name", new Variant(name));Dispatch.put(font, "Bold", new Variant(bold));Dispatch.put(font, "Italic", new Variant(italic));Dispatch.put(font, "Underline", new Variant(underLine));Dispatch.put(font, "Color", colorSize);Dispatch.put(font, "Size", size);Dispatch.put(font, "Hidden", hidden);}/*** 文件保存或另存为* * @param savePath*            保存或另存为路径*/public void save(String savePath) {
//      Object wordBasic = Dispatch.call(word, "WordBasic").getDispatch();
//      Dispatch.call((Dispatch) wordBasic,"FileSaveAs", savePath);Dispatch.call(doc, "SaveAs", savePath);}/*** 文件保存为html格式* * @param savePath* @param htmlPath*/public void saveAsHtml(String htmlPath) {Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlPath, new Variant(8) }, new int[1]);}public void saveAsXml() {Dispatch.call(doc, "SaveAs", "E:/bbb.xml", 11);//xml文件格式宏11 }/*** 关闭文档* * @param val*            0不保存修改 -1 保存修改 -2 提示是否保存修改*/public void closeDocument(int val) {Dispatch.call(doc, "Close", new Variant(val));//注 是documents而不是docdocuments = null;doc = null;}/*** 关闭当前word文档* */public void closeDocument() {if (documents != null) {Dispatch.call(documents, "Save");Dispatch.call(documents, "Close", new Variant(saveOnExit));documents = null;doc = null;}}public void closeDocumentWithoutSave() {if (documents != null) {Dispatch.call(documents, "Close", new Variant(false));documents = null;doc = null;}}/*** 保存并关闭全部应用* */public void close() {closeDocument(-1);if (word != null) {
//          Dispatch.call(word, "Quit");word.invoke("Quit", new Variant[] {});word = null;}selection = null;documents = null;ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理}/*** 打印当前word文档* */public void printFile() {if (doc != null) {Dispatch.call(doc, "PrintOut");}}/*** 保护当前档,如果不存在, 使用expression.Protect(Type, NoReset, Password)* * @param pwd* @param type*            WdProtectionType 常量之一(int 类型,只读):*            1-wdAllowOnlyComments  仅批注*            2-wdAllowOnlyFormFields 仅填写窗体*            0-wdAllowOnlyRevisions 仅修订*            -1-wdNoProtection 无保护, *            3-wdAllowOnlyReading 只读* */public void protectedWord(String pwd,String type) {String protectionType = Dispatch.get(doc, "ProtectionType").toString();if (protectionType.equals("-1")) {Dispatch.call(doc, "Protect", Integer.parseInt(type), new Variant(true),pwd);}}/*** 解除文档保护,如果存在* * @param pwd*            WdProtectionType 常量之一(int 类型,只读):*            1-wdAllowOnlyComments  仅批注*            2-wdAllowOnlyFormFields 仅填写窗体*            0-wdAllowOnlyRevisions 仅修订*            -1-wdNoProtection 无保护, *            3-wdAllowOnlyReading 只读* */public void unProtectedWord(String pwd) {String protectionType = Dispatch.get(doc, "ProtectionType").toString();if (!protectionType.equals("0")&&!protectionType.equals("-1")) {Dispatch.call(doc, "Unprotect", pwd);}}/*** 返回文档的保护类型* @return*/public String getProtectedType(){return Dispatch.get(doc, "ProtectionType").toString();}/*** 设置word文档安全级别* * @param value*            1-msoAutomationSecurityByUI 使用“安全”对话框指定的安全设置。*            2-msoAutomationSecurityForceDisable*            在程序打开的所有文件中禁用所有宏,而不显示任何安全提醒。 3-msoAutomationSecurityLow*            启用所有宏,这是启动应用程序时的默认值。*/public void setAutomationSecurity(int value) {word.setProperty("AutomationSecurity", new Variant(value));}/*** 在word中插入标签 labelName是标签名,labelValue是标签值* @param labelName* @param labelValue*/public  void insertLabelValue(String labelName,String labelValue) {Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();if (isExist == true) {Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", labelName).toDispatch();Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();String bookMark1Value = Dispatch.get(range1, "Text").toString();System.out.println("书签内容:"+bookMark1Value);} else {System.out.println("当前书签不存在,重新建立!");//TODO 先插入文字,再查找选中文字,再插入标签this.insertText(labelValue);
//          this.find(labelValue);//查找文字,并选中this.setFont(true, true,true,"102,92,38", "20", "",true);Dispatch.call(bookMarks, "Add", labelName, selection);Dispatch.call(bookMarks, "Hidden", labelName);}}/*** 在word中插入标签 labelName是标签名* @param labelName*/public  void insertLabel(String labelName) {Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();if (isExist == true) {System.out.println("书签已存在");} else {System.out.println("建立书签:"+labelName);Dispatch.call(bookMarks, "Add", labelName, selection);}} /*** 查找书签* @param labelName* @return*/public boolean findLabel(String labelName) {Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();if (isExist == true) {return true;} else {System.out.println("当前书签不存在!");return false;}}/*** 模糊查找书签,并返回准确的书签名称* @param labelName* @return*/public String findLabelLike(String labelName) {Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();int count = Dispatch.get(bookMarks, "Count").getInt(); // 书签数Dispatch rangeItem = null;String lname = "";for(int i=1;i<=count;i++){rangeItem = Dispatch.call(bookMarks, "Item", new Variant(i)).toDispatch();lname = Dispatch.call(rangeItem, "Name").toString();//书签名称if(lname.startsWith(labelName)){//前面匹配
//             return lname.replaceFirst(labelName, "");//返回后面值return lname;}}return "";}/*** 模糊删除书签* @param labelName*/public void deleteLableLike(String labelName){Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();int count = Dispatch.get(bookMarks, "Count").getInt(); // 书签数Dispatch rangeItem = null;String lname = "";for(int i=1;i<=count;i++){rangeItem = Dispatch.call(bookMarks, "Item", new Variant(i)).toDispatch();lname = Dispatch.call(rangeItem, "Name").toString();//书签名称if(lname.startsWith(labelName)){//前面匹配Dispatch.call(rangeItem, "Delete");count--;//书签已被删除,书签数目和当前书签都要相应减1,否则会报错:集合找不到i--;}}}/*** 获取书签内容* @param labelName* @return*/public String getLableValue(String labelName){if(this.findLabel(labelName)){Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", labelName).toDispatch();Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();Dispatch font = Dispatch.get(range1, "Font").toDispatch();Dispatch.put(font, "Hidden", new Variant(false)); //显示书签内容String bookMark1Value = Dispatch.get(range1, "Text").toString();System.out.println("书签内容:"+bookMark1Value);
//            font = Dispatch.get(range1, "Font").toDispatch();
//              Dispatch.put(font, "Hidden", new Variant(true)); //隐藏书签内容return bookMark1Value;}return "";}
}

word转html:

public static void wordToHtml(String docfile, String htmlfile)   {   // 启动word应用程序(Microsoft Office Word 2003)ActiveXComponent app = new ActiveXComponent("Word.Application");System.out.println("*****正在转换...*****");try  {  // 设置word应用程序不可见  app.setProperty("Visible", new Variant(false));  // documents表示word程序的所有文档窗口,(word是多文档应用程序)Dispatch docs = app.getProperty("Documents").toDispatch();  // 打开要转换的word文件Dispatch doc = Dispatch.invoke(   docs,   "Open",   Dispatch.Method,   new Object[] { docfile, new Variant(false), new Variant(true) }, new int[1]).toDispatch();   // 作为html格式保存到临时文件Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {   htmlfile, new Variant(WORD_HTML) }, new int[1]);   // 关闭word文件Dispatch.call(doc, "Close", new Variant(false));   }   catch (Exception e)   {   e.printStackTrace();   }   finally  {   //关闭word应用程序app.invoke("Quit", new Variant[] {});   } System.out.println("*****转换完毕********");}

修改word:

public static void editWord(String docFile) {// 启动word应用程序(Microsoft Office Word 2003)ActiveXComponent app = new ActiveXComponent("Word.Application");System.out.println("*****正在修改...*****");try  { // 设置word应用程序不可见  app.setProperty("Visible", new Variant(false));  // documents表示word程序的所有文档窗口,(word是多文档应用程序)Dispatch docs = app.getProperty("Documents").toDispatch();  // 打开要转换的word文件Dispatch doc = Dispatch.invoke(   docs,   "Open",   Dispatch.Method,   new Object[] { docFile, new Variant(false), new Variant(true) }, new int[1]).toDispatch();   Dispatch selection=app.getProperty("Selection").toDispatch();//获得对Selection组件Dispatch.call(selection, "HomeKey", new Variant(6));//移到开头Dispatch find = Dispatch.call(selection, "Find").toDispatch();//获得Find组件Dispatch.put(find, "Text", "*");       //查找字符串"name"Dispatch.call(find, "Execute");           //执行查询
//            Dispatch.put(selection, "Text", "&");  //替换为&
//            Dispatch.call(doc, "Save");   //保存// 关闭word文件Dispatch.call(doc, "Close", new Variant(false));   }   catch (Exception e)   {   e.printStackTrace();   }   finally  {   //关闭word应用程序app.invoke("Quit", new Variant[] {});   } System.out.println("*****修改完毕********");}

jacob根据word模板生成文相关推荐

  1. java使用POI根据word模板生成文档,并且根据参数值实现换行

    一,word模板如下 二,将word模板中的参数对应的值放到map中 /*** 将word模板中需要的参数值统一放到map中* * @param resource* @param template* ...

  2. 【3】利用Word模板生成文档的总结

    阅读目录 Word二次开发概况 使用DsoFramer进行开发 使用Interop进行开发 打开.关闭和写入操作 批量替换文本 遍历段落替换文本 查找后逐个替换文本 结论 在各类应用系统开发中,和Wo ...

  3. java根据word模板生成文档(含文本替换和动态生成表格)

    开发功能需求:给定word模板,word模板中存在"${XXX}"格式的需要变量替换的一些词,包括直接可以被替换的词,需要循环获取.替换.格式处理的词(例如根据数据库存储内容循环生 ...

  4. Microsoft.Office.Interop.Word通过模板生成文档出现的问题经验总结

    本人在Word 模板导出时存在的问题主要有两个方面(我使用的是办公软件是WPS): 1.在本机可以正常导出,IIS发布后导出失败!报错信息是:检索 COM 类工厂中 CLSID 为 {000209FF ...

  5. 通过Excel+Word批量生成文档及批量提取和修改文档名字

    excel和word是日常的办公软件,最近老师给了我一个任务,任务内容如下: 给了我一个班级同学成绩单excel表格和一个给家长的一封信word模板,在word模板中有相应的成绩表格要填写,即:我要去 ...

  6. java word模板替换多行_Java动态替换word模板的最佳实践

    poi-tl 基于word的模板渲染(替换)组件 对docx格式的文档增加模板语法,增加渲染模板的方便性,目前支持对段落.页眉.页脚.表格的文本.图片.表单渲染. 对于word模板替换,我们不仅要考虑 ...

  7. staruml画的图怎么加载到word_StarUML配置Word生成文档模板

    许多UML建模工具可以自动生成文档,让需求人员.开发人员专心于需求.设计的建模.当然为了能够生成符合自己要求的模板,需对建模时的目录结构(模型和包)有所规划和要求,否则很难生成相应的文档.这要求提前了 ...

  8. Word/WPS 利用邮件合并批量生成文档

    Word/WPS 利用邮件合并批量生成文档 WPS 1. 先找到功能所有位置 2. 准备用于批量生成的数据 3. 插入数据批量生成文档 4. 批量生成文档 插入Next 域 Word 第1步,选择文档 ...

  9. python怎么自动生成文档_用 Python 自动生成 Word 文档

    当然要用第三方库啦 :) 使用以下命令安装: pip install  python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文 ...

最新文章

  1. 合并下载的Solaris镜像为DVD文件的方法
  2. NetBeans 时事通讯(刊号 # 109 - Jul 17, 2010)
  3. 数据结构第二版之(课后题)BF算法病毒感染检测
  4. 如何发现 Redis 热点 Key ,解决方案有哪些?
  5. junit4/5 getDefaultClassLoader()Ljava/lang/ClassLoader;
  6. UBoot讲解和实践-------------讲解(二)
  7. c++ find_last_of 函数应用一个例子
  8. [蓝桥杯][基础练习VIP]分解质因数
  9. MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...
  10. 维度退化(数据仓库)
  11. 辨别Python中load和loads的小技巧
  12. javaScript引入方式
  13. (二)Latex编译与xelatex编译
  14. Redis入门——狂神课程笔记
  15. 学习笔记-Power-Linux
  16. Android开发,app多种语言包
  17. 与蜂窝连接的无人机的空地干扰缓解
  18. 苹果uwb_iPhone11的UWB有什么用?苹果大规模扩展 HomeKit 全靠它
  19. 武汉科技大学计算机科学与技术分数,2019武汉科技大学研究生分数线汇总(含2016-2019历年复试)...
  20. 制作自己的人脸识别系统

热门文章

  1. 普元项目更换服务器,服务器图片普元
  2. 安卓开发良好的习惯(想到就更新)
  3. Python数据分析与挖掘实战学习12
  4. Disturbed People_CodeForces1077B
  5. 更换Latex模板后部分包的参数失效问题的解决方案(如xcolor,algorithm2e)
  6. linux自定义以太网协议_如何压接自己的任意长度的自定义以太网电缆
  7. H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
  8. redhat8安装rpm提示package does not verify: no digest
  9. pc服务器是微型计算机吗,pc和主机的区别是什么?
  10. java8 zoneid_java8之localDateTime, ZoneId, Instant使用