最近项目中要实现读写word文件,于是偶就开始在网上和群里查询和询问,终于找到了个叫做Jacob的组件可以搞定这个问题。
第一步,下载Jacob;地址为:http://sourceforge.net/projects/jacob-project/files/jacob-project/
目前最新的版本为jacob-1.15-M4
第二步,部署Jacob;
a。在Eclipse或Myeclipse中建立一个项目(web或普通的java项目都可):JacobDemo;
b。将下载好的jacob-1.15-M4.zip解压,将jacob.jar导入新建立的项目中;
c。将jacob-1.15-M4-x86.dll或jacob-1.15-M4-x64.dll拷贝到C:\WINDOWS\system32,由于我的电脑比较老所以我拷贝的是jacob-1.15-M4-x86.dll。
第三步,在新建立的项目中建立测试类:WordOperate.java,该文件是我在网上拷贝的,特此声明。
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class WordOperate {
public static void main(String args[]) {
ActiveXComponent wordApp = new ActiveXComponent("Word.Application"); // 启动word
// Set the visible property as required.
Dispatch.put(wordApp, "Visible", new Variant(true));// //设置word可见
Dispatch docs = wordApp.getProperty("Documents").toDispatch();
// String inFile = "d:\\test.doc";
// Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method,
// new Object[] { inFile, new Variant(false), new Variant(false)},//参数3,false:可写,true:只读
// new int[1]).toDispatch();//打开文档
Dispatch document = Dispatch.call(docs, "Add").toDispatch();// create new document
//String userName = wordApp.getPropertyAsString("Username");// 显示用户信息
/*String userName = wordApp.getProperty("Username");// 显示用户信息
System.out.println("用户名:" + userName);*/
// 文档对齐,字体设置////////////////////////
Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch();
Dispatch align = Dispatch.get(selection, "ParagraphFormat")
.toDispatch(); // 行列格式化需要的对象
Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象
// 标题处理////////////////////////
Dispatch.put(align, "Alignment", "1"); // 1:置中 2:靠右 3:靠左
Dispatch.put(font, "Bold", "1"); // 字型租体
Dispatch.put(font, "Color", "1,0,0,0"); // 字型颜色红色
Dispatch.call(selection, "TypeText", "Word文档处理"); // 写入标题内容
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.put(align, "Alignment", "3"); // 1:置中 2:靠右 3:靠左
Dispatch.put(selection, "Text", " ");
Dispatch.call(selection, "MoveDown"); // 光标标往下一行
//表格处理////////////////////////
Dispatch tables = Dispatch.get(document, "Tables").toDispatch();
Dispatch range = Dispatch.get(selection, "Range").toDispatch();
Dispatch table1 = Dispatch.call(tables, "Add", range, new Variant(3),
new Variant(2), new Variant(1)).toDispatch(); // 设置行数,列数,表格外框宽度
// 所有表格
Variant tableAmount = Dispatch.get(tables, "count");
System.out.println(tableAmount);
// 要填充的表格
Dispatch t1 = Dispatch.call(tables, "Item", new Variant(1))
.toDispatch();
Dispatch t1_row = Dispatch.get(t1, "rows").toDispatch();// 所有行
int t1_rowNum = Dispatch.get(t1_row, "count").getInt();
Dispatch.call(Dispatch.get(t1, "columns").toDispatch(), "AutoFit");// 自动调整
int t1_colNum = Dispatch.get(Dispatch.get(t1, "columns").toDispatch(),
"count").getInt();
System.out.println(t1_rowNum + " " + t1_colNum);
for (int i = 1; i <= t1_rowNum; i++) {
for (int j = 1; j <= t1_colNum; j++) {
Dispatch cell = Dispatch.call(t1, "Cell", new Variant(i),
new Variant(j)).toDispatch();// 行,列
Dispatch.call(cell, "Select");
Dispatch.put(selection, "Text", "cell" + i + 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 Range = Dispatch.get(cell, "Range").toDispatch();
String cellContent = Dispatch.get(Range, "Text").toString();
System.out.println((cellContent.substring(0, cellContent
.length() - 1)).trim());
}
Dispatch.call(selection, "MoveDown"); // 光标往下一行(才不会输入盖过上一输入位置)
}
//合并单元格////////////////////////
Dispatch.put(selection, "Text", " ");
Dispatch.call(selection, "MoveDown"); // 光标标往下一行
Dispatch range2 = Dispatch.get(selection, "Range").toDispatch();
Dispatch table2 = Dispatch.call(tables, "Add", range2, new Variant(8),
new Variant(4), new Variant(1)).toDispatch(); // 设置行数,列数,表格外框宽度
Dispatch t2 = Dispatch.call(tables, "Item", new Variant(2))
.toDispatch();
Dispatch beginCell = Dispatch.call(t2, "Cell", new Variant(1),
new Variant(1)).toDispatch();
Dispatch endCell = Dispatch.call(t2, "Cell", new Variant(4),
new Variant(4)).toDispatch();
Dispatch.call(beginCell, "Merge", endCell);
for (int row = 1; row <= Dispatch.get(
Dispatch.get(t2, "rows").toDispatch(), "count").getInt(); row++) {
for (int col = 1; col <= Dispatch.get(
Dispatch.get(t2, "columns").toDispatch(), "count").getInt(); col++) {
if (row == 1) {
Dispatch cell = Dispatch.call(t2, "Cell", new Variant(1),
new Variant(1)).toDispatch();// 行,列
Dispatch.call(cell, "Select");
Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色
Dispatch.put(selection, "Text", "merge Cell!");
} else {
Dispatch cell = Dispatch.call(t2, "Cell", new Variant(row),
new Variant(col)).toDispatch();// 行,列
Dispatch.call(cell, "Select");
Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色
Dispatch.put(selection, "Text", "cell" + row + col);
}
}
Dispatch.call(selection, "MoveDown");
}
//Dispatch.call(selection, "MoveRight", new Variant(1), new Variant(1));// 取消选择
// Object content = Dispatch.get(doc,"Content").toDispatch();
// Word文档内容查找及替换////////////////////////
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.put(align, "Alignment", "3"); // 1:置中 2:靠右 3:靠左
Dispatch.put(font, "Color", 0);
Dispatch.put(selection, "Text", "欢迎,Hello,world!");
Dispatch.call(selection, "HomeKey", new Variant(6));// 移到开头
Dispatch find = Dispatch.call(selection, "Find").toDispatch();// 获得Find组件
Dispatch.put(find, "Text", "hello"); // 查找字符串"hello"
Dispatch.put(find, "Forward", "True");// 向前查找
// Dispatch.put(find, "Format", "True");// 设置格式
Dispatch.put(find, "MatchCase", "false");// 大小写匹配
Dispatch.put(find, "MatchWholeWord", "True"); // 全字匹配
Dispatch.call(find, "Execute"); // 执行查询
Dispatch.put(selection, "Text", "你好");// 替换为"你好"
//使用方法传入的参数parameter调用word文档中的MyWordMacro宏//
//Dispatch.call(document,macroName,parameter);
//Dispatch.invoke(document,macroName,Dispatch.Method,parameter,new int[1]);
//页眉,页脚处理////////////////////////
Dispatch ActiveWindow = wordApp.getProperty("ActiveWindow")
.toDispatch();
Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane")
.toDispatch();
Dispatch View = Dispatch.get(ActivePane, "View").toDispatch();
Dispatch.put(View, "SeekView", "9"); //9是设置页眉
Dispatch.put(align, "Alignment", "1"); // 置中
Dispatch.put(selection, "Text", "这里是页眉"); // 初始化时间
Dispatch.put(View, "SeekView", "10"); // 10是设置页脚
Dispatch.put(align, "Alignment", "2"); // 靠右
Dispatch.put(selection, "Text", "这里是页脚"); // 初始化从1开始
//书签处理(打开文档时处理)////////////////////////
//Dispatch activeDocument = wordApp.getProperty("ActiveDocument").toDispatch();
Dispatch bookMarks = Dispatch.call(document, "Bookmarks").toDispatch();
boolean isExist = Dispatch.call(bookMarks, "Exists", "bookMark1")
.getBoolean();
if (isExist == true) {
Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", "bookMark1")
.toDispatch();
Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();
Dispatch.put(range1, "Text", new Variant("当前是书签1的文本信息!"));
String bookMark1Value = Dispatch.get(range1, "Text").toString();
System.out.println(bookMark1Value);
} else {
System.out.println("当前书签不存在,重新建立!");
Dispatch.call(bookMarks, "Add", "bookMark1", selection);
Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", "bookMark1")
.toDispatch();
Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();
Dispatch.put(range1, "Text", new Variant("当前是书签1的文本信息!"));
String bookMark1Value = Dispatch.get(range1, "Text").toString();
System.out.println(bookMark1Value);
}
//保存操作////////////////////////
Dispatch.call(document, "SaveAs", "D:/wordOperate.doc");
//Dispatch.invoke((Dispatch) doc, "SaveAs", Dispatch.Method, new Object[]{htmlPath, new Variant(8)}, new int[1]); //生成html文件
// 0 = wdDoNotSaveChanges
// -1 = wdSaveChanges
// -2 = wdPromptToSaveChanges
//Dispatch.call(document, "Close", new Variant(0));
// // worddoc.olefunction("protect",2,true,"");
// // Dispatch bookMarks = wordApp.call(docs,"Bookmarks").toDispatch();
// // System.out.println("bookmarks"+bookMarks.getProgramId());
// //Dispatch.call(doc, "Save"); //保存
// // Dispatch.call(doc, "Close", new Variant(true));
// //wordApp.invoke("Quit",new Variant[]{});
// wordApp.safeRelease();//Finalizers call this method
}
}
运行即可看到效果,需要说明的是你的电脑上要安装好word。
异常处理:
如果在运行过程中遇到[JACOB] ------>no jacob in the java.library.path异常,请尝试将 jacob.dll放到System.getProperty("java.library.path")取到的目录下。
分享到:
相关推荐
### Jacob 学习笔记 #### 一、Jacob 概述 Jacob,即 Java COM Bridge,是一种用于连接 Java 应用程序与 COM 组件的技术。它允许开发者利用 Java 的跨平台特性,同时能够调用 Windows 平台上丰富的 COM 接口。这种...
学习jacob的绝对最佳代码。 其中基本包括所有word操作。 有时间大家可以一起交流。
标题中的“jacob.rar 一个64位一个32位”指的是这个压缩包包含了两个版本的JACOB库,一个是适用于64位操作系统的jacob-1.18-x64.dll,另一个是适用于32位操作系统的jacob-1.18-x86.dll。JACOB全称为Java COM Bridge...
#### 一、Jacob简介与工作原理 Jacob,全称为Java-COM Bridge,是一款开源的Java库,旨在为Java程序提供访问Windows COM(Component Object Model)组件的能力。COM是一种由Microsoft开发的对象模型,允许不同编程...
这个压缩包中的“Jacob大全”可能包含所有这些版本的jar包,以及一个详细的使用说明文档,帮助开发者了解如何在项目中集成和使用Jacob。通过选择合适的版本和遵循使用说明,Java开发者可以在Windows环境中充分利用...
下面是一个简单的示例,展示如何使用Jacob创建一个新的Excel工作簿并添加数据: ```java import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public ...
总的来说,JACOB是一个强大的工具,它使得Java开发者可以轻松地集成Office应用程序的功能,而无需深入学习COM编程。不过,由于JACOB是基于COM,所以它仅适用于Windows平台。在实际应用中,需要考虑到兼容性和性能的...
Jacob,全称Java COM Bridge,是一个Java到COM互操作库,允许Java程序调用Windows的COM组件和DLL。本文将详细解析"jacob1.18"和"jacob1.19"这两个版本的特性、使用方法以及它们在Windows环境下的应用。 首先,我们...
**Jacob开发文档与示例详解** ...总的来说,Jacob是Java开发者在处理与Microsoft Office交互任务时的一个强大工具。通过深入理解其工作原理和示例,开发者可以有效地利用这个库在Java项目中实现复杂的文档处理功能。
Jacob是Java和COM之间的一个桥梁,它允许Java代码与Windows平台上的COM组件进行交互。这个工具包包含了两个关键部分:`jacob.dll`和`jacob.jar`。 `jacob.dll`是一个动态链接库(Dynamic Link Library),在Windows...
Jacob是Java和COM之间的一个桥梁,它允许Java应用程序与Windows平台上的COM组件进行交互。这个压缩包"jacob1.19"包含了两个版本的Jacob动态链接库(DLL)文件:jacob-1.19-x64.dll适用于64位系统,而jacob-1.19-x86....
这些文档对于初学者来说尤其重要,因为Jacob的使用涉及到一些COM和Java交互的底层知识,可能需要一定的学习和实践才能掌握。 总的来说,Jacob-1.17-M2是一个强大的工具,它让Java开发者能够方便地利用Windows平台...
例如,通过Jacob,你可以创建一个Excel工作簿,写入数据,然后保存为文件。 3. **多平台支持**:尽管Jacob主要用于Windows环境,但Java的跨平台特性意味着你可以在任何支持Java的平台上构建应用,然后在运行时连接...
而com jacob com中有一个很基础的类com jacob com JacobObject 其中比较常用的两个类com jacob com Dispatch和com jacob com Variant便是继承自它 (com jacob com Dispatch;里面提供了调度MS windows系统API ...
Java采用Jacob调用SAPI实现合成语音是一种在Java应用程序中集成语音合成技术的常见方法。Jacob(Java COM Bridge)是一个开源库,它为Java开发者提供了一个桥梁,让他们能够使用Microsoft的COM(Component Object ...
Java中的Jacob库是一个非常有用的工具,它允许Java应用程序与Windows API进行交互,从而实现许多原本在Java中难以实现的功能,比如自动化Office文档处理、打印、COM组件交互等。标题提到"jacob各个版本好用",这暗示...
**JACOB(Java Advanced COM Bridge)**是一个强大的开源库,允许Java应用程序与COM(Component Object Model)组件进行交互。标题“JACOB各版本下载”表明我们将讨论JACOB的不同版本及其获取途径,而描述则突出了...
Jacob的API文档是学习和使用Jacob的重要资源,它详尽地列出了Jacob提供的所有类、接口及其方法,有助于开发者快速定位所需功能。在开发过程中,开发者可以参考这些文档,了解如何正确创建和操作COM对象,以及如何...