1、jcobjava调用com组件操作word使用总结(jacob)java 2008-12-05 20:58:19 阅读599 评论0 字号:大中小 订阅 .java调用com组件操作word使用总结(jacob)简单描述 在此处输入简单摘要特别声明:使用java-com技术可以完成任何VBA可以完成的office文档操作;一、准备工作 先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自
2、己的贡献。 Jacob下载地址: 我在这里下载了Jacob1.14.3和jacob1.9的版本两个版本这里下载的是目前最新的Jacob1.14.3的Release版。 另外java操作word方式还有(个人认为通过jacob最好,自己可以扩展,网上除poi之外几乎全是java-com技术实现的): (1):Apache POI - Java API To Access Microsoft Format Files(http:/poi.apache.org/);对word处理不够强处理Excel功能可以,但是全是通过java完成的,不需 要com组件支持; (2):java2word 是一个在j
3、ava程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。(好象也是用的java-com技术); (3)web开发语言操作word的功能最好还是用第三方的控件, 看看这个SOAOFFICE,还可以使用js 写VBA呢 二、安装Jacob Jacob的安装非常的简单,我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件,如果是Jacob1.14.3则是jacob-1.14.3-x86.dll(32位,机和jacob-1.14.3-x64.dll(64位)和jac
4、ob.jar两个文件。Jacob.dll直接放到系统的system32文件夹下就行了,连注册都不用的(或者拷贝到jdk或者jre的bin目录下也行,当前测试文件所在的目录也行,就是只要在java.library.path中就可以)。而jacob.jar设置到classpath中去就可以了,或者在IDE开发环境的工程中设置扩展库也一样的,我是这样使用的将jacob-1.14.3-x86.dll或复制到%Tomcat5%bin目录下将jacob.jar复制到%Tomcot5%Sharelib目录下,我使用过程中感觉放到这里是一个最终解决办法,当你放哪都有问题的时候。我这样用之后再没有出过因为系统不
5、一样出现的各种各样的问题,当然你作的是web的项目。 注意使用jacob一写要安装word,我装的word2003,如果是操作word2007就不用jacob了(好像这方面的API)。对jacob.dll几种配置方法 (网上看到):2008-07-31 11:59:49 1、把jacob.dll文件,复制到 windowssystem32 目录下。(注:我用的时候这个方法不能运行)2、 把jacob.dll放入 Javajdk1.5.0_06jrebin目录下.把jacob.jar放入 Javajdk1.5.0_0jrelibext 目录下.可以正常运行。3、把jacob.dll放入 glcs
6、rc目录下.把jacob.jar放入WEB-INFlib目录下,也是可以正常运行。三、使用(以下是我改写的一个word操作类,希望有兴趣的朋友完善,记得发给我一份)/注意java操作word关键是定位操作对象;import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .Variant;/* jacob操作MSword类* author */public class WordBean / word文档private Dispatch doc;/ word运行程序对象private ActiveXComponent word
7、;/ 所有word文档集合private Dispatch documents;/ 选定的范围或插入点private Dispatch selection;private boolean saveOnExit = true;public WordBean()throws Exceptionif (word = null) word = new ActiveXComponent(Word.Application);word.setProperty(Visible, new Variant(false); /不可见打开word word.setProperty(AutomationSecurity
8、, 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 = Dis
9、patch.call(documents, Add).toDispatch();selection = Dispatch.get(word, Selection).toDispatch();/* 打开一个已存在的文档* * param docPath*/public void openDocument(String docPath) closeDocument();doc = Dispatch.call(documents, Open, docPath).toDispatch();selection = Dispatch.get(word, Selection).toDispatch();/*
10、只读 打开一个保护文档,* param docPath-文件全名* param pwd-密码*/public void openDocumentOnlyRead(String docPath, String pwd)throws Exception closeDocument();/ doc = Dispatch.invoke(documents, Open, Dispatch.Method, / new ObjectdocPath, new Variant(false), new Variant(true), new Variant(true), pwd, / new int1).toDis
11、patch();/打开word文件 doc = Dispatch.callN(documents, Open, new ObjectdocPath, new Variant(false), new Variant(true), new Variant(true), pwd, , new Variant(false).toDispatch();selection = Dispatch.get(word, Selection).toDispatch();public void openDocument(String docPath, String pwd)throws Exception clos
12、eDocument(); doc = Dispatch.callN(documents, Open, new ObjectdocPath, new Variant(false), new Variant(false), new Variant(true), pwd).toDispatch();selection = Dispatch.get(word, Selection).toDispatch();/* 把选定的内容或插入点向上移动* * param pos* 移动的距离*/public void moveUp(int pos) if (selection = null)selection
13、= Dispatch.get(word, Selection).toDispatch();for (int i = 0; i pos; i+)Dispatch.call(selection, MoveUp);/* 把选定的内容或者插入点向下移动* * param pos* 移动的距离*/public void moveDown(int pos) if (selection = null)selection = Dispatch.get(word, Selection).toDispatch();for (int i = 0; i pos; i+)Dispatch.call(selection,
14、 MoveDown);/* 把选定的内容或者插入点向左移动* * param pos* 移动的距离*/public void moveLeft(int pos) if (selection = null)selection = Dispatch.get(word, Selection).toDispatch();for (int i = 0; i pos; i+) Dispatch.call(selection, MoveLeft);/* 把选定的内容或者插入点向右移动* * param pos* 移动的距离*/public void moveRight(int pos) if (select
15、ion = null)selection = Dispatch.get(word, Selection).toDispatch();for (int i = 0; i pos; i+)Dispatch.call(selection, MoveRight);/* 把插入点移动到文件首位置* */public void moveStart() if (selection = null)selection = Dispatch.get(word, Selection).toDispatch();Dispatch.call(selection, HomeKey, new Variant(6);/* 从
16、选定内容或插入点开始查找文本* * param toFindText* 要查找的文本* return boolean true-查找到并选中该文本,false-未查找到文本*/SuppressWarnings(static-access)public boolean find(String toFindText) if (toFindText = null | toFindText.equals()return false;/ 从selection所在位置开始查询Dispatch find = word.call(selection, Find).toDispatch();/ 设置要查找的内容
17、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 toFindText*
18、 查找字符串* param newText* 要替换的内容* return*/public boolean replaceText(String toFindText, String newText) if (!find(toFindText)return false;Dispatch.put(selection, Text, newText);return true;/* 全局替换文本* * param toFindText* 查找字符串* param newText* 要替换的内容*/public void replaceAllText(String toFindText, String
19、newText) while (find(toFindText) Dispatch.put(selection, Text, newText);Dispatch.call(selection, MoveRight);/* 在当前插入点插入字符串* * param newText* 要插入的新字符串*/public void insertText(String newText) Dispatch.put(selection, Text, newText);/* * param toFindText* 要查找的字符串* param imagePath* 图片路径* return*/public b
20、oolean replaceImage(String toFindText, String imagePath) if (!find(toFindText)return false;Dispatch.call(Dispatch.get(selection, InLineShapes).toDispatch(),AddPicture, imagePath);return true;/* 全局替换图片* * param toFindText* 查找字符串* param imagePath* 图片路径*/public void replaceAllImage(String toFindText, S
21、tring imagePath) while (find(toFindText) Dispatch.call(Dispatch.get(selection, InLineShapes).toDispatch(),AddPicture, imagePath);Dispatch.call(selection, MoveRight);/* 在当前插入点插入图片* * param imagePath* 图片路径*/public void insertImage(String imagePath) Dispatch.call(Dispatch.get(selection, InLineShapes).t
22、oDispatch(),AddPicture, imagePath);/* 合并单元格* * 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(d
23、oc, 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),
24、 new Variant(secCellColIdx).toDispatch();Dispatch.call(fstCell, Merge, secCell);/* 在指定的单元格里填写数据* * param tableIndex* param cellRowIdx* param cellColIdx* param txt*/public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx,String txt) / 所有表格Dispatch tables = Dispatch.get(doc, Tables).to
25、Dispatch();/ 要填充的表格Dispatch table = Dispatch.call(tables, Item, new Variant(tableIndex).toDispatch();Dispatch cell = Dispatch.call(table, Cell, new Variant(cellRowIdx),new Variant(cellColIdx).toDispatch();Dispatch.call(cell, Select);Dispatch.put(selection, Text, txt); /* 获得指定的单元格里数据* * param tableIn
26、dex* param cellRowIdx* param cellColIdx* return*/ public String getTxtFromCell(int tableIndex, int cellRowIdx, int cellColIdx) / 所有表格Dispatch tables = Dispatch.get(doc, Tables).toDispatch();/ 要填充的表格Dispatch table = Dispatch.call(tables, Item, new Variant(tableIndex).toDispatch();Dispatch cell = Disp
27、atch.call(table, Cell, new Variant(cellRowIdx),new Variant(cellColIdx).toDispatch();Dispatch.call(cell, Select); String ret = ; ret = Dispatch.get(selection, Text).toString();ret = ret.substring(0, ret.length()-1); /去掉最后的回车符;return ret;/* 在当前文档拷贝剪贴板数据* param pos*/public void pasteExcelSheet(String p
28、os) moveStart();if (this.find(pos) Dispatch textRange = Dispatch.get(selection, Range).toDispatch();Dispatch.call(textRange, Paste);/* 在当前文档指定的位置拷贝表格* * param pos* 当前文档指定的位置* param tableIndex* 被拷贝的表格在word文档中所处的位置*/public void copyTable(String pos, int tableIndex) / 所有表格Dispatch tables = Dispatch.get
29、(doc, Tables).toDispatch();/ 要填充的表格Dispatch table = Dispatch.call(tables, Item, new Variant(tableIndex).toDispatch();Dispatch range = Dispatch.get(table, Range).toDispatch();Dispatch.call(range, Copy);if (this.find(pos) Dispatch textRange = Dispatch.get(selection, Range).toDispatch();Dispatch.call(textRange, Paste);/* 在当前文档指定的位
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1