1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java excel解析:poi与jxl的区别(excel版本问题:xls xlsx)

java excel解析:poi与jxl的区别(excel版本问题:xls xlsx)

时间:2023-12-08 13:37:16

相关推荐

java excel解析:poi与jxl的区别(excel版本问题:xls xlsx)

前不久做了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;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。