JACOB(java -com bridge)是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。

一、提取文件地址: https://pan.baidu.com/s/173AJ6zUFka4oXzijTfgKsA

提取码: sjpt

文件结构

二.、jacob-1.19-x64.dll 是用于64位机器上的,jacob-1.19-x86.dll用于32位的。

1.三步操作:

①一般电脑是64位所以我放的位置 C:\Windows\system32

②放置自己的jdk bin包下                 注意:第二步建议放,不放可能会报错

③导入jar包

      <dependency><groupId>com.jacob</groupId><artifactId>jacob</artifactId><version>1.20</version></dependency>

建议包jar包直接放入自己的maven仓库不然会下载不到,反正我是没下载到自己导入进去可能会报错找不到解决办法参考:Maven 手动添加JAR包到本地maven仓库,但在项目中依旧报错找不到JAR包解决方法_qq897958555的博客-CSDN博客

三、测试jacob代码

    public static void main(String[] args) throws Exception {  ActiveXComponent    word = null;  try {  word = new ActiveXComponent("Word.Application");  System.out.println("jacob当前版本:"+word.getBuildVersion());  }catch(Exception e ){  e.printStackTrace();  }  }

做几个测试:

①插入文本

public static void main(String[] args) {//在正式批量跑之前,做单个word文档的测试.WordUtils util = new WordUtils(true);//    util.openDocument("C:\\Users\\Administrator\\Desktop\\test.docx");util.createNewDocument();util.setSaveOnExit(true);util.insertText("move this words\r参数3的内容\n\t换行并首行空两格\t你是好人啊!\n哈哈\t怎么会在这里啊!");util.saveAs("C:\\Users\\Administrator\\Desktop\\test.docx");util.closeDocument();util.exit();}

②:查找指定文本插入指定内容

效果图先附上:

    @Testvoid demo30(){//true会自动打开word文档 false会关闭WordUtils util = new WordUtils(false);util.openDocument("G:\\AA\\aa.docx");util.replaceText("«revision»","张三");util.replaceImage("«audit»","E:\\图片\\10.jpg",50,50);util.setSaveOnExit(true);util.saveAs("G:\\AA\\test.docx");util.closeDocument();util.exit();}

③把word转为pdf储存

public void transformationPdf (){ActiveXComponent app = null;String wordFile = "G:\\AA\\zc.docx";String pdfFile = "G:\\AA\\测试pdf.pdf";System.out.println("开始转换...");// 开始时间long start = System.currentTimeMillis();try {// 打开wordapp = new ActiveXComponent("Word.Application");// 设置word不可见,很多博客下面这里都写了这一句话,其实是没有必要的,因为默认就是不可见的,如果设置可见就是会打开一个word文档,对于转化为pdf明显是没有必要的//app.setProperty("Visible", false);// 获得word中所有打开的文档Dispatch documents = app.getProperty("Documents").toDispatch();System.out.println("打开文件: " + wordFile);// 打开文档Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch();// 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在File target = new File(pdfFile);if (target.exists()) {target.delete();}System.out.println("另存为: " + pdfFile);// 另存为,将文档报错为pdf,其中word保存为pdf的格式宏的值是17Dispatch.call(document, "SaveAs", pdfFile, 17);// 关闭文档Dispatch.call(document, "Close", false);// 结束时间long end = System.currentTimeMillis();System.out.println("转换成功,用时:" + (end - start) + "ms");}catch(Exception e) {e.getMessage();System.out.println("转换失败"+e.getMessage());}finally {// 关闭officeapp.invoke("Quit", 0);}}

WordUtils工具类:建议全部cv

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;public class WordUtils {// word运行程序对象private ActiveXComponent word;// 所有word文档集合private Dispatch documents;// word文档private Dispatch doc;// 选定的范围或插入点private Dispatch selection;// 保存退出private boolean saveOnExit;public WordUtils(boolean visible) {ComThread.InitSTA();//线程启动  if (word == null) {  word = new ActiveXComponent("Word.Application");  word.setProperty("Visible", new Variant(visible)); // 不可见打开word  word.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();}/*** 打开一个已经存在的word文档* * @param docPath*/public void openDocument(String docPath) {doc = Dispatch.call(documents, "Open", docPath).toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开一个有密码保护的word文档* @param docPath* @param password*/public void openDocument(String docPath, String password) {doc = Dispatch.call(documents, "Open", docPath).toDispatch();unProtect(password);selection = Dispatch.get(word, "Selection").toDispatch();}/*** 去掉密码保护* @param password*/public void unProtect(String password){try{String protectionType = Dispatch.get(doc, "ProtectionType").toString();if(!"-1".equals(protectionType)){Dispatch.call(doc, "Unprotect", password);}}catch(Exception e){e.printStackTrace();}}/*** 添加密码保护* @param password*/public void protect(String password){String protectionType = Dispatch.get(doc, "ProtectionType").toString();if("-1".equals(protectionType)){Dispatch.call(doc, "Protect",new Object[]{new Variant(3), new Variant(true), password});}}/*** 显示审阅的最终状态*/public void showFinalState(){Dispatch.call(doc, "AcceptAllRevisionsShown");}/*** 打印预览:*/public void printpreview() {Dispatch.call(doc, "PrintPreView");}/*** 打印*/public void print(){Dispatch.call(doc, "PrintOut");}public void print(String printerName) {word.setProperty("ActivePrinter", new Variant(printerName));print();}/*** 指定打印机名称和打印输出工作名称* @param printerName* @param outputName*/public void print(String printerName, String outputName){word.setProperty("ActivePrinter", new Variant(printerName));Dispatch.call(doc, "PrintOut", new Variant[]{new Variant(false), new Variant(false), new Variant(0), new Variant(outputName)});}/*** 把选定的内容或插入点向上移动* * @param pos*/public void moveUp(int pos) {move("MoveUp", pos);}/*** 把选定的内容或者插入点向下移动* * @param pos*/public void moveDown(int pos) {move("MoveDown", pos);}/*** 把选定的内容或者插入点向左移动* * @param pos*/public void moveLeft(int pos) {move("MoveLeft", pos);}/*** 把选定的内容或者插入点向右移动* * @param pos*/public void moveRight(int pos) {move("MoveRight", pos);}/*** 把选定的内容或者插入点向右移动*/public void moveRight() {Dispatch.call(getSelection(), "MoveRight");}/*** 把选定的内容或者插入点向指定的方向移动* @param actionName* @param pos*/private void move(String actionName, int pos) {for (int i = 0; i < pos; i++)Dispatch.call(getSelection(), actionName);}/*** 把插入点移动到文件首位置*/public void moveStart(){Dispatch.call(getSelection(), "HomeKey", new Variant(6));}/*** 把插入点移动到文件末尾位置*/public void moveEnd(){Dispatch.call(getSelection(), "EndKey", new Variant(6));}/*** 插入换页符*/public void newPage(){Dispatch.call(getSelection(), "InsertBreak");}public void nextPage(){moveEnd();moveDown(1);}public int getPageCount(){Dispatch selection = Dispatch.get(word, "Selection").toDispatch();return Dispatch.call(selection,"information", new Variant(4)).getInt();}/*** 获取当前的选定的内容或者插入点* @return 当前的选定的内容或者插入点*/public Dispatch getSelection(){if (selection == null)selection = Dispatch.get(word, "Selection").toDispatch();return selection;}/*** 从选定内容或插入点开始查找文本* @param findText 要查找的文本* @return boolean true-查找到并选中该文本,false-未查找到文本*/public boolean find(String findText){if(findText == null || findText.equals("")){return false;}// 从selection所在位置开始查询Dispatch find = Dispatch.call(getSelection(), "Find").toDispatch();// 设置要查找的内容Dispatch.put(find, "Text", findText);// 向前查找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 findText* @param newText* @return boolean true-查找到并替换该文本,false-未查找到文本*/public boolean replaceText(String findText, String newText){moveStart();if (!find(findText))return false;Dispatch.put(getSelection(), "Text", newText);return true;}/*** 进入页眉视图*/public void headerView(){//取得活动窗体对象   Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();   //取得活动窗格对象   Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();   //取得视窗对象   Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", "9");}/*** 进入页脚视图*/public void footerView(){//取得活动窗体对象   Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();   //取得活动窗格对象   Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();   //取得视窗对象   Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", "10");}/*** 进入普通视图*/public void pageView(){//取得活动窗体对象   Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();   //取得活动窗格对象   Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();   //取得视窗对象   Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", new Variant(0));//普通视图}/*** 全局替换文本* @param findText* @param newText*/public void replaceAllText(String findText, String newText){int count = getPageCount();for(int i = 0; i < count; i++){headerView();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveEnd();}footerView();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}pageView();moveStart();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}nextPage();}}/*** 全局替换文本* @param findText* @param newText*/public void replaceAllText(String findText, String newText, String fontName, int size){/****插入页眉页脚*****/  //取得活动窗体对象   Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();   //取得活动窗格对象   Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();   //取得视窗对象   Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();   /****设置页眉*****/  Dispatch.put(view, "SeekView", "9");  while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}/****设置页脚*****/  Dispatch.put(view, "SeekView", "10");while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}Dispatch.put(view, "SeekView", new Variant(0));//恢复视图moveStart();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);putFontSize(getSelection(), fontName, size);moveStart();}}/*** 设置选中或当前插入点的字体* @param selection* @param fontName* @param size*/public void putFontSize(Dispatch selection, String fontName, int size){Dispatch font = Dispatch.get(selection, "Font").toDispatch();Dispatch.put(font, "Name", new Variant(fontName));Dispatch.put(font, "Size", new Variant(size));}/*** 在当前插入点插入字符串*/public void insertText(String text){Dispatch.put(getSelection(), "Text", text);}/*** 将指定的文本替换成图片* @param findText* @param imagePath* @return boolean true-查找到并替换该文本,false-未查找到文本*/public boolean replaceImage(String findText, String imagePath, int width, int height){moveStart();if (!find(findText))return false;Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveRight();return true;}/*** 全局将指定的文本替换成图片* @param findText* @param imagePath*/public void replaceAllImage(String findText, String imagePath, int width, int height){moveStart();while (find(findText)){Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveStart();}}/*** 在当前插入点中插入图片* @param imagePath*/public void insertImage(String imagePath, int width, int height){Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveRight();}/*** 在当前插入点中插入图片* @param imagePath*/public void insertImage(String imagePath){Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath);}/*** 获取书签的位置* @param bookmarkName* @return 书签的位置*/public Dispatch getBookmark(String bookmarkName){try{Dispatch bookmark = Dispatch.call(this.doc, "Bookmarks", bookmarkName).toDispatch();return Dispatch.get(bookmark, "Range").toDispatch();}catch(Exception e){e.printStackTrace();}return null;}/*** 在指定的书签位置插入图片* @param bookmarkName* @param imagePath*/public void insertImageAtBookmark(String bookmarkName, String imagePath){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null)Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath);}/*** 在指定的书签位置插入图片* @param bookmarkName* @param imagePath* @param width* @param height*/public void insertImageAtBookmark(String bookmarkName, String imagePath, int width, int height){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null){Dispatch picture = Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));}}/*** 在指定的书签位置插入文本* @param bookmarkName* @param text*/public void insertAtBookmark(String bookmarkName, String text){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null)Dispatch.put(dispatch, "Text", text);}/*** 文档另存为* @param savePath*/public void saveAs(String savePath){Dispatch.call(doc, "SaveAs", savePath);}/*** 文档另存为PDF* <b><p>注意:此操作要求word是2007版本或以上版本且装有加载项:Microsoft Save as PDF 或 XPS</p></b>* @param savePath*/public void saveAsPdf(String savePath){Dispatch.call(doc, "SaveAs", new Variant(17));}/*** 保存文档* @param savePath*/public void save(String savePath){Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),"FileSaveAs", savePath);}/*** 关闭word文档*/public void closeDocument(){if (doc != null) {Dispatch.call(doc, "Close", new Variant(saveOnExit));doc = null;}}/*** 退出word文档*/public void exit(){word.invoke("Quit", new Variant[0]);  }
}

Java对Word文档进行操作相关推荐

  1. java对word文档的操作

    springmvc controller层 类在org.apache.poi.xwpf包下 POI在读写word docx文件时是通过xwpf模块来进行的,其核心是XWPFDocument.一个XWP ...

  2. java用poi导出word,Java使用POI导出Word文档的操作教程,poiword

    Java使用POI导出Word文档的操作教程,poiword 一.主要pom依赖 org.apache.poi poi-ooxml 3.16 二.需要导出word模板 三.相关导出代码 package ...

  3. 【使用分享】一文掌握Aspose.Words for Java,实现Word文档的生成与操作

    Aspose.Words for Java是一个功能强大的Java Word文档处理组件,支持文档的生成.修改.转换.渲染等功能.本文将为您全面介绍Aspose.Words的主要功能与用法. 一.文档 ...

  4. 使用java将word文档docx,doc(包含图形,文本框)完美转换成所有格式图片(pdf,png,gif,jpeg等等)

    使用java将word文档docx,doc(包含图形,文本框,图片等)完美转换成所有格式图片(pdf,png,gif,jpeg等等)下文中附带代码,效果图等 思路 使用到的包 实现代码 效果图: 思路 ...

  5. [摘]用Java生成Word文档

    开发中隔三叉五的就要用到Word,经常被搞得不胜其烦,不过这次找到了不少好例子,干脆将他们都摘了过来,内容如下: 1. poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这 ...

  6. Word处理控件Aspose.Words功能演示:用Java从Word文档中提取文本

    Aspose.Words For .NET是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsof ...

  7. Word处理控件Aspose.Words功能演示:使用 Java 将 Word 文档转换为 Markdown

    大多数智能设备,如智能手机.平板电脑.笔记本电脑等,都支持EPUB格式来查看或阅读文档.它是电子书或电子出版物的常用格式.另一方面,MS Word 格式,如DOCX.DOC等,是数字世界中广泛使用的文 ...

  8. 用java生成word文档(转载)

    用java生成word文档 poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: 下载经过封装后的poi包: 这个包就是:tm-extrac ...

  9. java读写word文档,完美解决方案

    java读写word文档,完美解决方案 java2word 是一个在java程序中调用 MS Office Word 文档的组件(类库).该组件提供了一组简单的接口,以便java程序调用他的服务操作W ...

最新文章

  1. java 关闭oracle连接_Java应用中Oracle连接不关闭
  2. linux内核网络协议栈--数据包的发送过程(二十一)
  3. vim删除文件第n行到结尾、或某段内容
  4. 什么是字节码,采用字节码的好处是什么
  5. linux服务器部署laravel出现putenv() has been disabled for security reasons
  6. (转)Android--sharepreference总结
  7. Redhat/CentOS修改主机名
  8. RainMeter学习1
  9. 附近的人实现原理详细剖析!
  10. [白话解析]以水浒传为例学习隐马尔可夫模型
  11. Clean Code 读书笔记四
  12. 李沐动手学深度学习第四章-4.9.环境和分布偏移
  13. 开放平台与WeCube开源
  14. 微信小程序自定义card图文组件
  15. Spark任务的某个Stage卡住不动问题
  16. 思科模拟器 | 交换机的vlan配置和truck配置
  17. 云服务器vCPU与物理CPU关系
  18. VB6.0代码中,有关字符串
  19. 绝对路径 和 相对路径(C语言 )
  20. 华为Eudemon 100E的密码恢复

热门文章

  1. WZOI-261疯狂吃鸡腿2
  2. IEC60958和IEC61937
  3. kvm直通sata_将双系统塞入A4主机:OSX-KVM 显卡直通教程
  4. 为什么php不开源,php开不开源
  5. vcs import src < ros2.repos失败
  6. 数据分析(1):对比分析法
  7. jCarouselLite——传送带(多图)
  8. golang基础教程
  9. 记录一次Excel表格的误删恢复操作,WPS版
  10. 无人机测量技术在房地一体项目中的应用