官方网址:http://www.danadler.com/jacob/
下载地址:http://sourceforge.net/projects/jacob-project/
下载 jacob的包。jacob-1.17-M2
一)在电脑上安office2010,安装好以后在注册表HKEY_CLASSES_ROOT\Word.Application,能找到Word.Application才可以在java操作word
二)配置运行环境的三种方法
a)jacob-1.17-M2-x86.dll 文件,加载进系统环境变量 path中。
b)jacob-1.17-M2-x86.dll 文件拷到windows /system32中。
c)jacob-1.17-M2-x86.dll 文件拷到jdk/bin中。
下面的这个例子,表示了,把一些字符串写入到指定的word中.
import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class WordExtractor { // 创建一个组件。 private ActiveXComponent MsWordApp = null; // 建立两个dispath. private Dispatch document = null; private Dispatch selection = null; // 构造函数 public WordExtractor() { super(); } /** * 开启word档案 * @param makeVisible * 显示或是不显示(true:显示;false:不显示) */ public void openWord(boolean makeVisible) { try { // 打开word(如果word未开启时) if (MsWordApp == null) { MsWordApp = new ActiveXComponent("Word.Application"); } // 设置word是可见或不可见(true:显示;false:不显示) Dispatch.put(MsWordApp, "Visible", new Variant(makeVisible)); } catch (RuntimeException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 建立word的文本内容 * */ public void createNewDocument() { // 建立一个Dispatch对象 Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch(); document = Dispatch.call(documents, "Add").toDispatch(); } /** * 格式化时间字符串 * @param date_str * 原始时间字符串 * @return 修改后的字符串 */ public String ReplaceDateStr(String date_str) { String str = ""; String[] date_str_arr = Tool.splitString(date_str, "-"); // String[] date_str_arr =null; if (date_str_arr.length > 0) { str = date_str_arr[0] + "/" + date_str_arr[1] + "/"+ date_str_arr[2]; } else { str = date_str; } return str; } /** * 写入资料到word中 * @param title * 本文标题 * @param textToInsertarr * 要写入的内容数组集合 */ public void insertText(String title, ArrayList textToInsertarr) { selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象 Dispatch alignment = Dispatch.get(selection, "ParagraphFormat") .toDispatch(); // 行列格式化需要的对象 Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象 Dispatch font1 = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象 // Dispatch image = Dispatch.get(selection, // "InLineShapes").toDispatch(); //放入图片需要的对象 // String mm = // "D:"+File.separator+"IRMAS_COMBINE"+File.separator+"images"+File.separator+"mis_login.jpg"; // //图片来源路径 // 格式化时间 java.util.Date ddate = new Date(); SimpleDateFormat sdf2 = new SimpleDateFormat("dd-MM月-yy", java.util.Locale.TRADITIONAL_CHINESE); // oracle要的时间格式 Timestamp ts1 = new Timestamp(ddate.getTime()); String date_str = (ts1.toString()).substring(0, 10); String result_str = ReplaceDateStr(date_str); // 格式化后的时间 2008/04/27 // 文件标题 // Dispatch.call(selection, "TypeParagraph"); //空一行段落 Dispatch.put(alignment, "Alignment", "1"); // (1:置中 2:靠右 3:靠左) Dispatch.put(font1, "Bold", "1"); // 字型租体 Dispatch.put(font1, "Color", "1,0,0,0"); // 字型颜色(1,0,0,0=>红色 // 1,1,0,0=>棕色) // Dispatch.put(font, "Italic", "1"); //字型斜体 Dispatch.call(selection, "TypeText", title); // 写入标题内容 // 标题格行 Dispatch.call(selection, "TypeParagraph"); // 空一行段落 Dispatch.put(alignment, "Alignment", "3"); // (1:置中 2:靠右 3:靠左) Dispatch.put(selection, "Text", " "); Dispatch.call(selection, "MoveDown"); // 游标往下一行 // 插入图片 /* * Dispatch.call(selection, "TypeParagraph"); Dispatch.put(alignment, * "Alignment", "2"); //(1:置中 2:靠右 3:靠左) Dispatch.call(image, * "AddPicture", mm); //写入图片 */ /*--------不输入到表格时------------ //主要内容(即参数数组中的值) for(int i=0;i<textToInsertarr.size();i++) { String arr_tostr = textToInsertarr.get(i).toString(); String arr_substr = arr_tostr.substring(1,arr_tostr.length()-1); //去掉前后'['和']' String[] arr_split = arr_substr.split(","); //字符串数组(在分隔每个元素值) for(int j=0;j<arr_split.length;j++) { //主要内容 Dispatch.call(selection, "TypeParagraph"); Dispatch.put(selection, "Text", arr_split[j]); //写入word的内容 Dispatch.put(font, "Bold", "0"); //字型租体(1:租体 0:取消租体) //Dispatch.put(font, "Italic", "1"); //字型斜体(1:斜体 0:取消斜体) //Dispatch.put(font, "Underline", "1"); //文字加底线(1:加底线 0:不加底线) Dispatch.call(selection, "MoveDown"); //光标往下一行(才不会盖过上一输入的位置) } //每写入一次资料空一行,以区隔之用 Dispatch.call(selection, "TypeParagraph"); Dispatch.put(selection, "Text", " "); Dispatch.call(selection, "MoveDown"); //游标往下一行 } */ // 依参数内的数组元素总个数计算要输入到表格的列数 int all_count = 0; for (int p = 0; p < textToInsertarr.size(); p++) { String arr_tostr = textToInsertarr.get(p).toString(); // 先将数组元素转成字符串 String arr_substr = arr_tostr.substring(1, arr_tostr.length() - 1); // 去掉前后'['和']' String[] arr_split = arr_substr.split(","); // 字符串数组(在分隔每个元素值) int num = arr_split.length; all_count += num; // 累加个数 } // 建立表格 Dispatch tables = Dispatch.get(document, "Tables").toDispatch(); Dispatch range = Dispatch.get(selection, "Range").toDispatch(); Dispatch newTable = Dispatch.call(tables, "Add", range, new Variant(all_count), new Variant(1), new Variant(1)) .toDispatch(); // 设置列数,栏数,表格外框宽度 Dispatch.call(selection, "MoveRight"); // 光标移到最右边 putTxtToCell(font, alignment, 1, 1, 1, textToInsertarr); // 表格内写入内容(从第1列第1栏开始) // mergeCell(1,1,1,all_count,1); //表格合并(从第1列第1栏开始,第X列第1栏结束) // autoFitTable(); //自动调整表格 int count = 0; // 计算合并表格后的列数递增(例如:前五列合并成一列,则往下继续合并时,要考虑加上合并后的那一列) // 依数组笔数合并表格 for (int k = 0; k < textToInsertarr.size(); k++) { String arr_tostr = textToInsertarr.get(k).toString(); // 先将数组元素转成字符串 String arr_substr = arr_tostr.substring(1, arr_tostr.length() - 1); // 去掉前后'['和']' String[] arr_split = arr_substr.split(","); // 字符串数组(在分隔每个元素值) int num = arr_split.length; if (k == 0) { // 第一次合并时,num值不需加前一列 mergeCell(1, k + 1, 1, num, 1); count++; } else { // 第二次合并之后,num值要加前一列,以此类推... mergeCell(1, k + 1, 1, num + count, 1); count++; } } // 取消选择(因为最后insert进去的文字会显示反白,所以要取消) Dispatch.call(selection, "MoveRight", new Variant(1), new Variant(1)); // 插入页首页尾 // 取得活动窗体对象 Dispatch ActiveWindow = MsWordApp.getProperty("ActiveWindow") .toDispatch(); // 取得活动窗格对象 Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane") .toDispatch(); // 取得窗口对象 Dispatch View = Dispatch.get(ActivePane, "View").toDispatch(); // 9是设置页首(游标所在处) Dispatch.put(View, "SeekView", "9"); // 页首中的信息 Dispatch.put(alignment, "Alignment", "2"); // (1:置中 2:靠右 3:靠左) Dispatch.put(selection, "Text", result_str); // 初始化时间 // 10是设置页尾(游标所在处) Dispatch.put(View, "SeekView", "10"); // 页尾中的信息 Dispatch.put(alignment, "Alignment", "1"); // (1:置中 2:靠右 3:靠左) Dispatch.put(selection, "Text", new Variant(1)); // 初始化从1开始 } /** * 合并表格 * * @param tableIndex * 表格起始点 * @param fstCellRowIdx * 开始列 * @param fstCellColIdx * 开始栏 * @param secCellRowIdx * 结束列 * @param secCellColIdx * 结束栏 */ public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx, int secCellRowIdx, int secCellColIdx) { // 所有表格 Dispatch tables = Dispatch.get(document, "Tables").toDispatch(); // 要填充的表格 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) .toDispatch(); Dispatch fstCell = Dispatch.call(table, "Cell", new Variant(fstCellRowIdx), new Variant(fstCellColIdx)) .toDispatch(); Dispatch secCell = Dispatch.call(table, "Cell", new Variant(secCellRowIdx), new Variant(secCellColIdx)) .toDispatch(); Dispatch.call(fstCell, "Merge", secCell); } /** * 在指定的表格里填入内容 * * @param tableIndex * 表格起始点 * @param cellRowIdx * 第几列 * @param cellColIdx * 第几栏 * @param txt * 内容字符串数组 */ public void putTxtToCell(Dispatch font, Dispatch alignment, int tableIndex, int cellRowIdx, int cellColIdx, ArrayList txt) { // 所有表格 Dispatch tables = Dispatch.get(document, "Tables").toDispatch(); // 主要内容(即参数数组中的值) for (int i = 0; i < txt.size(); i++) { String arr_tostr = txt.get(i).toString(); // 先将数组元素转成字符串 String arr_substr = arr_tostr.substring(1, arr_tostr.length() - 1); // 去掉前后'['和']' String[] arr_split = arr_substr.split(","); // 字符串数组(在分隔每个元素值) for (int j = 0; j < arr_split.length; j++) { // 要填入的表格(对表格列依序填入内容),cellRowIdx++代表从第一列开始 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch(); Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx++), new Variant(cellColIdx)) .toDispatch(); // Dispatch.put(cell, "Height",new Variant(1)); //设置列高 Dispatch.call(cell, "Select"); // 主要内容 // Dispatch.call(selection, "TypeParagraph"); //空一行段落 // Dispatch.put(alignment, "Alignment", "3"); //(1:置中 2:靠右 3:靠左) if (j == 0) { Dispatch.put(selection, "Text", arr_split[j]); // 写入word的内容 Dispatch.put(font, "Bold", "1"); // 字型租体(1:租体 0:取消租体) Dispatch.put(font, "Color", "1,1,1,1"); // 字型颜色 // Dispatch.put(font, "Italic", "1"); //字型斜体(1:斜体 0:取消斜体) // Dispatch.put(font, "Underline", "1"); //文字加底线 Dispatch.call(selection, "MoveDown"); // 光标往下一行(才不会输入盖过上一输入位置) } else { if (arr_split[j].indexOf(" ") != -1) { String str = arr_split[j].replaceAll(" ", " "); // 作字符串隔行对齐用 Dispatch.call(selection, "TypeParagraph"); // 空一行段落 Dispatch.put(alignment, "Alignment", "3"); // (1:置中 // 2:靠右 // 3:靠左) Dispatch.put(selection, "Text", str); // 写入word的内容 Dispatch.put(font, "Bold", "0"); // 字型租体(1:租体 0:取消租体) Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色 // Dispatch.put(font, "Italic", "1"); //字型斜体(1:斜体 // 0:取消斜体) // Dispatch.put(font, "Underline", "1"); //文字加底线 Dispatch.call(selection, "MoveDown"); // 光标往下一行(才不会输入盖过上一输入位置) } else { Dispatch.put(selection, "Text", arr_split[j]); // 写入word的内容 Dispatch.put(font, "Bold", "0"); // 字型租体(1:租体 0:取消租体) Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色 // Dispatch.put(font, "Italic", "1"); //字型斜体(1:斜体 // 0:取消斜体) // Dispatch.put(font, "Underline", "1"); //文字加底线 Dispatch.call(selection, "MoveDown"); // 光标往下一行(才不会输入盖过上一输入位置) } } } // 每写入一次资料空一行,以区隔之用 /* * Dispatch.call(selection, "TypeParagraph"); * Dispatch.put(selection, "Text", " "); Dispatch.call(selection, * "MoveDown"); //游标往下一行 */ } } /** * 自动调整表格 */ public void autoFitTable() { Dispatch tables = Dispatch.get(document, "Tables").toDispatch(); int count = Dispatch.get(tables, "Count").toInt(); // word中的表格数量 for (int i = 0; i < count; i++) { Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)) .toDispatch(); Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); Dispatch.call(cols, "AutoFit"); } } /** * 另存档案 * @param filename 要储存的文件名称 */ public void saveFileAs(String filename) { Dispatch.call(document, "SaveAs", filename); } /** * 打印word文件 */ public void printFile() { Dispatch.call(document, "PrintOut"); } /** * 关闭文本内容(如果未开启word编辑时,释放ActiveX执行绪) */ public void closeDocument() { // 0 = 没有储存改变 // -1 = 有储存改变 // -2 = 提示储存改变 Dispatch.call(document, "Close", new Variant(0)); document = null; } /** * 关闭word(如果未开启word编辑时,释放ActiveX执行绪) */ public void closeWord() { Dispatch.call(MsWordApp, "Quit"); MsWordApp = null; document = null; } public static void main(String[] args) { String title = "报告内容"; // 这边的字符串内容仿真从数据库所捞取 ArrayList all_arr = new ArrayList(); ArrayList arr1 = new ArrayList(); ArrayList arr2 = new ArrayList(); ArrayList arr3 = new ArrayList(); ArrayList arr4 = new ArrayList(); ArrayList arr5 = new ArrayList(); arr1.add("一、1111详察具复之 "); arr1.add("总公司>董事长室回复:申覆处理或申述查明情由与"); arr1.add("拟办: 本案拟结案。正在装载数据……1111"); arr2.add("二、金融商品买卖作业1详察具复之"); arr2.add("总公司>董事长室回复:申覆处理或申述查明情由与"); arr2.add("拟办: 本案拟结案。 tttt申覆处理或申述查明情由"); arr3.add("三、CI-101(金融商品买卖作业):详察具复之"); arr3.add("总公司>董事长室回复:申覆处理或申述查明情由与"); arr3.add("拟办: 本案拟结案。 31231"); arr4.add("四、标题详察具复之 "); arr4.add("总公司>董事长室回复:申覆处理或申述查明情由与"); arr4.add("拟办: 本案拟结案。拟办"); arr5.add("五、12312"); arr5.add("拟办: 本案拟结案。碁碁碁佩许功盖"); all_arr.add(arr1); all_arr.add(arr2); all_arr.add(arr3); all_arr.add(arr4); all_arr.add(arr5); // String otFile = // request.getRealPath("/")+"test"+File.separator+"sample"+File.separator+"TestDoc.doc"; // //目标文件位置 String otFile = "C:/Tomcat 6.0/webapps/jacob/test/sampleTestDoc.doc"; WordExtractor word = new WordExtractor(); // 建立一个WordExtractor对象 word.openWord(true); // 设定word开启显示 word.createNewDocument(); // 建立文件内容 word.insertText(title, all_arr); // 要insert入word的内容集合 word.saveFileAs(otFile); // 档案另存 // word.printFile(); } } Tool.java package com.test; public class Tool { public Tool(){ } public static String [] splitString(String str ,String split){ return str.split(split); } }
文章评论