前不久做了excel的导入导出并对其进行解析。这也是第一次做这个,查阅了一堆资料,方法也有很多种,大多数的方法就是使用poi或者jxl,由于一开始poi的jar包怎么都找不对,而且有人说jxl消耗内存多,所以我直接选择了jxl进行开发,开发的过程中也很顺畅。
excel的解析过程主要如下列代码:
INetDao nd=DaoFactory.getNd();
Connection con=DBUtil.getConnection();
String sql="insert into net_bitch(fk_id,TIMES,SERVICE_NAME,SERVICE_RATE) values(?,?,?,?)";
PreparedStatement ps=null;
try {
ps=con.prepareStatement(sql);
//path是路径,通过String path=ServletActionContext.getServletContext().getRealPath("/upload");获取
//File.separator是斜杠,这里不使用“\" 是为了适应linux和windows环境,两个环境下的斜杠不同
//uploadName是文件的名字
InputStream is = new FileInputStream(path+File.separator+uploadName);
Workbook wb = Workbook.getWorkbook(is);
//获取excel的第一个sheet
Sheet sheet = wb.getSheet(0);
// 获取表格总列数
int rsColumns = sheet.getColumns();
// 获取表格总行数
int rsRows = sheet.getRows();
for(int i=1;i<rsRows;i++){
Cell[] cells = sheet.getRow(i);//获取第i行的数据
ps.setObject(1, fkId);
int j;
if(!"".equals(cells[1].getContents())){//用来判断单元格是否为空
for(j=0;j<rsColumns;j++){
ps.setObject(j+2, cells[j].getContents());//获取第j行j列的数据
}
ps.execute();
}else
continue;
}
wb.close();
is.close();
整个开发过程都很顺利,而且也可以运行,但当导入的Excel版本不同时,导入以xls结尾的excel时候可以,导入以xlsx结尾的excel却出现了错误,百度的时候,很多人说jxl解决不了版本的问题,只有poi可以解决,无奈只能改用poi解决这个问题;
发现poi有一个父类Workbook,下边有两个子类,HSSFWorkbook与XSSFWorkbook,前一个可以用来解析以.xls结尾的excel,后一个可以用来解析.xlsx结尾的excel,当然poi与jxl还有一些别的区别,总共总结出四点,具体会在下边的代码中标出(会标出区别1到区别4):
InputStream is = new FileInputStream(path+File.separator+uploadName);
Workbook wb=null;
if(uploadName.endsWith(".xls"))
wb=new HSSFWorkbook(is); //处理以.xls结尾的excel
else
wb=new XSSFWorkbook(is);//处理以.xlsx结尾的excel
Sheet sheet=wb.getSheetAt(0);//获取第一个sheet
//区别1:获取列数的方法不同,sheet.getRow(0)这是以第一行为主,列数也是第一行的列数
int rsColumns=sheet.getRow(0).getPhysicalNumberOfCells();
//区别2:获取行数的方法不同,主要通过获取最后一行行数并且在此基础上加上1;
int rsRows=sheet.getLastRowNum()+1;
for(int i=1;i<rsRows;i++){
Row row=sheet.getRow(i);//获取第i行
int j;
//区别3:判断单元格是否为空的方法不同
if(row.getCell(1)!=null){
ps.setObject(1, fkId);
for(j=0;j<rsColumns;j++){
if(j==2||j==4||j==6||j==8||j==11)
//区别4:在jxl中我们取单元格中的元数的时候全部当成是字符串进行取,但poi中单元格是区分类型的,比如此处是获取字符串类型的元素
ps.setObject(j+2, row.getCell(j).getStringCellValue());
else
//区别4:此处获取数字类型的元素
ps.setObject(j+2,row.getCell(j).getNumericCellValue());
}
ps.execute();
ps.clearBatch();
}else
continue;
}