`
jayyanzhang2010
  • 浏览: 377724 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 使用jacob 操作word

 
阅读更多
 /**
	  * word文档
	  */
     Dispatch doc = null;
    
    /**
	 * word运行程序对象s
	 */
     private   ActiveXComponent word;
    /**
	 * 所有word文档
	 */
     private   Dispatch documents;
    
    
     /**
	  * 构造函数
	  */
     public OperatorWordUtilService() {
         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.invoke(documents,"Open",Dispatch.Method,new
			// Object[]{inputDoc},new int[1]).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) throws Exception{
         // 移动到文件开头
         moveStart(selection);
         if(oldText.startsWith("table") || replaceObj instanceof ArrayList){
             replaceTable(selection,(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){
             if(oldText.indexOf("image")!= -1){  
            	 while(find(selection,oldText)) {
                     if(oldText.indexOf("image1")>0){
                    	 replaceImage(selection,newText,500,370);
                     }else{
                    	 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 image = Dispatch.call(
                 Dispatch.get(selection, "InlineShapes").toDispatch(),// InLineShapes是一个类
                 "AddPicture", imagePath).toDispatch();// addpicture是其中的一个方法
     }
     /**
 	 * 替换图片
 	 * @param selection Dispatch 图片的插入点
 	 * @param imagePath String 图片文件(全路径)
 	 * @param width 宽度
 	 * @param height 高度
 	 */
     public void replaceImage(Dispatch selection,String imagePath,float width,float height) {
         Dispatch image = Dispatch.call(
                 Dispatch.get(selection, "InlineShapes").toDispatch(),// InLineShapes是一个类
                 "AddPicture", imagePath).toDispatch();// addpicture是其中的一个方法
         Dispatch.put(image, "Width", new Variant(width));
         Dispatch.put(image, "Height", new Variant(height));
     }
    
   
    /**
 	 * 向表格添加内容
 	 * @param selection   Dispatch 插入点
 	 * @param fields list 数据
 	 */
     public void replaceTable(Dispatch selection,List dataList) throws Exception {
		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
 		Dispatch table = Dispatch.call(tables, "Item", new Variant(1)).toDispatch();
 		Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
 		int rowsCount = Dispatch.get(rows, "Count").getInt();
 		Dispatch Columns = Dispatch.get(table, "Columns").toDispatch();
 		int Columnscount = Dispatch.get(Columns, "Count").getInt();
 		for (int i = 1; i < rowsCount + 1; i++) {
 			for (int j = 2; j < Columnscount + 1; j++) {
 				Dispatch cell = Dispatch.call(table, "Cell", i + "", j + "").toDispatch();
				Dispatch innerTables = Dispatch.get(cell, "Tables").toDispatch();
				int innerTablesCount = Dispatch.get(innerTables, "Count").getInt();
				for(int k=0;k<innerTablesCount;k++){
					Dispatch innerTable = Dispatch.call(innerTables, "Item", new Variant(k+1)).toDispatch();
					Dispatch innerRows = Dispatch.get(innerTable, "Rows").toDispatch();
			 		int innerRowsCount = Dispatch.get(innerRows, "Count").getInt();
			 		Dispatch innerColumns = Dispatch.get(innerTable, "Columns").toDispatch();
			 		int innerColumnscount = Dispatch.get(innerColumns, "Count").getInt();
			 		if(innerColumnscount == 2 && innerRowsCount == 2){
				 		 for (int m = 0; m < dataList.size(); m++) {
					    	    // 某一行数据
					    	    String[] datas = (String[]) dataList.get(m);
					    	    // 在表格中添加一行
					    	    if (innerRowsCount < m+2)
					    	     Dispatch.call(innerRows, "Add");
					    	    // 填充该行的相关列
					    	    for (int n = 0; n < datas.length; n++) {
						    	     // 得到单元格
						    	     Dispatch innerCell = Dispatch.call(innerTable, "Cell",(m+2) + "", (n+1) + "").toDispatch();
						    	     // 选中单元格
						    	     Dispatch.call(innerCell, "Select");
						    	     // 设置格式
						    	     Dispatch font = Dispatch.get(selection, "Font").toDispatch();
						    	     Dispatch.put(font, "Bold", "0");
						    	     Dispatch.put(font, "Italic", "0");
						    	     // 输入数据
						    	     Dispatch.put(selection, "Text", datas[n]);
					    	    }
				    	 }
			 		}
				}
 			}
 		}
 	}
    
 	/**
	 * 保存文件
	 * @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);
         }
     }

 

 

分享到:
评论

相关推荐

    JAVA使用Jacob提取Word信息

    JAVA使用Jacob提取Word信息,一个很好的范例,帮助你简化书写流程

    Jacob操作word 文档的方法集!(含创建目录),使用的Jacob版本是1.5

    在这个“Jacob操作word文档的方法集”中,我们将探讨如何使用Jacob 1.5版本来创建和操作Word文档,特别是创建目录。 首先,为了使用Jacob,你需要在你的项目中添加Jacob的jar文件。这通常涉及到将库添加到项目的类...

    JAVA使用jacob操作MS word

    接下来,我们将介绍如何在Java代码中使用Jacob来操作MS Word: 1. 引入Jacob库:在你的Java项目中,添加Jacob的jar包到类路径中。如果是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;...

    如何利用Java-JACOB操作WORD文档

    本文主要探讨如何使用Java-JACOB来创建和操作Word文档。 首先,使用JACOB之前,确保你的系统中已经安装了Microsoft Office,并且配置了相应的COM组件。JACOB本身是一个开源项目,可以在SourceForge上找到...

    java使用jacob通过word模板生成word文档项目实例

    Java使用Jacob库通过Word模板生成Word文档是一种常见的技术实践,特别是在需要自定义生成大量结构化报告的场景下。本项目实例提供了一个完整的解决方案,可以直接在MyEclipse环境中运行。下面将详细讲解这个项目的...

    jacob 操作word 文档详解

    Jacob 操作 Word 文档详解 Jacob 操作 Word 文档概述 Jacob 是一个 Java 库,用于访问和操作 Microsoft Office ... Jacob 库是一个功能强大且易于使用的库,它可以帮助 Java 开发者快速地实现 Word 文档的操作。

    java通过jacob操作word,原码

    下面将详细阐述如何使用Jacob库在Java中操作Word,并结合描述中的信息,探讨项目的结构和功能。 首先,Jacob库的使用需要在Windows环境下,因为它依赖于COM组件。在Java项目中,你需要添加Jacob的jar文件到类路径中...

    java之jacob实现获取word文件的内容

    读取word文件的内容,并将内容返回为String类型!

    JACOB Java操作word 优秀

    java操作word 超简单实用:第一步: 引入包jacob.jar 第二步:参考工具类MsWordTool.java 含概基本WORD 所有操作方法 【特别难点】解决实例: 1)word书签内容替换后,书签会丢失问题 2)word定点批量插入图片...

    java使用jacob工具操作word文档

    Java是一种广泛使用的编程语言,它在处理各种任务时表现出强大的能力,其中之一就是操作Microsoft Office文档,尤其是Word文档。在Java中,有一种名为JACOB(Java COM Bridge)的库,它允许开发者通过Java代码调用...

    java使用jacob将word,excel,ppt转成html

    Java 使用 Jacob 库将 Office 文件转换为 HTML 是一个常见的需求,尤其在自动化处理文档或在线预览场景中。Jacob(Java and COM Bridge)是一个 Java 库,它允许 Java 应用程序通过 COM(Component Object Model)...

    java通过jacob操作word例子

    下面我们将详细探讨如何使用Java和jacob库来处理Word文档。 首先,`MsWordUtils.java`可能是一个包含具体操作Word文档方法的工具类,例如打开文档、读取内容、修改内容、保存文档等。这些方法通常会利用jacob库提供...

    java操作word:jacob(方法解析+环境配置)

    为了方便地使用Java操作Word文档,可以使用Jacob官方提供的`MSWordManager`类。这个类封装了大多数Java操作Microsoft Office的功能,使得开发者能够更加简单高效地完成任务。 #### 示例代码 以下是一个简化的Java...

    java使用jacob将word 转pdf

    ### Java使用JACOB将Word转为PDF:详解与实践 #### 一、配置环境与原理简介 在Java中利用JACOB库实现Word文档转PDF功能时,首先需要完成必要的环境配置工作。 ##### 1. JACOB库介绍 JACOB(Java COM Bridge)是一...

    jacob操作word文件

    Jacob库在Java中用于操作Microsoft Office应用程序,如Word、Excel等。这个库是Java和COM接口之间的桥梁,允许Java程序能够调用COM组件,从而实现对Office文档的创建、编辑和格式化等功能。在给定的代码片段中,`...

    jacob操作word(超详细)

    2、 把jacob.dll放入 Java\jdk1.5.0_06\jre\bin目录下.把jacob.jar放入 Java\jdk1.5.0_0\jre\lib\ext 目录下.可以正常运行。 3、把jacob.dll放入 \glc\src目录下.把jacob.jar放入WEB-INF\lib目录下,也是可以正常...

    java 使用jacob Word转PDF 完美格式

    本教程将详细介绍如何使用Java结合Jacob库将Microsoft Word文档转换为PDF格式,确保转换后的文件保持原格式的完美性。Jacob是一个Java到COM桥接库,允许Java应用程序访问COM组件,如Microsoft Office。 首先,我们...

    JACOB操作word和excel示例

    本文将深入探讨如何使用Jacob库来操作Word和Excel,通过提供的示例文档,我们将理解如何进行文件转换和其他操作。 首先,Jacob全称为Java COM Bridge,是一个Java到COM(Component Object Model)桥接器,它使得...

Global site tag (gtag.js) - Google Analytics