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线程。
- 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编辑器,辅助功能,都能发掘出来。