① jxl 只能解析 xls 文件,不能 解析 xlsx 文件; poi 则是可以同时兼容xls 和xlsx两种文件类型,这是要注意的第一个点;
② 这两个方法的读取方式不一样,jxl 读取的是 先读列 然后循环获取的该列每行的信息。poi 读取是 先读行,再循环获取每列的信息。如下图:

那我们应该怎么去做选择呢?如果只需要xls的解析,可以使用 jxl (因为poi蛮容易出异常的jar冲突之类的,而且读取的方式不太舒服,如果读取完还要做判断操作写入数据库,就会写的比较复杂),如果需要兼容就选择poi方式读取。
-
net.sourceforge.jexcelapi -
jxl -
2.6.12

- package com.olio;
-
- import jxl.Sheet;
- import jxl.Workbook;
- import jxl.read.biff.BiffException;
-
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLConnection;
- import java.net.URLDecoder;
-
- public class TestDemo {
- public void readExcel(String path,String strURL) {
- try {
- /*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
- URL url = new URL(strURL);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- // 设置超时间为3秒
- conn.setConnectTimeout(3*1000);
- // 防止屏蔽程序抓取而返回403错误
- conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
- // 获取输入流
- InputStream inputStream = conn.getInputStream();
- Workbook workbook = Workbook.getWorkbook(inputStream);
- ......*/
-
- // 解析路径的file文件
- Workbook workbook = Workbook.getWorkbook(new File(path));
- // 获取第一张工作表
- Sheet sheet = workbook.getSheet(0);
- // 循环获取每一行数据 因为默认第一行为标题行,我们可以从 1 开始循环,如果需要读取标题行,从 0 开始
- // sheet.getRows() 获取总行数
- for (int i = 1; i < sheet.getRows(); i++) {
- // 获取第一列的第 i 行信息 sheet.getCell(列,行),下标从0开始
- String id = sheet.getCell(0, i).getContents();
- // 获取第二列的第 i 行信息
- String name = sheet.getCell(1,i).getContents();
- // 获取第三列的第 i 行信息
- String sex = sheet.getCell(2, i).getContents();
- // 获取第四列的第 i 行信息
- String grade = sheet.getCell(3, i).getContents();
-
- // 存入本地或者是存入对象等根据给人需求自己定就行,创建对象存储,然后加入集合中
- // ......
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (BiffException e) {
- e.printStackTrace();
- }
- }
-
- }
-
-
org.apache.poi -
poi -
3.17 -
-
-
org.apache.poi -
poi-ooxml -
3.17 -

- package com.olio;
-
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.ss.usermodel.*;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLConnection;
- import java.net.URLDecoder;
-
- public class TestDemo {
- public void readExcel(String path,String strURL) {
- try {
- /*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
- URL url = new URL(strURL);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- // 设置超时间为3秒
- conn.setConnectTimeout(3*1000);
- // 防止屏蔽程序抓取而返回403错误
- conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
- // 获取输入流
- InputStream inputStream = conn.getInputStream();
- ......*/
-
- // 获取文件输入流
- InputStream inputStream = new FileInputStream(path);
- // 定义一个org.apache.poi.ss.usermodel.Workbook的变量
- Workbook workbook = null;
- // 截取路径名 . 后面的后缀名,判断是xls还是xlsx
- // 如果这个判断不对,就把equals换成 equalsIgnoreCase()
- if (path.substring(path.lastIndexOf("." + 1)).equals("xls")){
- workbook = new HSSFWorkbook(inputStream);
- }else if (path.substring(path.lastIndexOf(" . " + 1)).equals("xlsx")){
- workbook = new XSSFWorkbook(inputStream);
- }
-
- // 获取第一张表
- Sheet sheet = workbook.getSheetAt(0);
- // sheet.getPhysicalNumberOfRows()获取总的行数
- // 循环读取每一行
- for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
- // 循环读取每一个格
- Row row = sheet.getRow(i);
- // row.getPhysicalNumberOfCells()获取总的列数
- for (int index = 0; index < row.getPhysicalNumberOfCells(); index++) {
- // 获取数据,但是我们获取的cell类型
- //代码上的内容自己根据实际需要自己调整就可以,这里只是展示一个样式···~
- Cell cell = row.getCell(index);
- // 转换为字符串类型
- cell.setCellType(CellType.STRING);
- // 获取得到字符串
- String id = cellId.getStringCellValue();
-
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- }
Java读取excel的方式,一篇文章看懂(详细)_java读取excel文件_OliO_CHEN的博客-CSDN博客