锁定老帖子 主题:jacob操作word excel
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-05
项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下: 先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。 下载地址:http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368 1、我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件 三、使用Jacob转换Word,Excel为HTML JAVA代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class TransformFiletoHtml { int WORD_HTML = 8; int WORD_TXT = 7; int EXCEL_HTML = 44; /** * WORD转HTML * @param docfile WORD文件全路径 * @param htmlfile 转换后HTML存放路径 */ public void wordToHtml(String docfile, String htmlfile) { ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word try { app.setProperty("Visible", new Variant(false)); 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(); Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(WORD_HTML) }, new int[1]); Variant f = new Variant(false); Dispatch.call(doc, "Close", f); } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); } } /** * EXCEL转HTML * @param xlsfile EXCEL文件全路径 * @param htmlfile 转换后HTML存放路径 */ public void excelToHtml(String xlsfile, String htmlfile) { ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动excel try { app.setProperty("Visible", new Variant(false)); Dispatch excels = app.getProperty("Workbooks").toDispatch(); Dispatch excel = Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[] { xlsfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch(); Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(EXCEL_HTML) }, new int[1]); Variant f = new Variant(false); Dispatch.call(excel, "Close", f); } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); } } /** * /删除指定文件夹 * @param folderPath 文件夹全路径 * @param htmlfile 转换后HTML存放路径 */ public void delFolder(String folderPath) { try { delAllFile(folderPath); //删除完里面所有内容 String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); myFilePath.delete(); //删除空文件夹 } catch (Exception e) {e.printStackTrace();} } /** * /删除指定文件夹下所有文件 * @param path 文件全路径 */ public boolean delAllFile(String path) { boolean flag = false; File file = new File(path); if (!file.exists()) { return flag; } if (!file.isDirectory()) { return flag; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件 delFolder(path + "/" + tempList[i]);//再删除空文件夹 flag = true; } } return flag; } } 调用JAVA代码: public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub TransformFiletoHtml trans = new TransformFiletoHtml(); trans.wordToHtml("D:\\sinye.doc", "D:\\sinye.html"); } } 只写了一个测试word转html的,excel转html的同理,在TransformFiletoHtml类中,写了两个方法,一个是删除文件夹的方法(delFolder()),一个是删除文件夹下所有文件的方法(delAllFile())。写这个的目的是出于:在word或者excel转html的过程中,除了生成制定的html页面外,jacob组件会生成一些转换html页面时相关的其它页面,但是这些相关的其它页面不是我们所需要的,因此想把它删除,其实不删除也可以,只是看着不爽,在测试中,发现,word有时不会生成这样的文件,而且即使生成了,也能删除掉,但是excel生成的文件却不能删除,还望高手们给予解答。 另外,在你将excel转换html时,如果你的代码没问题,转换时,老提示什么存在用户区域的安全设置这什么的,会让你选择继续转换,还是取消。这是因为你转换的那个excel中写了保护,解决办法是在excel的工具->保护->允许用户编辑区域,删除里面的所有保护。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-02-05
很好啊。学习了一下,对了,楼主可以问你一下如果我要查找word的内容,如
范、刹、镶、裹、泻、镀、润、杰、这些文字在word中找出来,再标注或是加一个下划线,应该怎么做了 |
|
返回顶楼 | |
发表时间:2010-02-05
elvishehai 写道 很好啊。学习了一下,对了,楼主可以问你一下如果我要查找word的内容,如
范、刹、镶、裹、泻、镀、润、杰、这些文字在word中找出来,再标注或是加一个下划线,应该怎么做了 只是给你提供一种思路,我以前的项目中也有类似的要求。在你将word转成html时,刚转成的html作为临时文件,然后通过java的文件读写流,将其中的内容置换成你要的内容,然后再保存为新的文件,删除那个旧的临时文件,比如转换出来的html里想将"我爱JAVA"换成"我爱中国",或者将<td>里的内容换成不换行<td nowrap>。你的那个要求以此类推就可以了。详见如下的JAVA代码:注意红色部分,就是你要改动的地方 /** * * @Function //CreateFormallyHtml * @Description //读取临时生成的网页文件,修改其中的内容后生成正式的网页文件,并删除临时网页文件 * @Input //临时网页文件全路径,新网页文件全路径 * @Return //布尔型,成功则返回true,否则返回false */ public boolean CreateWordHtml(String strFile,String strNewHtml) { Boolean blStatus=false; String strInfo=null; //读取网页文件 try { FileInputStream fis=new FileInputStream(strFile); InputStreamReader isr=new InputStreamReader(fis); BufferedReader buf=new BufferedReader(isr); int i=0; String c; try { while((c=buf.readLine())!=null) { if(i==0){strInfo=c;} else{strInfo=strInfo+"\n"+c;} i++; } buf.close(); isr.close(); fis.close(); } catch (IOException e){e.printStackTrace();} } catch (FileNotFoundException e) {e.printStackTrace();} //处理网页内容,并重新生成新的网页文件 try { File write = new File(strNewHtml); BufferedWriter bw = new BufferedWriter(new FileWriter(write)); [color=red]strInfo=strInfo.replace("我爱JAVA","我爱中国"); strInfo=strInfo.replace("<td","<td nowrap");[/color] bw.write(strInfo); bw.close(); blStatus=true; } catch (IOException ee) {System.out.println(ee.getMessage());} //删除临时生成的网页文件及其附属文件夹 try { File fl = new File(strFile); if(fl.exists() && fl.isFile()){fl.delete();}//删除临时网页 int intLen=strFile.lastIndexOf("."); String strFileFolder=strFile.substring(0,intLen+1)+"files"; delFolder(strFileFolder);//删除临时网页附属的文件夹 } catch (Exception ee) {System.out.println(ee.getMessage());} return blStatus; } |
|
返回顶楼 | |
发表时间:2010-02-05
strInfo=strInfo.replace("我爱JAVA","我爱中国");
strInfo=strInfo.replace("<td","<td nowrap"); 就这两句,不知道为什么没变红色,反而用代码的形式给显示出来了! |
|
返回顶楼 | |
发表时间:2010-02-24
jacob都1.9了啊,07年的时候在jacob和poi之间进行了比较,最终选择了poi
|
|
返回顶楼 | |
浏览 10861 次