分享

java应用jcom将word转pdf

 用勿龍潛 2015-02-12
Java代码  收藏代码
  1. java应用jcom将word转pdf  
  2.   
  3. 经验   2009-03-01 09:47   阅读528   评论0     
  4. 字号: 大大  中中  小小   
  5. 在JAVA中使用JCOM和JXL注意要点:   
  6.   
  7. 1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll。(jcom下载地址(http://sourceforge.net/projects/jcom))  
  8.   
  9. 2)要把jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下)   
  10.   
  11. 3)你的机器需要安装ms office以及acrobat(不是reader)注:Acrobat Reader 软件是一个用于浏览 PDF 文件的实用程序;而 Adobe Acrobat 4.0 软件则用来创建和改善 PDF 文件,它是解决信息的共享、检查和发布的完整工具。   
  12.   
  13. 把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会抛出一个JComException的异常)   
  14.   
  15. 1)首先应该判断一个传进来的路径是Word 或是 Excel 还是其他的东东。   
  16.   
  17. if(path.endsWith(".doc")){   
  18.   
  19.    ......   
  20.   
  21. }   
  22.   
  23. 注:如果是excel后缀是".xls";   
  24.   
  25. 2)然后你要有两个对象:   
  26.   
  27. ReleaseManager rm = new ReleaseManager();   
  28.   
  29. IDispatch xlsApp=null;   
  30.   
  31. 注:ReleaseManager相当于一个容器,与你机器上的所有JCOM组建交互,根据你传的参数他会去寻找你机器上的所有JCOM能操作的组建;   
  32.   
  33.     IDispatch 可以理解为一个对象,所有的东东都是对象;   
  34.   
  35. 3)你要让他知道你要和EXCEL交互你得这样做   
  36.   
  37. xlsApp = new IDispatch(rm, "Excel.Application");   
  38.   
  39. 4)接着要得到一个Workbooks(工作薄)   
  40.   
  41. IDispatch excel = (IDispatch) xlsApp.get("Workbooks");   
  42.   
  43. 5)设置当前对象是否可见   
  44.   
  45. xlsApp.put("Visible"new java.lang.Boolean(false));   
  46.   
  47. 6)得到工作薄以后要打开   
  48.   
  49. IDispatch workbook = (IDispatch) excel.method("open"new Object[] { FilePath(EXCEL存放的路径) });   
  50.   
  51. 7)判断文件是否存在如果存在则删除   
  52.   
  53. File f = new File(outPath);   
  54.   
  55. if (f.exists())   
  56.   
  57.     f.delete();   
  58.   
  59. 8)将工作薄另存为   
  60.   
  61. workbook.method("saveAs"new Object[] { outPath, new Integer(9) });   
  62.   
  63. 9)获得一个工作薄(workbook)下的所有工作表(Sheets)   
  64.   
  65. IDispatch sheets = (IDispatch) workbook.get("Sheets");   
  66.   
  67. 注:得到的是一个数组;   
  68.   
  69. 10)获得工作表(Sheets)的总数   
  70.   
  71. int sheetsCount = Integer.parseInt(sheets.get("Count").toString());   
  72.   
  73. 11)得到每个工作表(Sheets)的名称   
  74.   
  75. for(int sheetInx=1;sheetInx <= sheetsCount;sheetInx++) {   
  76.   
  77. IDispatch sheet = (IDispatch) sheets.get("item"new Object[] { new Integer(sheetInx) });   
  78.   
  79. String sheetName = sheet.get("name").toString();   
  80.   
  81. }   
  82.   
  83. 注意:excel都是从1开始遍历 而不是从0开始 所以for里面有多种写法看自己怎么顺手怎么写;   
  84.   
  85.       遍历工作表除了传索引还能传工作表名称:IDispatch sheet = ((IDispatch) sheets.get("item"new Object[] { sheetName }));   
  86.   
  87. 12)获得正在活动的工作表(sheet)   
  88.   
  89. IDispatch asheet = (IDispatch) xlsApp.get("ActiveSheet");   
  90.   
  91. 注:xlsApp是从ReleaseManager里面获得EXCEL对象的一个IDispatch对象   
  92.   
  93.     如果是获得sheets要先获得工作薄(Workbook)然后用工作薄(Workbook)获得他下的所有工作表(sheets)   
  94.   
  95. 13)获得工作表里面的所有行总数(6万多行吧)   
  96.   
  97. IDispatch row = (IDispatch)cursheet.get("Rows");   
  98.   
  99. int rows = Integer.parseInt(row.get("Count").toString());   
  100.   
  101. 14)获得工作表里面的所有列总数(256列)   
  102.   
  103. IDispatch col = (IDispatch)sheet.get("Columns");   
  104.   
  105. int cols = Integer.parseInt(col.get("Count").toString());   
  106.   
  107. 15)获得工作表里面可视的所有行总数   
  108.   
  109. IDispatch row = (IDispatch) ((IDispatch)cursheet.get("UsedRange")).get("Rows");   
  110.   
  111. int rows = Integer.parseInt(row.get("Count").toString());   
  112.   
  113. 16)获得工作表里面可视的所有列总数   
  114.   
  115. IDispatch col = (IDispatch) ((IDispatch)cursheet.get("UsedRange")).get("Columns");   
  116.   
  117. int cols = Integer.parseInt(col.get("Count").toString());   
  118.   
  119. 17)获得行列以后要获得里面的内容(这里用的rows 和 cols就是上面所得的)   
  120.   
  121. String cellVal="";   
  122.   
  123. String cellTxt="";   
  124.   
  125. String hasFormula= "";   
  126.   
  127. String cellFormula="";   
  128.   
  129. for(int i=0;i<rows;i++){   
  130.   
  131.    for(int j=0;j<cols;j++){   
  132.   
  133. IDispatch cells = (IDispatch) cursheet.get("Cells"new Object[] { new Integer(i+1),new Integer(j+1) });   
  134.   
  135. cellVal = cells.get("value").toString();   
  136.   
  137. cellTxt = cells.get("text").toString();   
  138.   
  139. hasFormula = cells.get("HasFormula").toString();   
  140.   
  141. cellFormula = cells.get("FormulaR1C1").toString();   
  142.   
  143.    }   
  144.   
  145. }   
  146.   
  147. 注:这个遍历的时候也是从1开始;   
  148.   
  149.     cells.get("value")获得的是浮点数格式 如果你输入的是1,得到的会是1.0;   
  150.   
  151.     cells.get("text")获得的是本身,你输入什么获得的就是什么;   
  152.   
  153.     cells.get("HasFormula")判断是否是公式,如果单元格里是公式则返回真(true),如果不是公式则返回假(false);   
  154.   
  155.     cells.get("FormulaR1C1")获得公式,获得单元格里公式的内容;   
  156.   
  157. 18)保护工作表   
  158.   
  159. asheet.method("Protect"new Object[] { password, new java.lang.Boolean(true), new java.lang.Boolean(true) });   
  160.   
  161. 注:Protect后有N多参数 第1--3个分别是 password,DrawingObjects,Contects。   
  162.   
  163. 19)解工作表保护   
  164.   
  165. asheet.method("Unprotect"new Object[] { password });   
  166.   
  167. 20)在finally里面写关闭   
  168.   
  169. if (xlsApp != null) {   
  170.   
  171.     ((IDispatch) xlsApp.get("ActiveWorkbook")).put("Saved"new java.lang.Boolean(true)); //保存工作薄   
  172.   
  173.     xlsApp.method("quit"null);    //quit 是关闭的是整个EXCEL   
  174.   
  175.     xlsApp = null;   
  176.   
  177. }   
  178.   
  179. rm.release();   
  180.   
  181. rm = null;   
  182.   
  183. 21)关闭根据情况也写在finally 里面   
  184.   
  185. workbook.method("close"null);   
  186.   
  187. xlsApp.method("quit"null);   
  188.   
  189. xlsApp=null;   
  190.   
  191. rm.release();   
  192.   
  193. rm = null;   
  194.   
  195. 注:workbook.method("close"null);关闭的是Workbook里的工作表;   
  196.   
  197.     xlsApp.method("quit"null);关闭的是整个工作薄   
  198.   
  199. 注意:   
  200.   
  201. 关闭的时候一定要加上   
  202.   
  203. //rm 就是ReleaseManager的实例   
  204.   
  205. rm.release();   
  206.   
  207. rm = null;   
  208.   
  209. 如果你打开EXCEL不加上面两句的话在进程里面还运行着EXCEL.EXE   
  210.   
  211. 附:word转pdf实例:  
  212.   
  213. package com.etong.util;  
  214.   
  215. import jp.ne.so_net.ga2.no_ji.jcom.IDispatch;  
  216.        import jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager;  
  217.   
  218. public class Office2Pdf {  
  219.           
  220.         public void createPDF(String officePath,String pdfPath) throws Exception {  
  221.                 ReleaseManager rm = null;  
  222.                 IDispatch app = null;  
  223.                 try {  
  224.                         rm=new ReleaseManager();  
  225.                         app = new IDispatch(rm, "PDFMakerAPI.PDFMakerApp");  
  226.                         app.method("CreatePDF",new Object[]{officePath,pdfPath});  
  227.                 } catch (Exception e) {  
  228.                         e.printStackTrace();  
  229.                 } finally {  
  230.                         try {  
  231.                                 app=null;  
  232.                                 rm.release();  
  233.                                 rm = null;  
  234.                         } catch (Exception e) {  
  235.                                 throw e;  
  236.                         }  
  237.                 }                 
  238.         }  
  239.           
  240.         public static void main(String[] args) throws Exception {  
  241.                 Office2Pdf one=new Office2Pdf();  
  242.                 one.createPDF("D:\\an\\11.doc","D:\\an\\11.pdf");  
  243.         }    
  244.  }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多