在Java中利用JCOM实现仿Excel编程详解

  在JAVA中使用JCOM和JXL注意事项:
  1.在你的lib下演jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll。
  2.假设jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下)
  把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会发送一个JComException的异常)
  (1)首先应该判断一个传入的路径是Word还是Excel还是其他的东东。
  if(path.endsWith(".doc")){
  ......
  }
  注:如果是excel后缀是".xls";
  (2)然后你闻两个对象:
  ReleaseManager rm=new ReleaseManager();
  IDispatch xlsApp=null;
  注:ReleaseManager实际上是一个容器,与你机器上的所有JCOM能力的构建交互,根据你传的参数他会去寻找你机器上的所有JCOM能的操作;
  IDispatch可以理解为一个对象,所有的东东都是对象;
  (3)你要让他知道你要和EXCEL交互你得这样做
  xlsApp=new IDispatch(rm,"Excel.Application");
  (4)继续要获取一个Workbooks(工作薄)
  IDispatch excel=(IDispatch)xlsApp.get("Workbooks");
  (5)设置当前对象是否可见
  xlsApp.put("Visible",new java.lang.Boolean(false));
  (6)得到工作薄以后要打开
  IDispatch workbook=(IDispatch)excel.method("open",new Object[]{FilePath(EXCEL货架的路径)});
  (7)判断文件是否存在如果存在则删除
  File f=new File(outPath);
  if(f.exists())
  f.delete();
  (8)将工作薄另存为
  workbook.method("saveAs",new Object[]{outPath,new Integer(9)});
  (9)获得一个工作薄(workbook)下的所有工作表(Sheets)
  IDispatch Sheets=(IDispatch)workbook.get("Sheets");
  注:是得到一个备份;
  (10)获取工作表(Sheets)的总数
  int SheetsCount=Integer.parseInt(sheets.get("Count").toString());
  (11)获取每个工作表(Sheets)的名称
  for(intsheetInx=1;sheetInx<=sheetsCount;sheetInx++){
  IDispatchsheet=(IDispatch)sheets.get("item",new Object[]{new Integer(sheetInx)});
  StringsheetName=sheet.get("名称").toString();
  }
  注意:excel都是从1开始遍历而不是从0开始;
  遍历工作表除了传索引还能传工作表名称:
  IDispatchsheet=((IDispatch)sheets.get("item",new Object[]{sheetName}));
  (12)获得当前活动的工作表(sheet)
  IDispatch asheet=(IDispatch)xlsApp.get("ActiveSheet");
  注:xlsApp是从ReleaseManager里面获得EXCEL对象的一个​​IDispatch对象
  如果是获得sheets要先获得工作薄(Workbook)然后用工作薄(Workbook)获取他下的所有工作表(sheets)
  (13)获取工作表里面的所有行总数(6万多行吧)
  IDispatch row=(IDispatch)cursheet.get("Rows”);
  int rows=Integer.parseInt(row.get("Count").toString());
  (14)获取工作表里面的所有列总数(256列)
  IDispatch col=(IDispatch)sheet.get("Columns");
  int cols=Integer.parseInt(col.get("Count").toString());
  (15)获取工作表里面可视的所有行总数
  IDispatch row=(IDispatch)((IDispatch)cursheet.get("UsedRange")).get("Rows");
  int rows=Integer.parseInt(row.get("Count").toString());
  (16)获取工作表里面可视的所有列总数
  IDispatch col=(IDispatch)((IDispatch)cursheet.get("UsedRange")).get("Columns");
  int cols=Integer.parseInt(col.get("Count").toString());
  (17)获得行列以后要获得里面的内容(这里用的rows和cols就是上面获得的)
  String cellVal="";
  字符串cellTxt="";
  字符串有公式=“”;
  字符串单元格公式=“”;
  for(int i=0;i<rows;i++){
  for(int j=0;j<cols;j++){
  IDispatch cells=(IDispatch)cursheet.get("Cells",new Object[]{
  new Integer(i+1),新整数(j+1)});
  cellVal=cells.get("value").toString();
  cellTxt=cells.get("text").toString();
  hasFormula=cells.get("HasFormula").toString();
  cellFormula=cells.get("FormulaR1C1").toString();
  }
  }
  注:这次游览的时候也是从1开始;
  cells.get("value")获得的是浮点数格式如果你输入的是1,得到的就会是1.0;
  cells.get("text")获得的是本身,你输入什么获得的就是什么;
  cells.get("HasFormula")判断是否是公式,如果单元格是公式则返回真(true),如果不是公式则返回假(false);
  cells.get("FormulaR1C1")获取公式,获取单元Gri公式的内容;
  (18)保护工作表
  asheet.method("Protect",new Object[]{
  password,new java.lang.Boolean(true),new java.lang.Boolean(true)
  });
  注:Protect后有N多参数第1--3个分别是password,DrawingObjects,Contects。
  (19)解工作表保护
  asheet.method("Unprotect",new Object[]{password});
  (20)在最后里面写关闭
  if(xlsApp!=null){
  ((IDispatch)xlsApp.get("ActiveWorkbook")).put("Saved",new java.lang.Boolean(true));
  //保存工作薄
  xlsApp.method("quit",null);//退出是关闭整个EXCEL
  xlsApp=null;
  }
  rm.release();
  rm=空;
  (21)关闭根据情况也写在最后里面
  workbook.method("close",null);
  xlsApp.method("退出",null);
  xlsApp=空;
  rm.release();
  rm=null;
  注:workbook.method("close",null);关闭是Workbook里的工作表;
  xlsApp.method("quit",null);关闭是整个工作
  注意:
  关闭的时候一定要加上
  //rm就是ReleaseManager的实例
  rm.release();
  rm=null;
  如果你打开EXCEL不加上面两句的话在进程里面还运行着EXCEL.EXE