jacob操作word和excel

jacob的官方文档:http://danadler.com/jacob/ 微软的javasdk文档:http://f2.grp.yahoofs.com/v1/IIwuQ7rQyGCn-b-f4biL9n_xAwI_Oh3ieuWVDkLfPpaKBmRUjeUzAtCy5oljSMgzdV6OZMRRgrEwU1_RtIXS-h0h7O9W4RB7aUs48A/sdkdocs.zip.aa http://f1.grp.yahoofs.com/v1/IIwuQzpwMrin-b-fbkPTfyGj7CXbfLb0h3lkvGL1GKMwCNpXXRKiKDwe3cx9aUVjO3KWdb7cPJWmqAXUCY_As6XeyLDKoGLYd7ez6g/sdkdocs.zip.ab 注意:这个压缩包是被分割的,在console中使用type sdkdocs.zip.aa sdkdocs.ab >sdkdocs.zip,进行合并。   JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java。这是jacob官方网站的原话,本人就不再多说了。jacob的实现有些像封装了com功能的jni调用的集合及承载com对象的容器。jacob作者Dan Adler使用了c++编写了一批程序库实现对com的引用/承载/调用,然后使用java的jni技术调用这些程序库,实现JAVA-COM Bridge。   关于作者如何封装的可以参考http://danadler.com/jacob/,其方法和类与微软的javasdk文档一致,有兴趣的朋友可以look一下。 jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用! 下载地址: http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368 可用的版本很多功能:可以实现word与pdf和excel的操作,与转换! 配置说明:: 解压文件:jacob_1.11.1.zip ,copy jacob.jar文件加入到classpath copy jacob.dll 放在java jdk bin目录下 copy template.doc到web-inf下 实例1:(替换文本、读取word标签的值和application的UserName属性) public static void main(String[] args) { //启动word,生成一个ActivexComponent对象 ActiveXComponent app = new ActiveXComponent("Word.Application"); //要转换的word文件 String inFile = "D://project//java_word//java_word//wordtemplet.doc"; //要报存的目标文件 String tpFile ="D://project//java_word//java_word//wordtemplet3.doc"; boolean flag = false; Dispatch xlo = app.getObject(); String oldText="1234"; String newText="test"; boolean visible=false; String bookMarkKey="LB_KJGG"; try { //设置word不可见 app.setProperty("Visible", new Variant(visible)); //log.info("设置word不可见成功!"); System.out.println("设置word不可见成功!"); Dispatch docs = app.getProperty("Documents").toDispatch(); Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method ,new Object[] {inFile, new Variant(false), new Variant(true)} , new int[1]).toDispatch(); //打开word文件 //在word2003的vba文档中application有UserName属性。 String userName=app.getPropertyAsString("UserName"); System.out.println("用户名:"+userName); Dispatch selection=app.getProperty("Selection").toDispatch(); //得到一个组件 System.out.println("Selection"); Dispatch find = app.call(selection, "Find").toDispatch(); //查找什么文本 Dispatch.put(find, "Text", oldText); //替换文本 Dispatch.call(find,"ClearFormatting"); Dispatch.put(find, "Text", oldText); Dispatch.call(find, "Execute"); Dispatch.put(selection, "Text", newText); // Dispatch.call(app, "SaveAs", inFile); System.out.println("replace"); //把指定的值设置到指定的标签中去 Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch(); System.out.println("activedocument"); Dispatch bookMarks = app.call(activeDocument, "Bookmarks").toDispatch(); System.out.println("bookmarks"); boolean bookMarkExist1=Dispatch.call(bookMarks,"Exists",bookMarkKey).toBoolean(); if(bookMarkExist1==true){ System.out.println("exists bookmark!"); Dispatch rangeItem = Dispatch.call(bookMarks, "Item",bookMarkKey). toDispatch(); System.out.println("range item!"); Dispatch range = Dispatch.call(rangeItem, "Range").toDispatch(); System.out.println("range !"); //取标签的值 String bookMarkValue=Dispatch.get(range,"Text").toString(); bookMarkValue="test"; if(bookMarkValue!=null){ Dispatch.put(range, "Text", new Variant(bookMarkValue)); } } else{ System.out.println("not exists bookmark!"); } //保存文件 Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {tpFile, new Variant(0)} , new int[1]); //作为word格式保存到目标文件 Variant f = new Variant(false); Dispatch.call(doc, "Close", f); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); } 实例2:(.word->.html) 因为微软没有公开word源代码,所以直接用java流来读取word的后果是读出来的全是乱码。所以必须通过jacob这个中间桥 。当然也可用poi来读取。 先说用poi读取的方法吧。用poi读取的话,先要下载tm-extractors-0.4.jar百度一下可以找到。代码如下: import org.textmining.text.extraction.WordExtractor; try { FileInputStream fileinputstream = new FileInputStream( filepath); WordExtractor extractor = new WordExtractor(); temp =extractor.extractText(fileinputstream); System.out.println(temp+"==temp"); fileinputstream.close(); } catch (Exception ex) { System.out.println("FileNotFoundException error" + ex.getMessage()); } filepath为word文档路径,返回一个temp字符串。这样读出来的不是乱码了,但是效果并不如意。因为把word格式给丢掉了。再说用jacob. 先到官方网站上去下载:http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368 jacob.zip. 下载之后解压,把jacob.jar放到项目/web-inf/lib下面。把jacob .dll放到c:/windos/system32/以及java/jdk*.*/jre/bin下面。这样就算是配置完成了。说代码: import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public boolean ChageFormat (String FolderPath,String FileName){ String FileFormat = ""; System.out.println(FolderPath); FileFormat = FileName.substring(FileName.length()-4,FileName.length()); System.out.println(FileFormat); if(FileFormat.equalsIgnoreCase(".doc")) { String DocFile = FolderPath +"//"+ FileName; System.out.println("word文件路径:"+DocFile); //word文件的完整路径 String HtmlFile = DocFile.substring(0, (DocFile.length() - 4)) + ".htm"; System.out.println("htm文件路径:"+HtmlFile); //html文件的完整路径 ActiveXComponent app = new ActiveXComponent("Word.Application"); //启动word try { app.setProperty("Visible", new Variant(false)); //设置word程序非可视化运行 Dispatch docs = app.getProperty("Documents").toDispatch(); Dispatch doc = Dispatch.invoke(docs,"Open", Dispatch.Method, new Object[]{DocFile,new Variant(false), new Variant(true)}, new int[1]).toDispatch(); //打开word文件 Dispatch.invoke(doc,"SaveAs",Dispatch.Method, new Object[]{HtmlFile,new Variant(8)}, new int[1]); //作为htm格式保存文件 Dispatch.call(doc, "Close",new Variant(false)); //关闭文件 } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); //退出word程序 } //转化完毕 return true; } return false; } FolderPath为word存放路径。FileName为word名称。通过这个方法就把word文件转成的htm文件。这时候就可以用流来读取htm文件了,读出来的既不是乱码。并且带有格式。另外要强调的是jacob这个组件和jdk,以及windows版本都有关系。所以版本一定要匹配。否则会报错。版本的问题就要挨个去试了。没有捷径可走。 实例2:(拷贝word内容到新的word文件) import java.io.File; import com.jacob.com.*; import com.jacob.activeX.*; public class FileExtracter { public static void main(String[] args) { ActiveXComponent app = new ActiveXComponent("Word.Application"); String inFile = "c://test.doc"; String tpFile = "c://temp.htm"; String otFile = "c://temp.xml"; boolean flag = false; try { app.setProperty("Visible", new Variant(false)); Object docs = app.getProperty("Documents").toDispatch(); Object doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { inFile, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { tpFile, new Variant(8) }, new int[1]); Variant f = new Variant(false); Dispatch.call(doc, "Close", f); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); } } } 实例3:(动态生成表格及填写表格内容、设置页眉和页脚) import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class WordExtractor{ // 创建一个组件。 private ActiveXComponent MsWordApp = null; // 建立两个dispath. private Dispatch document = null; private Dispatch selection = null; // 构造函数 public WordExtractor(){ super(); } /** *//** * 开启word档案 * @param makeVisible * 显示或是不显示(true:显示;false:不显示) */ public void openWord(boolean makeVisible){ try{ // 打开word(如果word未开启时) if (MsWordApp == null){ MsWordApp = new ActiveXComponent("Word.Application"); } // 设置word是可见或不可见(true:显示;false:不显示) Dispatch.put(MsWordApp, "Visible", new Variant(makeVisible)); } catch (RuntimeException e){ // TODO Auto-generated catch block e.printStackTrace(); } } /** *//** * 建立word的文本内容 * */ public void createNewDocument(){ // 建立一个Dispatch对象 Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch(); document = Dispatch.call(documents, "Add").toDispatch(); } /** *//** * 格式化时间字符串 * @param date_str * 原始时间字符串 * @return 修改后的字符串 */ public String ReplaceDateStr(String date_str){ String str = ""; String[] date_str_arr = Tool.splitString(date_str, "-"); // String[] date_str_arr =null; if (date_str_arr.length > 0){ str = date_str_arr[0] + "/" + date_str_arr[1] + "/"+ date_str_arr[2]; } else{ str = date_str; } return str; } /** *//** * 写入资料到word中 * @param title * 本文标题 * @param textToInsertarr * 要写入的内容数组集合 */ public void insertText(String title, ArrayList textToInsertarr){ selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象 Dispatch alignment = Dispatch.get(selection, "ParagraphFormat") .toDispatch(); // 行列格式化需要的对象 Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象 Dispatch font1 = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象 // Dispatch image = Dispatch.get(selection, // "InLineShapes").toDispatch(); //放入图片需要的对象 // String mm = // "D:"+File.separator+"IRMAS_COMBINE"+File.separator+"images"+File.separator+"mis_login.jpg"; // //图片来源路径 // 格式化时间 java.util.Date ddate = new Date(); SimpleDateFormat sdf2 = new SimpleDateFormat("dd-MM月-yy", java.util.Locale.TRADITIONAL_CHINESE); // oracle要的时间格式 Timestamp ts1 = new Timestamp(ddate.getTime()); String date_str = (ts1.toString()).substring(0, 10); String result_str = ReplaceDateStr(date_str); // 格式化后的时间 2008/04/27 // 文件标题 // Dispatch.call(selection, "TypeParagraph"); //空一行段落 Dispatch.put(alignment, "Alignment", "1"); // (1:置中 2:靠右 3:靠左) Dispatch.put(font1, "Bold", "1"); // 字型租体 Dispatch.put(font1, "Color", "1,0,0,0"); // 字型颜色(1,0,0,0=>红色 // 1,1,0,0=>棕色) // Dispatch.put(font, "Italic", "1"); //字型斜体 Dispatch.call(selection, "TypeText", title); // 写入标题内容 // 标题格行 Dispatch.call(selection, "TypeParagraph"); // 空一行段落 Dispatch.put(alignment, "Alignment", "3"); // (1:置中 2:靠右 3:靠左) Dispatch.put(selection, "Text", " "); Dispatch.call(selection, "MoveDown"); // 游标往下一行 // 插入图片 /**//* * Dispatch.call(selection, "TypeParagraph"); Dispatch.put(alignment, * "Alignment", "2"); //(1:置中 2:靠右 3:靠左) Dispatch.call(image, * "AddPicture", mm); //写入图片 */ /**//*--------不输入到表格时------------ //主要内容(即参数数组中的值) for(int i=0;i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值