`

jacob操作word参考

阅读更多
package com.report.word;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。
 * 1. word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……以免执行错误的替换。
 * 2. 所有要替换为图片的字段,Key以$image_开头,Value为图片的全路径或链接。
 * 3. 在标签处插入内容,Key为标签名,以Bookmark_开头,假如内容为图片以Bookmark_image_开头
 * 4. 要替换表格中的数据时,HashMap中的Key格式为“$tableN@R”,其中:N代表word模板中的第N张表格,
   R代表从表格的第R行开始替换;Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代
        表一行数据,ArrayList中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第三列、
        第五列的数据,则第一条记录为String[3] {"1","3","5"}
 *
 */
public class Map2Word {

	private boolean saveOnExit;

	/**
	 * word文档
	 */
	private Dispatch doc = null;

	/**
	 * word运行程序对象s
	 */
	private ActiveXComponent word;

	/**
	 * 所有word文档
	 */
	private Dispatch documents;
	
	private boolean isword = true;

	public static Map2Word getInstance() {
		return new Map2Word();
	}

	/**
	 * 构造函数
	 */
	private Map2Word() {
		if (word == null) {
			try {
				word = new ActiveXComponent("Word.Application");
			} catch (Exception e) {
				word = new ActiveXComponent("wps.Application");
				isword = false;
			}
			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 oldText
	 *            String 要替换的文本
	 * @param newText
	 *            String 替换为文本
	 */
	public void replaceAll(Dispatch selection, String oldText, Object replaceObj) {
		// 移动到文件开头
		moveStart(selection);

		if (oldText.startsWith(WordConst.KEY_TABLE) && replaceObj instanceof ArrayList) {
			replaceTable(selection, oldText, (ArrayList) replaceObj);
		} else {
			String newText = (String) replaceObj;
			if (newText == null) {
				newText = "";
			}
			if (oldText.startsWith(WordConst.KEY_IMAGE) && !newText.trim().equals("")) {
				while (find(selection, oldText)) {
					replaceImage(selection, newText);
					Dispatch.call(selection, "MoveRight");
				}
			} else if (oldText.startsWith(WordConst.KEY_BOOKMARK) && !newText.trim().equals("")) {
				replaceBookMark(oldText, newText);
			} else {
				while (find(selection, oldText)) {
					replace(selection, newText);
					Dispatch.call(selection, "MoveRight");
				}
			}
		}
	}

	/**
	 * 全局替换(不替换图片)
	 * 
	 * @param selection
	 *            Dispatch 选定内容或起始插入点
	 * @param oldText
	 *            String 要替换的文本
	 * @param newText
	 *            String 替换为文本
	 */
	public void replaceNoImage(Dispatch selection, String oldText, Object replaceObj) {
		// 移动到文件开头
		moveStart(selection);

		if (oldText.startsWith(WordConst.KEY_TABLE) && replaceObj instanceof ArrayList) {
			replaceTable(selection, oldText, (ArrayList) replaceObj);
		} else {
			String newText = (String) replaceObj;
			if (newText == null) {
				newText = "";
			}
			if (oldText.startsWith(WordConst.KEY_IMAGE) && !newText.trim().equals("")) {
				//nothing to do
			} else if (oldText.startsWith(WordConst.KEY_BOOKMARK) && !newText.trim().equals("")) {
				replaceBookMark(oldText, newText);
			} else {
				while (find(selection, oldText)) {
					replace(selection, newText);
					Dispatch.call(selection, "MoveRight");
				}
			}
		}
	}

	/**
	 * 选定书签名插入内容
	 * 
	 * @param newText
	 *            String 书签名
	 * @param newText
	 *            String 插入内容
	 */
	public void replaceBookMark(String bookMarkKey, String info) {
		Dispatch bookMarks = word.call(doc, "Bookmarks").toDispatch();
		int bCount = Dispatch.get(bookMarks, "Count").getInt();
        boolean bookMarkExist = word.call(bookMarks, "Exists", bookMarkKey).toBoolean();
        if (bookMarkExist) {
            Dispatch rangeItem = Dispatch.call(bookMarks, "Item", bookMarkKey)
                    .toDispatch();
            Dispatch range = Dispatch.call(rangeItem, "Range").toDispatch();
            if (bookMarkKey.startsWith(WordConst.KEY_BOOKMARK_IMAGE)
            		&& (info.startsWith("http://") || info.startsWith("https://"))) {
            	replaceImage(range, info);
            	Dispatch.call(bookMarks, "Add", bookMarkKey, range);
            } else {
            	replace(range, info);
            	Dispatch.call(bookMarks, "Add", bookMarkKey, range);
            }
        } 
	}

	/**
	 * 把选定内容替换为设定文本
	 * 
	 * @param selection
	 *            Dispatch 选定内容
	 * @param newText
	 *            String 替换为文本
	 */
	public void replace(Dispatch selection, String newText) {
		// 设置替换文本
		Dispatch.call(selection, "Delete");
		Dispatch.put(selection, "Text", newText);
	}

	/**
	 * 替换图片
	 * 
	 * @param selection
	 *            Dispatch 图片的插入点
	 * @param imagePath
	 *            String 图片文件(全路径)
	 */
	public void replaceImage(Dispatch selection, String imagePath) {
		Dispatch.call(selection, "Delete");
		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) {
			return;
		}

		// 要填充的列
		String[] cols = (String[]) dataList.get(0);

		// 表格序号
		String tbIndex = tableName.substring(
				tableName.lastIndexOf(WordConst.KEY_TABLE) + WordConst.KEY_TABLE.length(),
				tableName.lastIndexOf(WordConst.KEY_SPILT));
		// 从第几行开始填充
		int fromRow = Integer.parseInt(tableName.substring(tableName.lastIndexOf(WordConst.KEY_SPILT) + 1));
		// 所有表格
		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 saveAsWord(String outputPath) {
		if (isword) {
			Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),
				"FileSaveAs", outputPath);
		} else {
			Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {  
				outputPath, new Variant(0) }, new int[1]);
		}
	}

	/**
	 * 保存文件
	 * 
	 * @param outputPath
	 *            String 输出文件(包含路径)
	 */
	public void saveAsHtml(String outputPath) {
		 /*
	     * new Variant(10)筛选过的网页
	     * new Variant(9) 单个文件网页
	     * new Variant(8) 另存为网页
	     * new Variant(7) 另存为txt格式
	     * new Variant(6) 另存为rtf格式
	     * new Variant(0) 另存为doc格式
	     */
		Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {  
				outputPath, new Variant(10) }, new int[1]);
	}

	/**
	 * 关闭文件
	 * 
	 * @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
	 *            Map 数据包(包含要填充的字段、对应的数据)
	 * @throws Exception 
	 */
	public void generateFile(String inputPath, String outPath, Map data) throws Exception {
		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);

				if (outPath.endsWith(".html")) {
					replaceNoImage(selection, oldText, newValue);
				} else {
					replaceAll(selection, oldText, newValue);
				}
			}

			if (outPath.endsWith(".doc")) {
				saveAsWord(outPath);
			} else if (outPath.endsWith(".html")) {
				saveAsHtml(outPath);
			}
		} catch (Exception e) {
			throw e;
		} finally {
			if (doc != null) {
				close(doc);
			}
		}
	}
	
	/**
	 * 执行VBA方法
	 * @param mothName 方法名
	 */
	public void invokeVBA(String mothName) {
		Dispatch.call(word, "Run", new Variant(mothName));
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) throws Exception {
		Map data = new HashMap();
		// 基本替换
		data.put(WordConst.key("title"), "word模板生成word文档使用说明");
		data.put(WordConst.key("reportdate"), "2014年01月14日");

		// 表格固定方式
		data.put(WordConst.key("table11"), "1");
		data.put(WordConst.key("table12"), "张三");
		data.put(WordConst.key("table13"), "男");
		data.put(WordConst.key("table14"), "180cm");
		data.put(WordConst.key("table21"), "2");
		data.put(WordConst.key("table22"), "李四");
		data.put(WordConst.key("table23"), "女");
		data.put(WordConst.key("table24"), "170cm");

		// 表格动态方式
		List table1 = new ArrayList();
		String[] fieldName1 = { "1", "2", "3", "4" };
		table1.add(fieldName1);
		String[] field11 = { "1", "张三", "男", "180cm" };
		table1.add(field11);
		String[] field21 = { "2", "李四", "女", "170cm" };
		table1.add(field21);
		String[] field31 = { "3", "李四", "女", "170cm" };
		table1.add(field31);
		data.put(WordConst.table(2, 2), table1);
		
		// 图片
		data.put(WordConst.image("test"), "http://news.baidu.com/z/resource/r/image/2014-01-16/9bbfbcafcb085927b47ab341c4272e81.jpg");

		// 书签
		data.put(WordConst.bookmark("test"), "书签1");
		data.put(WordConst.bookmark_image("test"), "http://news.baidu.com/z/resource/r/image/2014-01-16/9bbfbcafcb085927b47ab341c4272e81.jpg");

		Map2Word m2w = Map2Word.getInstance();
		long time1 = System.currentTimeMillis();
		m2w.generateFile("E:/template.doc", "E:/result.doc", data);
		System.out.println("time cost : " + (System.currentTimeMillis() - time1));
	}
}

 

package com.report.word;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class WordConst {

	public static final String KEY_SIGN = "$";
	public static final String KEY_SPILT = "@";
	public static final String KEY_IMAGE = "$image_";
	public static final String KEY_TABLE = "$table";
	public static final String KEY_BOOKMARK = "Bookmark_";
	public static final String KEY_BOOKMARK_IMAGE = "Bookmark_image_";
	
	/**
	 * key转为$key$
	 * @param key
	 * @return
	 */
	public static String key(String key) {
		return KEY_SIGN + key + KEY_SIGN;
	}
	
	/**
	 * key转为$image_key
	 * @param key
	 * @return
	 */
	public static String image(String key) {
		return KEY_IMAGE + key;
	}
	
	/**
	 * 如果table=1,row=2,key转为$table1@2
	 * @param table word模板中第几个表格,从1开始
	 * @param row 表格第几行开始填充数据,从1开始
	 * @return
	 */
	public static String table(int table, int row) {
		return KEY_TABLE + table + KEY_SPILT + row;
	}
	
	/**
	 * key转为Bookmark_key
	 * @param key
	 * @return
	 */
	public static String bookmark(String key) {
		return KEY_BOOKMARK + key;
	}
	
	/**
	 * key转为Bookmark_image_key
	 * @param key
	 * @return
	 */
	public static String bookmark_image(String key) {
		return KEY_BOOKMARK_IMAGE + key;
	}
	
	/**
	 * 自动对map中的key添加$,如$key$
	 * @param data 要生成的map
	 * @return 生成后的map
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static Map generate(Map data) {
		if (data == null || data.size() == 0) {
			return data;
		}
		Map map = new HashMap();
		Set temp = data.keySet();
		for (Object key : temp) {
			map.put(key((String)key), data.get(key));
		}
		return map;
	}
}

 

分享到:
评论

相关推荐

    JACOB Java操作word 优秀

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

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

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

    基于jacob和freeMarker的word导出参考文件

    通过这样的组合,开发者可以在不直接操作Word API的情况下,方便地生成动态的Word文档,尤其适用于批量报告生成或自动化文档处理的场景。 在提供的压缩包文件中,"基于freeMarker和jacob的word导出参考文件"可能...

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

    下面,我们将详细探讨如何使用 Jacob 实现 Word、Excel 和 PowerPoint 文件到 HTML 的转换。 1. **Java 与 Jacob 集成** - 在 Java 项目中引入 Jacob 库,通常需要将 `jacob-x.x.x.dll` 文件放在系统的 PATH 环境...

    Jawin , Jacob 调用word

    5. **Java调用Word示例**:展示使用Jawin和Jacob进行实际操作Word文档的Java代码片段,例如添加文本、插入图片、格式化文档等。 6. **问题解决和最佳实践**:可能包含了开发者在使用这些库时可能遇到的问题及其解决...

    java操作word 封装包+jacob +dll

    Java操作Word封装包结合JACOB与Office_Wrapper库,为开发者提供了在Java环境中与Microsoft Word交互的能力。本文将深入探讨这两个库的工作原理、使用方法以及如何解决在使用过程中遇到的问题。 首先,JACOB(Java...

    jacob开发文档jacob

    在`samples`目录中,通常会包含各种使用Jacob操作Word和Excel的示例代码。这些示例展示了如何: - 创建新文档、打开已有文档。 - 插入文本、图片、表格。 - 读取和修改单元格数据。 - 应用样式和格式。 - 保存和...

    jacob的API,很详细

    Jacob API 的详细文档通常以网页格式呈现,提供了丰富的函数和方法供开发者参考。这些函数和方法是Java程序员访问和控制COM对象的关键。以下是对Jacob API的一些核心概念和技术的深入解析: 1. **Jacob初始化**: ...

    java打印word。jacob.jar包

    JACOB.jar是JACOB库的核心文件,包含了Java对COM接口的封装,使得开发者可以使用Java代码直接操作Word文档。要使用JACOB,首先需要将这个jar包添加到项目的类路径中。在提供的压缩包中,包含的"jacob.jar"就是这个...

    [jacob]---------------->java 实现 word 转换为html jacob

    代码中可能有对Jacob库的导入,以及一系列对Word对象的创建、操作和关闭的操作。 4. **注意事项**: - 使用Jacob进行转换时,必须在运行Java程序的机器上安装与Word文档版本兼容的Microsoft Word。 - Jacob是...

    java如何操作word

    - 使用jacob操作Word时要注意异常处理,因为COM组件的调用可能会抛出异常。 - 调整Word对象和Dispatch对象的生命周期,确保在不再需要时正确释放资源,避免内存泄漏。 10. **灵活性与扩展**: - 上述代码中的`...

    jacob.jar和jacob.dll(配置说明和代码例子)

    这些都可以通过Jacob提供的API来实现,具体方法可以参考Jacob的官方文档或者通过查阅`Dispatch`类的`invoke`方法,根据需要调用对应的Word COM接口。 总结来说,Jacob是一个强大的工具,它使得Java开发者能够利用...

    word转换成html程序及所需jacob架包

    在Java中,由于原生不支持COM接口,JACOB起到了桥梁作用,使得开发者能够调用像Microsoft Office这样的COM对象,例如Word或Excel,来进行自动化操作。 使用JACOB,你可以实现的功能包括但不限于: - 打开、读取和...

    Jacob1.9.zip

    Jacob常用于自动化办公软件操作,如Excel数据处理,Word文档生成等。例如,你可以使用Jacob来读取、修改Excel表格数据,或者创建和编辑Word文档,而无需启动这些应用。 6. 注意事项: - 需要对COM组件有一定的...

    jacob-1.18-M2(含Jacob.jar包以及Jacob.dll文件 说明文档API等)集合

    例如,你可以通过Jacob来操作Excel,Word,甚至使用一些特定的硬件设备驱动。 Jacob.dll文件是Jacob库的本地实现部分,因为Java本身不支持直接调用COM,所以需要这个动态链接库作为桥梁。在这个集合中,提供了32位...

    JacobWord2010-03-31.rar

    标题“JacobWord2010-03-31.rar”和描述中提到的文件名表明,这是一个关于Microsoft Word 2010的教程或参考资料的压缩包,可能包含了由用户“Jacob”创建或整理的文件,日期为2010年3月31日。由于标签与标题相同,...

    Jacob用户指南中文版.chm

    3. **与Word交互**: 使用Jacob操作Word文档,包括打开、创建、保存文档,插入文本,设置样式,处理表格和图片等。 4. **与Excel交互**: 如何读取和写入Excel数据,创建和操作工作表,应用公式,图表处理等。 5. **...

    VBA编程API帮助文档(操作Word)

    本篇将详细讲解使用VBA编程API操作Word的核心概念、常见任务及其实现方法。 一、VBA基础知识 在开始VBA编程之前,我们需要了解一些基本概念,如变量、常量、数据类型、控制结构(如If...Then...Else语句、For循环、...

    jacob-1.18含Jacob.jar包以及Jacob.dll文件 说明文档API

    尽管目前只有英文版,但它是学习和使用Jacob的重要参考资料。 使用Jacob时,开发者可以执行以下操作: - **创建和初始化COM对象**:通过Jacob提供的Java类,可以实例化并初始化COM对象,如Excel、Word等Microsoft ...

    java利用jacob将word转pdf

    虽然jacob转换方法具有一定的局限性,例如对Windows环境的依赖和相对较低的转换效率,但它的出现提供了一种在Java环境下实现Word到PDF转换的可能性,对于需要在Java应用程序中实现此类功能的开发者来说具有一定的...

Global site tag (gtag.js) - Google Analytics