在Java中利用JCOM实现仿Excel编程详解
2024年03月04日
在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