jacob操作word(转载)
基于JACOB的WORD文档操作技术
龙源期刊网
基于JACOB的WORD文档操作技术
作者:车晓波闫旭琴刘晓建
来源:《科技创新导报》2013年第04期
在项目实施中,常常需要将系统运行结果、工程设计方案或者自定义内容作为WORD文档输出,以方便用户查看。
单纯依靠人工编写项目报告、填写设计内容不仅工作量大,而且容易出错。
因此,规范准确的WORD文档自动生成功能具有重要的应用价值。
由于WORD文档使用了复合文档格式,这种文档不能通过类似调用普通的文件操作函数来进行操作。
不少技术人员在WORD文档的控制方法上进行了探讨,文献中介绍了在VC++平台下使用COM技术调用OLE自动化对象,一般是通过加载OFFICE自带的对象库创建内部组件对象,通过对这些对象的操作实现WORD的自动化。
文献介绍了如何通过VC++调用VBA将报表内容输出到WORD应用程序中。
文献介绍了在JAVA中运用JACOB和基于COM组件的数据源之间的数据结构转换。
诸多文献讲述了在VC++平台下实现WORD自动化的操作,而在JAVA平台下进行WORD自动化的介绍并不多见,JAVA语言自面世以来,因其平台的独立性、安全性、
面向对象及多线程等特征,得到了广泛的应用。
该文将介绍一种通过JACOB创建COM对象来操作WORD文档的方法,实现了文档的自动生成,可以在制作复杂报表方面取得较好效果,充分体现了JAVA作为开发工具良好的可扩展性。
jacob操作word excel
jacob操作word excel项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:一、了解Jacob先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com 的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。
这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。
下载地址:/project/showfiles.php?group_id=109543&package_ id=118368二、Jacob安装1、我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件2、将压缩包解压后,Jacob.jar添加到Libraries中;3、将Jacob.dll放至“WINDOWS\SYSTEM32”下面。
需要注意的是:【使用IDE启动Web服务器时,系统读取不到Jacob.dll,例如用MyEclipse启动Tomcat,就需要将dll文件copy到MyEclipse安装目录的“jre\bin”下面。
一般系统没有加载到Jacob.dll文件时,报错信息为:“ng.UnsatisfiedLinkError: no jacob in java.library.path”】三、使用Jacob转换Word,Excel为HTMLJAVA代码:Java代码1.import java.io.BufferedReader;2.import java.io.BufferedWriter;3.import java.io.File;4.import java.io.FileInputStream;5.import java.io.FileNotFoundException;6.import java.io.FileWriter;7.import java.io.IOException;8.import java.io.InputStreamReader;9.10.import com.jacob.activeX.ActiveXComponent;11.import .Dispatch;12.import .Variant;13.14.public class TransformFiletoHtml15.{16. int WORD_HTML = 8;17. int WORD_TXT = 7;18. int EXCEL_HTML = 44;19.20. /**21. * WORD转HTML22. * @param docfile WORD文件全路径23. * @param htmlfile 转换后HTML存放路径24. */25. public void wordToHtml(String docfile, String htmlfile)26. {27. ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word28. try29. {30. app.setProperty("Visible", new Variant(false));31. Dispatch docs = app.getProperty("Documents").toDispatch();32. Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { docfile, new Variant(false),new Variant( true) }, new int[1]).toDispatch();33. Dispatch.invoke(doc, "SaveAs", Dispatch.Method, newObject[] {htmlfile, new Variant(WORD_HTML) }, new int[1]);34. Variant f = new Variant(false);35. Dispatch.call(doc, "Close", f);36. }37. catch (Exception e)38. {39. e.printStackTrace();40. }41. finally42. {43. app.invoke("Quit", new Variant[] {});44. }45. }46.47. /**48. * EXCEL转HTML49. * @param xlsfile EXCEL文件全路径50. * @param htmlfile 转换后HTML存放路径51. */52. public void excelToHtml(String xlsfile, String htmlfile)53. {54. ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动excel55. try56. {57. app.setProperty("Visible", new Variant(false));58. Dispatch excels = app.getProperty("Workbooks").toDispatch();59. Dispatch excel = Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[] { xlsfile, new Variant(false),new Vari ant(true) }, new int[1]).toDispatch();60. Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(EXCEL_HTML) }, new int[1]);61. Variant f = new Variant(false);62. Dispatch.call(excel, "Close", f);63. }64. catch (Exception e)65. {66. e.printStackTrace();67. }68. finally69. {70. app.invoke("Quit", new Variant[] {});71. }72. }73.74. /**75. * /删除指定文件夹76. * @param folderPath 文件夹全路径77. * @param htmlfile 转换后HTML存放路径78. */79. public void delFolder(String folderPath)80. {81. try82. {83. delAllFile(folderPath); //删除完里面所有内容84. String filePath = folderPath;85. filePath = filePath.toString();86. java.io.File myFilePath = new java.io.File(filePath);87. myFilePath.delete(); //删除空文件夹88. } catch (Exception e) {e.printStackTrace();}89. }90.91. /**92. * /删除指定文件夹下所有文件93. * @param path 文件全路径94. */95. public boolean delAllFile(String path)96. {97. boolean flag = false;98. File file = new File(path);99. if (!file.exists())100. {101. return flag;102. }103. if (!file.isDirectory())104. {105. return flag;106. }107. String[] tempList = file.list();108. File temp = null;109. for (int i = 0; i < tempList.length; i++) 110. {111. if (path.endsWith(File.separator)) 112. {113. temp = new File(path + tempList[i]); 114. }115. else116. {117. temp = new File(path + File.separator + tempList[i]);118. }119. if (temp.isFile())120. {121. temp.delete();122. }123. if (temp.isDirectory())124. {125. delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件126. delFolder(path + "/" + tempList[i]);//再删除空文件夹127. flag = true;128. }129. }130. return flag;131. }132.}调用JAVA代码:Java代码1.public class Test1 {2. public static void main(String[] args) {3. // TODO Auto-generated method stub4. TransformFiletoHtml trans = new TransformFiletoHtml();5. trans.wordToHtml("D:\\sinye.doc", "D:\\sinye.html");6. }7.8.}只写了一个测试word转html的,excel转html的同理,在TransformFiletoHtml 类中,写了两个方法,一个是删除文件夹的方法(delFolder()),一个是删除文件夹下所有文件的方法(delAllFile())。
Jacob操作office文档
Jacob操作office文档dispatchdocs=app.getproperty(\doc=dispatch.invoke(docs,\newobject[]{srcfilepat h,新变体(错误),newvariant(true),//是否只读newvariant(false),newvariant(\newint[1]).todispatch();//调度。
Put(DOC,\//兼容性检查。
具体值false不正确dispatch.put(doc,\派遣调用(doc,\pdffilepath,wdformatpdf);//Word保存为PDF宏,值为17if(doc!=null){派遣打电话(医生,\}if(app!=null){应用程序。
调用(\}jacob操作pptdispatchppts=app。
getproperty(\//因power.exe的发布规则为同步,所以设置为同步发布ppt=dispatch.call(ppts,\true,//untitled指定文件是否有标题false//withwindow指定文件是否可见).todispatch();派遣呼叫(ppt、\pdffilepath、ppsaveaspdf);//Ppsaveaspdf是32的特定值if(ppt!=null){派遣电话(ppt,\}if(app!=null){应用程序。
调用(\}jacob操作excelimportjava。
伊奥。
objectinputstream。
格特菲尔德;importjava。
util。
arraylist;importjava。
util。
日期importjava。
util。
列表publicclassready{privatedispatchsheets=null;//获取图纸集合对象privatedispatchcurrentsheet=null//当前图纸/***打开excel文件*@Paramfilepath文件路径名*@paramvisible显示打开*@paramreadonly是否只读方式打开*/privatevoidopenexcel(stringfilepath,booleanvisible){try{xl.setproperty(\设置是否显示打开excelif(workbooks==null)工作簿=xl。
Jacob操作Word详细教程
Jacob操作Word详细教程博客分类:java技术JavaTomcatQQ应用服务器F#首先,大家先要了解一下jacob ,官方的解释是Java COM Bridge,即java和 com组件间的桥梁,这里说说为什么我们用jacob操纵word。
而不直接使用java去做?这要原因:在Java开源世界没有很好工具来操作Word文档,POI对word操作还是很不完善,所以我们无法使用它很方便操作word文档来满足我们需求。
相比之下使用jacob操作word文档非常方便。
也比较容易。
jacob 下载地址:/jacob/这个网址还可以下载到源码和例子程序jacob 使用方法:将jacob1.7里面jacob.jar添加到我们应用程序环境中,并将 jacob.dl(l就是我前面说的com组件)把放到c:/windows/system32下。
如果是web环境中,需要将jacod.jar放到Tomcat的lib目录下.(如果用Tomcat服务器)值得注意的是,不同的版本的系统使用不同的dll文件所以如果你编译成功,但运行失败一般是dll文件问题遇到这种情况,可以到/jacob-project/jacob_1.9.zip?modtime= 1109437002&big_mirror=0下载其他的版本的 dll 文件。
下面这段程序是我在别人代码基础上进行一些改进(增加了一些新方法,渴望各位同行批评指正)Java代码1.package com.bperp.word.util;2.3.import java.io.BufferedInputStream;4.import java.io.BufferedOutputStream;5.import java.io.File;6.import java.io.FileInputStream;7.import java.io.FileOutputStream;8.import java.io.InputStream;9.import java.io.OutputStream;10.import java.text.SimpleDateFormat;11.import java.util.ArrayList;12.import java.util.Date;13.import java.util.HashMap;14.import java.util.Iterator;15.import java.util.List;16.import java.util.Map;17.import java.util.Set;18.19.public class WordWriter {20.21. private WordOperator word;22.23. public WordWriter(String filePath){24. word=new WordOperator();25. word.openDocument(filePath);26. }27.28. public WordWriter(InputStream input,String filePath,StringfileName) throws Exception{29. String path=saveAsDocFile(input,filePath,fileName);30. word=new WordOperator();31. word.openDocument(path);32. }33. /**34. * 将word文档输入流保存为本地得到word文件35. * @param input36. * @param filePath37. * @param fileName38. * @throws Exception39. */40. @SuppressWarnings("unused")41. private String saveAsDocFile(InputStream input,String filePath,String fileName)throws Exception{42. if(!StringUtils.isValidateString(filePath)||!StringUtils.isValidateString(fileName)){43. throw new Exception("The filePath or fileName is error");44. }45. if(input==null){46. throw new Exception("InputStream is null");47. }48. File file=new File(filePath);49.50. if(!file.exists()){51. throw new Exception(" The FilePath is null");52. }53. filePath = validateFilePath(filePath);54. fileName = getRandomFileName(fileName);55. InputStream in=null;56. OutputStream out=null;57. try{58. in=new BufferedInputStream(input);59. out=new BufferedOutputStream(new FileOutputStream(filePath+fileName));60. byte[] b=new byte[1024];61. for(int p=0; (p=in.read(b))!=-1;){62. out.write(b);63. out.flush();64. }65. }finally{66. if(out!=null){67. out.close();68. }69. if(in!=null){70. in.close();71. }72. }73. return filePath+fileName;74. }75. /**76. * 验证Word文件路径77. * @param filePath78. * @return79. */80. private String validateFilePath(String filePath) {81. if((stIndexOf("\\\\")==-1)&&(stIndexOf("/")==-1)){82. filePath=filePath+"/";83. }84. return filePath;85. }86. /**87. * 生成一个新的文件名(保证文件名不相同)88. * @param fileName89. * @return90. */91. private String getRandomFileName(String fileName) {92. fileName= fileName + "_"+ new SimpleDateFormat("yyyyMMddHHmmssZ").format(new Date())+".doc";93. return fileName;94. }95. /**96. * replaceText97. * @param map98. */99. public void replaceAllText(Map<String,String> map){ 100. if(map==null){101. return;102. }103. Set<String> keys=map.keySet();104. Iterator<String> it=keys.iterator();105. while(it.hasNext()){106. String key=it.next();107. word.replaceAllText(key, map.get(key)); 108. }109. }110. /**111. * add details112. * @param values113. */114. public void insertContextInRow(List<Map<String,String> > values,int tableIndex){115. if(tableIndex<=1){116. tableIndex=1;117. }118. if(values==null||values.size()<=0){119. return;120. }121. int[] p=null;122. Map<String,String> m=values.get(0);123. Set<String> keys=m.keySet();124. Iterator<String> it=keys.iterator();125. while(it.hasNext()){126. String str=it.next();127.128. int[] a=word.getTableCellPostion(str, tableInd ex);129. if(a!=null&&a[0]!=0){130. p=a;131. }132.133. }134. if(p!=null&&p[0]!=0){135. for(int i=1;i<values.size();i++){136. word.addTableRow(tableIndex,p[0]);//在表格插入行数137. }138. }139.140. Iterator<String> it2=keys.iterator();141. while(it2.hasNext()){142. int row=p[0];143. int col=0;144. String str=it2.next();145.146. int[]a=word.getTableCellPostion(str, tableInde x);147. if(a!=null){148. col=a[1];149. }150. for(Map<String,String> map:values){151. word.putTxtToCell(tableIndex, row, col, ma p.get(str));152. row++;153. }154. }155.156. }157.158. /**159. * close document160. */161. public void close(){162. word.closeDocument();163. word.close();164. }165. /**166. * 依据Word文件完整路径删除文件167. * @param path168. * @throws Exception169. */170. public void deleteWordFile(String path) throws Excepti on{171. File f=new File(path);172. if(!f.exists()){173. throw new Exception("The file is not exists");174. }175. f.delete();176. }177.178. /**179. *180. * @param args181. * @throws Exception182. */183. public static void main(String args[]) throws Exceptio n{184. InputStream in=new FileInputStream("d:\\aaa.doc");185. String path="d:\\qq";186. String fileName="aaa";187. WordWriter writer=new WordWriter(in,path,fileName) ;188. Map<String,String> map1=new HashMap<String,String> ();189. map1.put("p21", "上海商哲");190. map1.put("p12", "1550");191. writer.replaceAllText(map1);192. List<Map<String,String>> values =new ArrayList<Map <String,String>>();193. for(int i=0;i<10;i++){194. Map<String,String> map=new HashMap<String,String>( );195. map.put("$1", "111111111111");196. map.put("$2", "222222222222");197. map.put("$3", "333333333333");198. map.put("$4", "444444444444");199. map.put("$5", "555555555555");200. map.put("$6", "666666666666");201. values.add(map);202. }203. writer.insertContextInRow(values, 1);204. writer.close();205. }206.}。
【jacobword】使用jacob,合并多个word为一个word文件
【jacobword】使⽤jacob,合并多个word为⼀个word⽂件将⼏个word⽂件合并到⼀个word⽂件,使⽤注意点:1.后⾯附项⽬运⽤的jar包jacob-1.9,2.并且jacob运⽤中,需要将附件内的jacob.dll放到windows/system32下语法介绍:将⼀个关于JACOB的代码分成下⾯⼏个步骤:1) ActiveXComponent ax = new ActiveXComponent("a1");//构建ActiveX组件实例其中的a1的值和你需要调⽤的ActiveX控件有关MS控件名a1的值InternetExplorer InternetExplorer.ApplicationExcel Excel.ApplicationWord Word.ApplicationPowerpoint Powerpoint.Applicationvb/java Script ScriptControlwindows media Player WMPlayer.OCXOutlook Outlook.ApplicationVisio Visio.ApplicationDAO DAO.PrivateDBEngine.35MultiFace MultiFace.Face2) Dispatch ds = ax.getObject(). toDispatch();//获取Dispatch对象,我们可以把每个Dispatch对象看成是对Activex控件的⼀个操作,这⼀步是获得该ActiveX控件的控制权。
(注:浅析JACOB 中提到过Variant类,这⾥的ax.getObject()便是获得该对象,我们将其转化为任何对象(类型))3) Dispatch ds1 = Dispatch.get(ds, "a2").toDispatch(); //获取该ActiveX对象数据结构中的a2属性4) Dispatch d2 = Dispatch.invoke(ds1, "a3", a4, a5, a6).toDispatch(); //功能调⽤,对ActiveX对象ds1的a3属性执⾏a4(Dispatch.Put\Dispatch.Get等)操作,执⾏后a3的值为a5,a6为错误参数码常定义为new int[1],(注:call、get和put⽅法都是通过该⽅法实现的)5) Dispatch ds2 = Dispatch.put(ds, "a7","a8").toDispatch();//将ActiveX对象ds的属性a7的值设置为a8,该⽅法返回类型同get⼀样6) Dispatch ds3 = Dispatch.call(ds1, "a9", a10);//该⽅法和get⽅法⾮常类似,他是把a9属性赋值给a10具体的使⽤例⼦【将多个word合并成⼀个word⽂档】:1》⾸先将架包jacob-1.9放在lib,build path进项⽬2》将jacob.dll放在C:\Windows\System32下1package aaatest;23import java.util.ArrayList;4import java.util.List;56import com.jacob.activeX.ActiveXComponent;7import .Dispatch;8import .Variant;910public class WordTest {1112public static void main(String[] args) {13 List list = new ArrayList();14 String file1= "D:\\2.doc";15 String file2= "D:\\1.doc";16//String file3= "D:\\2.docx";17 list.add(file1);18 list.add(file2);19//list.add(file3);20 uniteDoc(list,"d:\\file.doc");21 }22public static void uniteDoc(List fileList, String savepaths) {23if (fileList.size() == 0 || fileList == null) {24return;25 }26//打开word27 ActiveXComponent app = new ActiveXComponent("Word.Application");//启动word28try {2930// 设置word不可见 ---也就是设置ActiveXComponent对象的⼀个属性31 app.setProperty("Visible", new Variant(false));32//获得documents对象----Variant。
基手JACOB韵WORD文档操作技术
式, 这 种 文 档 不 能 通 过 类似 调 用 普 通 的 文
件 操 作 函数 来 进 行 操 作 。 不 少 技 术 人 员在 W ORD文 档 的 控 制 方法 上 进 行 了探 讨 , 文
J a c o b . d l l
献” 中介 绍 了在 VC ++平 台下 使 用 C OM 技 术调 用OLE 自动 化 对 象 , 一 般 是 通 过 加 载 OF F I CE自带 的 对 象 库 创 建 内部 组 件 对 象, 通 过 对 这 些 对 象 的 操 作 实 现 WORD的
Q: 唑
T Tech n ol ogy I nn ov at i o n 4 - 1 er a l d
基手J A C OB 1 6 I 勺 wO R D 文档操作技术①
车晓波 闰旭琴 刘晓建 ( 山东省汽 车电子技术重点实验室 ,山东省科学院 自动化研究所
自动 化 。 文 献 介 绍 了如何 通 过 VC + + 调 用
J NI
VB A将 报 表 内容 输 出到 W ORD应 用 程 序
中。 文 献 介 绍 了在J A V A中运 用 J AC OB  ̄ I 基 干C OM 组 件 的 数 据 源 之 间 的 数 据 结 构 转 换。 诸 多文 献 讲 述 了在 VC++平 台 下 实
在 项 目实 施 中 , 常 常 需 要 将 系 统 运 行 结果 、 工 程 设 计 方 案 或 者 自定 义 内 容 作 为
WORD 文 档 输 出, 以 方便 用 户查 看 。 单 纯 依
C o ej r a c o b . Ac t i v e X.
靠 人 工编 写 项 目报 告、 填 写设 计 内容 不仅 工
Java操作word文档使用JACOB和POI操作word,Excel,PPT需要的jar包
Java操作word⽂档使⽤JACOB和POI操作word,Excel,PPT需要的jar包可参考⽂档:下载jar包如上是jacob-1.17-M2.jar对应的jar包和dll⽂件....但是我在maven仓库中并没有发现jacob-1.17版本的.所以如果使⽤maven项⽬的话推荐下载jacob-1.14版本的jar包和dll⽂件.使⽤⽅式:import java.io.File;import java.io.FileInputStream;import java.util.ArrayList;import java.util.Arrays;import com.jacob.activeX.ActiveXComponent;public class WriteDoc2 {public static void main(String[] args) {//在正式批量跑之前,做单个word⽂档的测试.WordUtils util = new WordUtils(true);util.openDocument("C:\\Users\\ABC\\Desktop\\test.docx");util.setSaveOnExit(true);util.insertText("xxx444dddd4x");util.saveAs("C:\\Users\\ABC\\Desktop\\test.docx");util.closeDocument();}}对应WordUtils.java⼯具类,我是使⽤的如下:import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .Variant;public class WordUtils {// word运⾏程序对象private ActiveXComponent word;// 所有word⽂档集合private Dispatch documents;// word⽂档private Dispatch doc;// 选定的范围或插⼊点private Dispatch selection;// 保存退出private boolean saveOnExit;public WordUtils(boolean visible) {word = new ActiveXComponent("Word.Application");word.setProperty("Visible", new Variant(visible));documents = word.getProperty("Documents").toDispatch();}/*** 设置退出时参数** @param saveOnExit* boolean true-退出时保存⽂件,false-退出时不保存⽂件 */public void setSaveOnExit(boolean saveOnExit) {this.saveOnExit = saveOnExit;}/*** 创建⼀个新的word⽂档*/public void createNewDocument() {doc = Dispatch.call(documents, "Add").toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开⼀个已经存在的word⽂档** @param docPath*/public void openDocument(String docPath) {doc = Dispatch.call(documents, "Open", docPath).toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开⼀个有密码保护的word⽂档* @param docPath* @param password*/public void openDocument(String docPath, String password) {doc = Dispatch.call(documents, "Open", docPath).toDispatch();unProtect(password);selection = Dispatch.get(word, "Selection").toDispatch();}/*** 去掉密码保护* @param password*/public void unProtect(String password){try{String protectionType = Dispatch.get(doc, "ProtectionType").toString();if(!"-1".equals(protectionType)){Dispatch.call(doc, "Unprotect", password);}}catch(Exception e){e.printStackTrace();}}/*** 添加密码保护* @param password*/public void protect(String password){String protectionType = Dispatch.get(doc, "ProtectionType").toString();if("-1".equals(protectionType)){Dispatch.call(doc, "Protect",new Object[]{new Variant(3), new Variant(true), password});}}/*** 显⽰审阅的最终状态*/public void showFinalState(){Dispatch.call(doc, "AcceptAllRevisionsShown");}/*** 打印预览:*/public void printpreview() {Dispatch.call(doc, "PrintPreView");}/*** 打印*/public void print(){Dispatch.call(doc, "PrintOut");}public void print(String printerName) {word.setProperty("ActivePrinter", new Variant(printerName));print();}/*** 指定打印机名称和打印输出⼯作名称* @param printerName* @param outputName*/public void print(String printerName, String outputName){word.setProperty("ActivePrinter", new Variant(printerName));Dispatch.call(doc, "PrintOut", new Variant[]{new Variant(false), new Variant(false), new Variant(0), new Variant(outputName)}); }/*** 把选定的内容或插⼊点向上移动** @param pos*/public void moveUp(int pos) {move("MoveUp", pos);}/*** 把选定的内容或者插⼊点向下移动** @param pos*/public void moveDown(int pos) {move("MoveDown", pos);}/*** 把选定的内容或者插⼊点向左移动** @param pos*/public void moveLeft(int pos) {move("MoveLeft", pos);}/*** 把选定的内容或者插⼊点向右移动** @param pos*/public void moveRight(int pos) {move("MoveRight", pos);}/*** 把选定的内容或者插⼊点向右移动*/public void moveRight() {Dispatch.call(getSelection(), "MoveRight");}/*** 把选定的内容或者插⼊点向指定的⽅向移动* @param actionName* @param pos*/private void move(String actionName, int pos) {for (int i = 0; i < pos; i++)Dispatch.call(getSelection(), actionName);}/*** 把插⼊点移动到⽂件⾸位置*/public void moveStart(){Dispatch.call(getSelection(), "HomeKey", new Variant(6));}/*** 把插⼊点移动到⽂件末尾位置*/public void moveEnd(){Dispatch.call(getSelection(), "EndKey", new Variant(6));}/*** 插⼊换页符*/public void newPage(){Dispatch.call(getSelection(), "InsertBreak");}public void nextPage(){moveEnd();moveDown(1);}public int getPageCount(){Dispatch selection = Dispatch.get(word, "Selection").toDispatch();return Dispatch.call(selection,"information", new Variant(4)).getInt(); }/*** 获取当前的选定的内容或者插⼊点* @return当前的选定的内容或者插⼊点*/public Dispatch getSelection(){if (selection == null)selection = Dispatch.get(word, "Selection").toDispatch();return selection;}/*** 从选定内容或插⼊点开始查找⽂本* @param findText 要查找的⽂本* @return boolean true-查找到并选中该⽂本,false-未查找到⽂本*/public boolean find(String findText){if(findText == null || findText.equals("")){return false;}// 从selection所在位置开始查询Dispatch find = Dispatch.call(getSelection(), "Find").toDispatch();// 设置要查找的内容Dispatch.put(find, "Text", findText);// 向前查找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 findText* @param newText* @return boolean true-查找到并替换该⽂本,false-未查找到⽂本*/public boolean replaceText(String findText, String newText){moveStart();if (!find(findText))return false;Dispatch.put(getSelection(), "Text", newText);return true;}/*** 进⼊页眉视图*/public void headerView(){//取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", "9");}/*** 进⼊页脚视图*/public void footerView(){//取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", "10");}/*** 进⼊普通视图*/public void pageView(){//取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", new Variant(0));//普通视图}/*** 全局替换⽂本* @param findText* @param newText*/public void replaceAllText(String findText, String newText){int count = getPageCount();for(int i = 0; i < count; i++){headerView();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveEnd();}footerView();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}pageView();moveStart();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}nextPage();}}/*** 全局替换⽂本* @param findText* @param newText*/public void replaceAllText(String findText, String newText, String fontName, int size){ /****插⼊页眉页脚*****///取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();/****设置页眉*****/Dispatch.put(view, "SeekView", "9");while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}/****设置页脚*****/Dispatch.put(view, "SeekView", "10");while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}Dispatch.put(view, "SeekView", new Variant(0));//恢复视图moveStart();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);putFontSize(getSelection(), fontName, size);moveStart();}}/*** 设置选中或当前插⼊点的字体* @param selection* @param fontName* @param size*/public void putFontSize(Dispatch selection, String fontName, int size){Dispatch font = Dispatch.get(selection, "Font").toDispatch();Dispatch.put(font, "Name", new Variant(fontName));Dispatch.put(font, "Size", new Variant(size));}/*** 在当前插⼊点插⼊字符串*/public void insertText(String text){Dispatch.put(getSelection(), "Text", text);}/*** 将指定的⽂本替换成图⽚* @param findText* @param imagePath* @return boolean true-查找到并替换该⽂本,false-未查找到⽂本*/public boolean replaceImage(String findText, String imagePath, int width, int height){moveStart();if (!find(findText))return false;Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveRight();return true;}/*** 全局将指定的⽂本替换成图⽚* @param findText* @param imagePath*/public void replaceAllImage(String findText, String imagePath, int width, int height){moveStart();while (find(findText)){Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveStart();}}/*** 在当前插⼊点中插⼊图⽚* @param imagePath*/public void insertImage(String imagePath, int width, int height){Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveRight();}/*** 在当前插⼊点中插⼊图⽚* @param imagePath*/public void insertImage(String imagePath){Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath);}/*** 获取书签的位置* @param bookmarkName* @return书签的位置*/public Dispatch getBookmark(String bookmarkName){try{Dispatch bookmark = Dispatch.call(this.doc, "Bookmarks", bookmarkName).toDispatch();return Dispatch.get(bookmark, "Range").toDispatch();}catch(Exception e){e.printStackTrace();}return null;}/*** 在指定的书签位置插⼊图⽚* @param bookmarkName* @param imagePath*/public void insertImageAtBookmark(String bookmarkName, String imagePath){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null)Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath);}/*** 在指定的书签位置插⼊图⽚* @param bookmarkName* @param imagePath* @param width* @param height*/public void insertImageAtBookmark(String bookmarkName, String imagePath, int width, int height){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null){Dispatch picture = Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));}}/*** 在指定的书签位置插⼊⽂本* @param bookmarkName* @param text*/public void insertAtBookmark(String bookmarkName, String text){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null)Dispatch.put(dispatch, "Text", text);}/*** ⽂档另存为* @param savePath*/public void saveAs(String savePath){Dispatch.call(doc, "SaveAs", savePath);}/*** ⽂档另存为PDF* <b><p>注意:此操作要求word是2007版本或以上版本且装有加载项:Microsoft Save as PDF 或 XPS</p></b>* @param savePath*/public void saveAsPdf(String savePath){Dispatch.call(doc, "SaveAs", new Variant(17));}/*** 保存⽂档* @param savePath*/public void save(String savePath){Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),"FileSaveAs", savePath);}/*** 关闭word⽂档*/public void closeDocument(){if (doc != null) {Dispatch.call(doc, "Close", new Variant(saveOnExit));doc = null;}}public void exit(){word.invoke("Quit", new Variant[0]);}}具体WordUtils类的使⽤暂时没有看到更多的例⼦,上⾯的util的使⽤是⾃⼰摸索出来的,可能不是最优,最恰当的.//==================================================================================================使⽤Java⼯具POI操作MicroSoft Office套件Word,Excle和PPT使⽤Maven⼯程的话需要在Pom.xml⽂件中引⼊的jar包.⼀开始是想使⽤POI⼯具操作,但是从⽹上找来的代码始终报编译错误,代码中的⼀些类找不到,但是也明明已经引⼊了poi-3.x.jar包⽂件,更换了好⼏个poi版本的jar包仍是⼀样的效果.随后调查,到底需要哪些jar包.....结果如下:<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.3.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.8</version></dependency>所依赖的全部jar包的截图如果只引⼊⼀个poi-3.x.jar包是会报错的. POI具体操作Word,Excel,和PPT的代码,⾃⾏百度.只要jar包引⼊的正确,运⾏编译代码就没有问题.。
jacob给Word文档添加页脚
final Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();
//取得视图对象
final Dispatch View = Dispatch.get(ActivePane, "View").toDispatch();
Dispatch.put(font,"Name",new Variant("楷体_GB2312"));
Dispatch.put(font, "Bold", new Variant(true));
Dispatch.put(font, "Size", 9);
}
final Dispatch fields = Dispatch.get(range, "Fields").toDispatch();
Dispatch paragraphFormat=Dispatch.get(selection,"ParagraphFormat").getDispatch();
Dispatch.call(fields, "Add", Dispatch.get(selection, "Range").toDispatch(), new Variant(-1), "NumPages",true).toDispatch();
Dispatch font = Dispatch.get(range, "Font").toDispatch();
Dispatch.put(paragraphFormat, "Alignment", 1);
java使用jacob实现word转pdf
java使⽤jacob实现word转pdf背景:⽇常开发ERP系统,会有⼀些⼯单或者合同之类需要填写打印。
我们就会将其word模板来通过系统⾃动化填写并转换为PDF格式(PDF⽂件打印可保证⽂件质量,是⼀种通⽤的格式。
⽂件不易去修改,⽐较稳定)。
所以我们将通过jacob来实现这些功能。
准备⼯作:1.服务器需要安装office2007,因为我们就是调⽤这个来实现转换。
2.需要安装插件jacob,安装jacob-1.14.3-x86.dll到jdk\jdk1.7.0\jre\bin(你⾃⼰电脑安装的jdk)3.需要使⽤jacob-1.14.3.jar包maven代码如下:<dependency><groupId>net.sf.jacob-project</groupId><artifactId>jacob</artifactId><version>1.14.3</version></dependency>4.假如通过以上准备⼯作未成功转换,就下载⼀个SaveAsPDFandXPS.exe组件(office2007⾥的)。
我就是通过这个组件才完成转换。
5.上⾯的在系统为windows7中就可以了,假如你的项⽬需要发布到服务器(服务器系统⼀般都是windows2008)。
则还需要⼀步。
在上⾯的基础上再安装安装jacob-1.14.3-x64.dll到jdk\jdk1.7.0\jre\bin(你⾃⼰电脑安装的jdk)中。
很多⼈在win7下都能成功转换,但在win2008就是出问题。
我就是通过磨了⼀天的时间,看了各种⽇志才发现问题。
⼀、⼯具类(OperationIo.java),这⾥⾯可以不做任何修改,复制粘贴就可以了。
package com.repair.util.pub;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import javax.imageio.ImageIO;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import com.jacob.activeX.ActiveXComponent;import Thread;import .Dispatch;import .Variant;public class OperationIO {static final int wdFormatPDF = 17;// PDF 格式/*** WORD转换PDF* @param sfileName WORD⽂件存在位置* @param toFileName PDF⽂件存放位置*/public static void wordToPDF(String sfileName,String toFileName){System.out.println("启动Word...");long start = System.currentTimeMillis();ActiveXComponent app = null;Dispatch doc = null;try {//调⽤office wordapp = new ActiveXComponent("Word.Application");app.setProperty("Visible", new Variant(false));Dispatch docs = app.getProperty("Documents").toDispatch();doc = Dispatch.call(docs, "Open" , sfileName).toDispatch();System.out.println("打开⽂档..." + sfileName);System.out.println("转换⽂档到PDF..." + toFileName);File tofile = new File(toFileName);if (tofile.exists()) {tofile.delete();}Dispatch.call(doc,"SaveAs",toFileName, // FileNamewdFormatPDF);long end = System.currentTimeMillis();System.out.println("转换完成..⽤时:" + (end - start) + "ms.");} catch (Exception e) {System.out.println("========Error:⽂档转换失败:" + e.getMessage());} finally {Dispatch.call(doc,"Close",false);System.out.println("关闭⽂档");if (app != null)app.invoke("Quit", new Variant[] {});}//如果没有这句话,winword.exe进程将不会关闭ComThread.Release();}/*** 递归删除⽬录下的所有⽂件及⼦⽬录下所有⽂件* @param dir 将要删除的⽂件⽬录* @return boolean Returns "true" if all deletions were successful.* If a deletion fails, the method stops attempting to* delete and returns "false".*/public static boolean deleteDir(File dir) {if (dir.isDirectory()) {String[] children = dir.list();for (int i=0; i<children.length; i++) {boolean success = deleteDir(new File(dir, children[i]));if (!success) {return false;}}}// ⽬录此时为空,可以删除return dir.delete();}/*** 将图⽚⽂件转化为字节数组字符串,并对其进⾏Base64编码处理* @param imgFilePath 图⽚地址路径*/public static String GetImageStr(String imgFilePath) {//byte[] data = null;// 读取图⽚字节数组try {InputStream in = new FileInputStream(imgFilePath);data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);// 返回Base64编码过的字节数组字符串}/*** 将⼆进制转换为图⽚** @param base64String*/public static void base64StringToImage(String base64String,String imageoutpath) { try {BASE64Decoder decoder = new sun.misc.BASE64Decoder();byte[] bytes1 = decoder.decodeBuffer(base64String);ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);BufferedImage bi1 = ImageIO.read(bais);File w2 = new File(imageoutpath);// 可以是jpg,png,gif格式ImageIO.write(bi1, "jpg", w2);// 不管输出什么格式图⽚,此处不需改动} catch (IOException e) {e.printStackTrace();}}}⼆、业务类(PrintWordToPdf.java),这⾥package com.hjm.Test;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.io.Writer;import java.util.HashMap;import java.util.Map;import com.engineering.pojos.pub.gcRecordArchive;import com.repair.util.pub.OperationIO;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;public class PrintWordToPdf {public static void main(String[] args) {//创建⼀个Configuration的实例Configuration configuration = new Configuration();//设置编码configuration.setDefaultEncoding("utf-8");//创建Map对象,来保存要填写的数据Map<String, Object> paraMap = new HashMap<String, Object>();//下⾯这些是我测试的⼀些数据paraMap.put("ReceivingParty", "中国民航");paraMap.put("PackingListNo", 10087);paraMap.put("ConNo", 10088);try {//调⽤模板的⽂件夹,new File("D:\\测试")是⼀个绝对路径,你可以⾃⼰设置为服务器路径。
jacob操作word
最近由于工作的原因需要对Word进行操作,并且在文档上面加上水印,这个问题我在网上搜索了很久都没有一个完整的解决办法,没得办法之好自己研究了,半天的努力没有白费,终于解决了,有兴趣的朋友可以参考下:环境:jdk1.4jacob 1.9office2003至于jacob的设置我就不用多说了,网上很多这样的文章,下面就把我的代码贴出来,供大家参考。
package src;import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .Variant;import Thread;public class WordObj{public WordObj(){}private static WordObj instance;private Dispatch doc = null;private Dispatch activeWindow = null;private Dispatch docSelection = null;private Dispatch wrdDocs = null;private String fileName;private ActiveXComponent wrdCom;/*** 获取Word操作静态实例对象** @return 报表汇总业务操作*/public final static synchronized WordObj getInstance()if (instance == null)instance = new WordObj();return instance;}/*** 初始化Word对象** @return 是否初始化成功*/public boolean initWordObj(){boolean retFlag = false;ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法wrdCom = new ActiveXComponent("Word.Application");try{// 返回wrdCom.Documents的DispatchwrdDocs = wrdCom.getProperty("Documents").toDispatch();wrdCom.setProperty("Visible", new Variant(true));retFlag = true;}catch (Exception e){retFlag = false;e.printStackTrace();}return retFlag;}/*** 创建一个新的word文档**/public void createNewDocument(){doc = Dispatch.call(wrdDocs, "Add").toDispatch();docSelection = Dispatch.get(wrdCom, "Selection").toDispatch(); }* 取得活动窗体对象**/public void getActiveWindow(){// 取得活动窗体对象activeWindow = wrdCom.getProperty("ActiveWindow").toDispatch();}/*** 打开一个已存在的文档** @param docPath*/public void openDocument(String docPath){if (this.doc != null){this.closeDocument();}doc = Dispatch.call(wrdDocs, "Open", docPath).toDispatch();docSelection = Dispatch.get(wrdCom, "Selection").toDispatch(); }/*** 关闭当前word文档**/public void closeDocument(){if (doc != null){Dispatch.call(doc, "Save");Dispatch.call(doc, "Close", new Variant(0));doc = null;}}/*** 文档设置水印** @param waterMarkStr 水印字符串public void setWaterMark(String waterMarkStr){// 取得活动窗格对象Dispatch activePan = Dispatch.get(activeWindow, "ActivePane").toDispatch();// 取得视窗对象Dispatch view = Dispatch.get(activePan, "View").toDispatch();//输入页眉内容Dispatch.put(view, "SeekView", new Variant(9));Dispatch headfooter = Dispatch.get(docSelection, "HeaderFooter") .toDispatch();//取得图形对象Dispatch shapes = Dispatch.get(headfooter, "Shapes").toDispatch(); //给文档全部加上水印Dispatch selection = Dispatch.call(shapes, "AddTextEffect",new Variant(9), waterMarkStr, "宋体", new Variant(1),new Variant(false), new Variant(false), new Variant(0),new Variant(0)).toDispatch();Dispatch.call(selection, "Select");//设置水印参数Dispatch shapeRange = Dispatch.get(docSelection, "ShapeRange") .toDispatch();Dispatch.put(shapeRange, "Name", "PowerPlusWaterMarkObject1"); Dispatch textEffect =Dispatch.get(shapeRange,"TextEffect").toDispatch();Dispatch.put(textEffect, "NormalizedHeight", new Boolean(false)); Dispatch line = Dispatch.get(shapeRange, "Line").toDispatch(); Dispatch.put(line, "Visible", new Boolean(false));Dispatch fill = Dispatch.get(shapeRange, "Fill").toDispatch(); Dispatch.put(fill, "Visible", new Boolean(true));//设置水印透明度Dispatch.put(fill, "Transparency", new Variant(0.5));Dispatch foreColor =Dispatch.get(fill,"ForeColor").toDispatch();//设置水印颜色Dispatch.put(foreColor, "RGB", new Variant(16711680));Dispatch.call(fill, "Solid");//设置水印旋转Dispatch.put(shapeRange, "Rotation", new Variant(315));Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true)); Dispatch.put(shapeRange, "Height", new Variant(117.0709));Dispatch.put(shapeRange, "Width", new Variant(468.2835));Dispatch.put(shapeRange, "Left", new Variant(-999995));Dispatch.put(shapeRange, "Top", new Variant(-999995));Dispatch wrapFormat = Dispatch.get(shapeRange, "WrapFormat").toDispatch();//是否允许交叠Dispatch.put(wrapFormat, "AllowOverlap", new Variant(true)); Dispatch.put(wrapFormat, "Side", new Variant(3));Dispatch.put(wrapFormat, "Type", new Variant(3));Dispatch.put(shapeRange, "RelativeHorizontalPosition", new Variant(0));Dispatch.put(shapeRange, "RelativeVerticalPosition", new Variant(0));Dispatch.put(view, "SeekView", new Variant(0));}/*** 关闭Word资源***/public void closeWordObj(){// 关闭word文件wrdCom.invoke("Quit", new Variant[] {});// 释放com线程。
jacob,操作word表格
竭诚为您提供优质文档/双击可除jacob,操作word表格篇一:jacob读取word表格packagetest;importjava.io.bufferedReader;importjava.io.FileReader;importjava.io.ioexception;importjava.util.arraylist;importjava.util.list;importbean.dx;importcom.jacob.activex.activexcomponent;thread;.dispatch;.Variant;publicclassReadwordbystream{ publicstaticvoidmain(string[]args)throwsioexception{dispatchworddoc=null;activexcomponentword=null;try{word=newactivexcomponent("word.application");word.setproperty("Visible",newVariant(false));dispatchdocuments=word.getproperty("documents").tod ispatch();worddoc=dispatch.call(documents,"open","d:\\word\\1 .doc").todispatch();dispatchtables=dispatch.get(worddoc,"tables").todis patch();dispatchtable=dispatch.call(tables,"item",newVarian t(1)).todispatch();dispatchrows=dispatch.get(table, "Rows").todispatch();dispatchcolumns=dispatch.get(table,"columns").todis patch();dispatchcell;dispatchrange;stringdata;//dxd=newdx();//listlist=newarraylist();system.out.println("一共打多少收按行="+dispatch.get(rows,"count").getint());system.out.println("一共多少列="+dispatch.get(columns,"count").getint());for(inti =1;i for(intj=1;jrange=dispatch.get(cell,"Range").todispatch();data=dispatch.get(range,"text").getstring();system.out.print(data.trim()+"|");}system.out.print ln();}}catch(exceptione){e.printstacktrace();}final ly{dispatch.call(worddoc,"close",newVariant(true)); word.invoke("quit",newVariant[0]);}}}篇二:jacob操作word详细教程jacob操作word详细教程博客分类:javatomcatqq应用服务器F#首先,大家先要了解一下jacob,官方的解释是javacombridge,即java和com组件间的桥梁,这里说说为什么我们用jacob操纵word。
jacob操作word(转载)
•jacob操作word自从有了JACOB后,事情变得简单多了。
但是要实现Java灵活的控制Word还是一件非常麻烦的事情。
下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。
(请注意:JDK1.3.2运行 Jacob比较正常,JDK1.4有问题)private ActiveXComponent word = null;private Dispatch documents = null;private Dispatch vSelection = null;private Dispatch wordfile = null;1,初始化word = new ActiveXComponent("Word.Application");documents = word.getProperty("Documents").toDispatch();(将JACOB 放在 WINNT\system32\ 下比较简单省事)2,打开文件wordfile = Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[] {strFileName,new Variant(true),//是否进行转换 ConfirmConversionsnew Variant(false)//是否只读}, new int[1]).toDispatch();vSelection = word.getProperty("Selection").toDispatch();在WORD中,选定内容进行转换时,不用象Java对象一样来回的重新取,这个对象一直有效。
在WORD中3,显示WORDword.setProperty("Visible", new Variant(visible));4,设置WORD的位置Dispatch activeWindow = Dispatch.get(word, "Application").toDispatch();Dispatch.put(activeWindow, "WindowState", new Variant(0));Dispatch.put(activeWindow, "Top", new Variant(0));Dispatch.put(activeWindow, "Left", new Variant(0));Dispatch.put(activeWindow, "Height", new Variant(600));Dispatch.put(activeWindow, "width", new Variant(800));进行将JAVA内的数据和WORD交换,常用的做法是,在WORD上作一些特殊的标记,利用 FIND 和 Replace的方法进行,这个方法不是太好。
关于java使用jacob.jar调用word的配置问题
关于java使用jacob.jar调用word的配置问题
Java调用jacob出错问题:java.library.path解决
关于java使用jacob.jar调用word的配置问题
最近用到了jacob.jar来转换word文件,出现一些问题都是关于配置的,先将一些配置说明一下,以供大家参考。
一、将jacob.dll拷贝到windows/system32下,并在部署环境中添加jacob.jar包,这两个文件的版本必须一致,不然会出现一些错误,如果多个应用用到改包,最好放到公共包目录下,因为可能出现一些错误。
二、如果通过上述配置还不能正确运用改包,则将jacob.dll放入Java\jdk\jre\bin目录下,如果不是web应用,则需将jacob.dll放到Java\jdk\jre\lib\ext目录下。
如果仍然出现no jacob in the java.library.path错误,把jacob.dll放到System.getProperty("java.library.path")取到的目录下。
(完整版)javajacob操作word文档,进行写操作,如生成表格,添加图片
69.
int paragraphCount = Dispatch.get(paragraphs, "Count").changeType(
70.
Variant.VariantInt).getInt();// 一共的段落数
71.
// 找到刚输入的段落,设置格式
72.
Dispatch lastParagraph = Dispatch.call(paragraphs, "Item",
33.
// Find the Documents collection object maintained by Word
34.
// documents 表示 word 的所有文档窗口,(word 是多文档应用程序)
35.
Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch();
36.
document = Dispatch.call(documents, "Open", wordFilePath,
37.
new Variant(true)/* 是否进行转换 ConfirmConversions */,
38.
new Variant(false)/* 是否只读 */).toDispatch();
MsWordApp = new ActiveXComponent("Word.Application");
14.
}
15.
}
16.
// 设置是否在前台打开 word 程序 ,
17.
public void setVisible(boolean visible) {
使用jacob将word转成PDF
使用jacob将word转成PDF上面的这篇文章使用jacob将word转换成HTML的,利用的是Word的另存为功能,在Office 2007 SP2之后,Office就可以另存为PDF了,可以使用这个方法将office另存为PDF文档。
具体代码可以参考上文里面的,另存为哪种类型是由new variant()里面的参数决定的。
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Objec t[] {htmlfile, new Variant(WORD_HTML) }, new int[1]);new Variant(),这里面的根据传入的参数不同,可以另存为不同的类型,但是在网上搜索了一个并没有找到有关这个参数类型的一个说明,自己尝试了一下,结果如下:我使用的是office 2010,不同版本的对应的应该不一样,我是写了这一小段程序来测试另存为的类型的。
Java代码1.public class JacobTest {2. public static void wordToPDF(String docfile, String toFile,int type) {3. ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word4. try {5. app.setProperty("Visible", new Variant(false));6. Dispatch docs = app.getProperty("Documents").toDispatch();7. Dispatch doc = Dispatch.invoke(8. docs,9. "Open",10. Dispatch.Method,11. new Object[] { docfile, new Variant(false),12. new Variant(true) }, new int[1]).toDispatch();13. //new Variant(type),这里面的type的决定另存为什么类型的文件14. Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {15. toFile, new Variant(type) }, new int[1]);16. Variant f = new Variant(false);17. Dispatch.call(doc, "Close", f);18. } catch (Exception e) {19. e.printStackTrace();20. } finally {21. app.invoke("Quit", new Variant[] {});22. }23. }24.25. public static void main(String[] args) {26. //源文件全路径27. String docfile ="D:\\服务实施描述报告(企业门户).docx";28. for (int i = 0; i < 18; i++) {29. //些路径test为实际存在的目录,s后面为要另存为的文件名30. String toFile="d:\\test\\s"+i;31. wordToPDF(docfile, toFile,i);32. }33. }34.}。
java通过jacob操作word
package innet.bysj.word;import java.io.File;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.ArrayList;import java.util.List;import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .Variant;public class MSWordManager {// word文档private Dispatch doc;// word运行程序对象private ActiveXComponent word;// 所有word文档集合private Dispatch documents;// 选定的范围或插入点private Dispatch selection;private boolean saveOnExit = true;private static final int WORD_HTML = 8;private static final int WORD_TXT = 7;private static final int EXCEL_HTML = 44;/** *//**** @param visible 为true表示word应用程序可见*/public MSWordManager(boolean visible) {if (word == null) {word = new ActiveXComponent("Word.Application");word.setProperty("Visible", new Variant(visible));}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 = Dispatch.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();}/** *//*** 把选定的内容或插入点向上移动** @param pos 移动的距离*/public void moveUp(int pos) {if (selection == null)selection = 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, "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 (selection == 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));}public void moveEnd() {if (selection == null)selection = Dispatch.get(word, "Selection").toDispatch();Dispatch.call(selection, "EndKey", new Variant(6));}/** *//*** 从选定内容或插入点开始查找文本** @param toFindText 要查找的文本* @return boolean true-查找到并选中该文本,false-未查找到文本*/public boolean find(String toFindText) {if (toFindText == null || toFindText.equals(""))return false;// 从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 toFindText 查找字符串* @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 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 boolean 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, String 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").toDispatch(), "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(doc, "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(int tableIndex, int cellRowIdx, int cellColIdx,String txt) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格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 pos*/public void copy(String toCopyText) {moveStart();if (this.find(toCopyText)) {Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Copy");}}/** *//*** 在当前文档粘帖剪贴板数据** @param pos*/public void paste(String pos) {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(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");}}/** *//*** 在当前文档末尾拷贝来自另一个文档中的段落** @param anotherDocPath 另一个文档的磁盘路径* @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始)*/public void copyParagraphFromAnotherDoc(String anotherDocPath,int paragraphIndex) {Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); // 取得当前文档的内容Dispatch.call(wordContent, "InsertAfter", "$selection$");// 插入特殊符定位插入点copyParagraphFromAnotherDoc(anotherDocPath, paragraphIndex, "$selection$");}/** *//*** 在当前文档指定的位置拷贝来自另一个文档中的段落** @param anotherDocPath 另一个文档的磁盘路径* @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始)* @param pos 当前文档指定的位置*/public void copyParagraphFromAnotherDoc(String anotherDocPath,int paragraphIndex, String pos) {Dispatch doc2 = null;try {doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();Dispatch paragraphs = Dispatch.get(doc2, "Paragraphs").toDispatch();Dispatch paragraph = Dispatch.call(paragraphs, "Item",new Variant(paragraphIndex)).toDispatch();Dispatch range = Dispatch.get(paragraph, "Range").toDispatch();Dispatch.call(range, "Copy");if (this.find(pos)) {Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}} catch (Exception e) {e.printStackTrace();} finally {if (doc2 != null) {Dispatch.call(doc2, "Close", new Variant(saveOnExit));doc2 = null;}}}/** *//*** 在当前文档指定的位置拷贝来自另一个文档中的表格** @param anotherDocPath 另一个文档的磁盘路径* @param tableIndex 被拷贝的表格在另一格文档中的序号(从1开始)* @param pos 当前文档指定的位置*/public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex,String pos) {Dispatch doc2 = null;try {doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();Dispatch tables = Dispatch.get(doc2, "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");}} catch (Exception e) {e.printStackTrace();} finally {if (doc2 != null) {Dispatch.call(doc2, "Close", new Variant(saveOnExit));doc2 = null;}}}/** *//*** 在当前文档指定的位置拷贝来自另一个文档中的图片** @param anotherDocPath 另一个文档的磁盘路径* @param shapeIndex 被拷贝的图片在另一格文档中的位置* @param pos 当前文档指定的位置*/public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex,String pos) {Dispatch doc2 = null;try {doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();Dispatch shape = Dispatch.call(shapes, "Item",new Variant(shapeIndex)).toDispatch();Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch();Dispatch.call(imageRange, "Copy");if (this.find(pos)) {Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}} catch (Exception e) {e.printStackTrace();} finally {if (doc2 != null) {Dispatch.call(doc2, "Close", new Variant(saveOnExit));doc2 = null;}}}/** *//*** 创建表格** @param pos 位置* @param cols 列数* @param rows 行数*/public void createTable(int numCols, int numRows){//(String pos, int numCols, int numRows) {// if (!find(pos)) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();Dispatch range = Dispatch.get(selection, "Range").toDispatch();Dispatch newTable = Dispatch.call(tables, "Add", range,new Variant(numRows), new Variant(numCols),new Variant(1)).toDispatch();Dispatch.call(selection, "MoveRight");moveEnd();// }}/** *//*** 在指定行前面增加行** @param tableIndex word文件中的第N张表(从1开始)* @param rowIndex 指定行的序号(从1开始)*/public void addTableRow(int tableIndex, int rowIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex)).toDispatch();Dispatch.call(rows, "Add", new Variant(row));}/** *//*** 在第1行前增加一行** @param tableIndex word文档中的第N张表(从1开始)*/public void addFirstTableRow(int tableIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch row = Dispatch.get(rows, "First").toDispatch();Dispatch.call(rows, "Add", new Variant(row));}/** *//*** 在最后1行前增加一行** @param tableIndex* word文档中的第N张表(从1开始)*/public void addLastTableRow(int tableIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch row = Dispatch.get(rows, "Last").toDispatch();Dispatch.call(rows, "Add", new Variant(row));}/** *//*** 增加一行** @param tableIndex word文档中的第N张表(从1开始)*/public void addRow(int tableIndex) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch.call(rows, "Add");}/** *//*** 增加一列** @param tableIndex word文档中的第N张表(从1开始)*/public void addCol(int tableIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table, "Columns").toDispatch();Dispatch.call(cols, "Add").toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 在指定列前面增加表格的列** @param tableIndex word文档中的第N张表(从1开始)* @param colIndex 指定列的序号(从1开始)*/public void addTableCol(int tableIndex, int colIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table, "Columns").toDispatch();System.out.println(Dispatch.get(cols, "Count"));Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex)).toDispatch();// Dispatch col = Dispatch.get(cols, "First").toDispatch();Dispatch.call(cols, "Add", col).toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 在第1列前增加一列** @param tableIndex word文档中的第N张表(从1开始)*/public void addFirstTableCol(int tableIndex) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table, "Columns").toDispatch();Dispatch col = Dispatch.get(cols, "First").toDispatch();Dispatch.call(cols, "Add", col).toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 在最后一列前增加一列** @param tableIndex word文档中的第N张表(从1开始)*/public void addLastTableCol(int tableIndex) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table, "Columns").toDispatch();Dispatch col = Dispatch.get(cols, "Last").toDispatch();Dispatch.call(cols, "Add", col).toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 自动调整表格**/public void autoFitTable() {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();int count = Dispatch.get(tables, "Count").toInt();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");}}/** *//*** 调用word里的宏以调整表格的宽度,其中宏保存在document下**/public void callWordMacro() {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();int count = Dispatch.get(tables, "Count").toInt();V ariant vMacroName = new Variant("Normal.NewMacros.tableFit");V ariant vParam = new Variant("param1");V ariant para[] = new Variant[] { vMacroName };for (int i = 0; i < para.length; i++) {Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispatch();Dispatch.call(table, "Select");Dispatch.call(word, "Run", "tableFitContent");}}/** *//*** 设置当前选定内容的字体** @param boldSize* @param italicSize* @param underLineSize 下划线* @param colorSize 字体颜色* @param size 字体大小* @param name 字体名称*/public void setFont(boolean bold, boolean italic, boolean underLine,String colorSize, String size, String name) {Dispatch font = Dispatch.get(selection, "Font").toDispatch();Dispatch.put(font, "Name", new Variant(name));。
使用jacob操作word文档
使⽤jacob操作word⽂档使⽤jacob要记住⽤ActiveXComponent调⽤word的quit⽅法1 新建空⽩的word⽂档,加⼊内容,并保存public class NewAWord{public NewAWord(){// 初始化com的线程,⾮常重要!!使⽤结束后要调⽤ release⽅法ComThread.InitSTA();// 初始化word应⽤程序,新建⼀个空⽩⽂档,取得⽂档内容对象ActiveXComponent objWord = new ActiveXComponent("Word.Application");Dispatch wordObject = (Dispatch) objWord.getObject();Dispatch.put((Dispatch) wordObject, "Visible", new Variant(true));// new Variant(true)表⽰word应⽤程序可见//Tip:设置⼀个对象的属性的时候,利⽤Dispatch的put⽅法,给属性赋值。
上⾯这⾏语句相当于vb的 wordObject.Visible = true 语句Dispatch documents = objWord.getProperty("Documents").toDispatch(); //documents表⽰word的所有⽂档窗⼝,(word是多⽂档应⽤程序)Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使⽤Add命令创建⼀个新⽂档,⽤Open命令可以打开⼀个现有⽂档//Tip:调⽤⼀个对象的⽅法的时候,利⽤Dispatch的call⽅法,上⾯的语句相当于vb的document = documents.Add() 语句。
jacob给word加印的功能
jacob给word加印的功能花了两天时间,参考了一些资料,总算是处理好了这样一个技术点。
关键的心得如下:使用jacob,重点不是jacob本身,而是office的一些API资料。
比如需要知道光标的移动,包括上下左右的move(MoveUp, MoveDown,MoveLeft, MoveRight),包括回到首页起点Dispatch.put(selection, "Start", 0)等等。
严格的说,这边并没有很系统化的去了解jacob的底层。
但对于一些关键点,还是可以拿出来分享的。
比如插入一张图片之后,系统可以拿到一个Dispatch对象(例如叫做obj),我们则需要调用Dispatch.call(obj,"select"),这样相当于使用鼠标在word选中了新插入的图片,而后我们就可以通过Dispatch得到图片的ShapeRange,进而得到ShapeRange的WrapFormat,再对WrapFormat进行设定。
对应的结构可以归纳为:Image->ShapeRange->WrapFormat。
但是要想知道WrapFormat对应到的是哪些值,且有哪些作用,则需要去查询MSDN。
这边查询到的相关值如下:wdWrapInline 7 将形状嵌入到文字中。
wdWrapNone 3 将形状放在文字前面。
请参阅 wdWrapFront 。
wdWrapSquare 0 使文字环绕形状。
行在形状的另一侧延续。
wdWrapThrough 2 使文字环绕形状。
wdWrapTight 1 使文字紧密地环绕形状。
wdWrapTopBottom 4 将文字放在形状的上方和下方。
wdWrapBehind 5 将形状放在文字后面。
wdWrapFront 6 将形状放在文字前面。
这种匈牙利命名法的变量名,其实都对应到一个整型数据(应该是一个常量型的变量)。
比如这次代码中需要用到的将印章图片盖在文字的前面,对应到得变量是wdWrapFront,也就是数值6.再有就是要知道传入的word文件共有几页,加印的话,应该是每一页都要盖章的,于是就需要通过Dispatch.call(cursor,"information",4)来获取,此时cursor(光标)可能是需要回到word首页的开始位置(还未测试)。
Jacob操作office文档(Word,PPT,Excel)
99.*/
100.privatevoidmodifyCurrentSheetName(String newName) {
101.Dispatch.put(getCurrentSheet(),"name", newName);
102.}
103.
104./**
105.*得到当前工作表的名字
141.privateintgetSheetCount() {
142.intcount = Dispatch.get(getSheets(),"count").toInt();
52.Dispatch.call(workbook,"SaveAs",filePath);
53.}
54./**
55.*关闭excel文档
56.* @param f含义不明(关闭是否保存?默认false)
57.*/
58.privatevoidCloseExcel(booleanf) {
59.try{
60.Dispatch.call(workbook,"Save");
126.returnsheets;
127.}
128./**
129.*通过工作表索引得到工作表(第一个工作簿index为1)
130.* @param index
131.* @return sheet对象
132.*/
133.privateDispatch getSheetByIndex(Integer index) {
16.privateDispatch workbook =null;//具体工作簿
17.privateDispatch sheets =null;//获得sheets集合对象
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
jacob操作word自从有了JACOB后,事情变得简单多了。
但是要实现Java灵活的控制Word还是一件非常麻烦的事情。
下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。
(请注意:JDK1.3.2运行 Jacob比较正常,JDK1.4有问题)private ActiveXComponent word = null;private Dispatch documents = null;private Dispatch vSelection = null;private Dispatch wordfile = null;1,初始化word = new ActiveXComponent("Word.Application");documents = word.getProperty("Documents").toDispatch();(将JACOB 放在 WINNT\system32\ 下比较简单省事)2,打开文件wordfile = Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[] {strFileName,new Variant(true),//是否进行转换 ConfirmConversionsnew Variant(false)//是否只读}, new int[1]).toDispatch();vSelection = word.getProperty("Selection").toDispatch();在WORD中,选定内容进行转换时,不用象Java对象一样来回的重新取,这个对象一直有效。
在WORD中3,显示WORDword.setProperty("Visible", new Variant(visible));4,设置WORD的位置Dispatch activeWindow = Dispatch.get(word, "Application").toDispatch();Dispatch.put(activeWindow, "WindowState", new Variant(0));Dispatch.put(activeWindow, "Top", new Variant(0));Dispatch.put(activeWindow, "Left", new Variant(0));Dispatch.put(activeWindow, "Height", new Variant(600));Dispatch.put(activeWindow, "width", new Variant(800));进行将JAVA内的数据和WORD交换,常用的做法是,在WORD上作一些特殊的标记,利用 FIND 和 Replace的方法进行,这个方法不是太好。
个人觉得使用超链接的模式比较方便。
有几大优点:1, Hyperlink 有3个区域可以让开发者自己利用ActiveDocument.Hyperlinks.AddAnchor:=Selection.Range,Address:="位置", //地址(可以利用) 有个缺点SubAddress:="",//子位置(可以利用)ScreenTip:="", //屏幕提示TextToDisplay:="显示内容"//最好利用的东西个人建议使用TextToDisplay。
Address 会在保存时被替换成绝对路径。
比如你录入一个“”保存时可能会被替换成C:\Documents and Settings\Administrator \My Documents\2,可以进行自动定位利用Hyperlinks 可以将文章中所有的超链接得到。
也可以将指定范围的超链接得到。
3,可以自由排版4,可以拷贝粘贴添加超链接:Dispatch Hyperlinks = Dispatch.get(wordfile, "Hyperlinks").toDispatch();Dispatch range = Dispatch.get(vSelection, "Range").toDispatch();Dispatch h=Dispatch.invoke(Hyperlinks,"Add", Dispatch.Method, new Object[]{ range,new Variant("Address"),new Variant("SubAddress"),new Variant("{table.fieldName}"),//建议的数据链接处new Variant("姓名") }, // 在WORD中显示的内容new int[4]).toDispatch();Dispatch hRange=Dispatch.get(h, "Range").toDispatch();Dispatch.call(hRange,"select");//设置字体,颜色Dispatch font = Dispatch.get(vSelection, "Font").toDispatch();Dispatch.put(font,"Underline", new Variant(0));Dispatch.put(font,"Color", new Variant(0));//取消选择Dispatch.call(vSelection,"MoveRight",new Variant(1),new Variant(1));超链接替换内容:1,得到所有的超链接//选择对象Dispatch.call(dObject, "select");//得到超链接集合Dispatch Hyperlinks = Dispatch.get(vSelection, "Hyperlinks").toDispatch();//得到有多少个超链接int nHyperlink = Dispatch.get(Hyperlinks, "count").toInt();//得到一个超链接Dispatch hyperlink=Dispatch.invoke(Hyperlinks, "item",Dispatch.Method, new Object[] { new Integer(i + 1)},new int[1]).toDispatch()));2,替换内容Dispatch.put(hyperlink, "TextToDisplay", information);3,取消超链接,将超链接变成普通文字。
Dispatch.call(hyperlink, "delete");如何实现批量数据自动扩展,建议使用表格进行自动扩展,方便简单。
结合使用上面超链接的技术。
会非常简单:比如有如下数据:DataADataB1,列出所有表格和列出所有超链接基本一样:private void getTables01(Dispatch objcet,Vector vTableStore) {Dispatch tables = Dispatch.get(objcet, "tables").toDispatch();int nTableAmount = Dispatch.get(tables, "count").toInt();for (int i = 0; i < nTableAmount; i++) {Dispatch table =Dispatch.invoke(tables,"item",Dispatch.Method,new Object[] { new Integer(i + 1)},new int[1]).toDispatch();vTableStore.add(new DTable(table));getTables01(table,vTableStore);//处理表格套用表格的情况}}2,表格的可以控制的对象Dispatch dRows = Dispatch.get(dTable, "rows").toDispatch();//所有行int nRows = Dispatch.get(dRows, "count").toInt();3,取得一行的内容Dispatch dRow =Dispatch.invoke(rows,"item",Dispatch.Method,new Object[] { new Integer(row + 1)},new int[1]).toDispatch();return dRow;}catch(ComFailException cfe){return null;}4,得到一行的超链接DHyperlink dhInRow[] = listHyperlinks(dRow);5,将某一行拷贝很多次Dispatch.call(dRow, "select");Dispatch.call(vSelection, "Copy");int nCopyNow = nDataBlockRow - 1;for (int nCopys = 0; nCopys < nCopyNow; nCopys++) {try {Dispatch.call(vSelection, "Paste");}catch(Exception e) { e.printStackTrace();//有时候文档损坏,可以忽略本问题,实际上已经粘贴上了}}6,替换内容,读到这里就不用介绍了。
打印预览:Dispatch.call(wordfile,"PrintPreView");其他的功能发掘利用WORD的宏录制,以及VB编辑器,辅助功能,都能发掘出来。