java应用jcom将word转pdf

  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.          }     

你可能感兴趣的:(java,jdk,工作,Excel,Office)