前言
做客户模块的时候需要用到Excel的批量导入,而当前使用的较多的是apache下的POI,因为微软公司的Excel表格有两种格式,分别是xls和xlsx(区别是后者使用xml来格式话保存的,压缩的更好),本文以xlsx文件格式为例,其实两者都是一样的。
依赖
两个必须加,因为前一个依赖的xls的,xlsx依赖在后面一个依赖中。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12-beta1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
核心类
- XSSFWorkbook 类似于创建一个工作薄
- XSSFSheet 一个Excel表的内容
- XSSFRow 表的一行
- XSSFCell 每行的一个单元
说明:以上就是poi对Excel操作的核心四个类,从这名字就可以看出来其作用了。流程就是使用文件输入流获取Excel文件放入XSSFWorkbook中,再通过方法getNumberOfSheets()获取XSSFSheet个数,继续通过getLastRowNum()获取单元格数量,最后就是getCell()来取值就行了。
核心代码如下:
//path为xlsx文件路径
InputStream inputStream = new FileInputStream(path);
//add the Workbook
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
Member member = null;
User user = null;
List<Member> list = new ArrayList<Member>();
// Read the Sheet
for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
if (xssfSheet == null) {
continue;
}
// Read the Row
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
if (xssfRow != null) {
member = new Member();
user = new User();
XSSFCell name = xssfRow.getCell(0);
XSSFCell userId = xssfRow.getCell(1);
XSSFCell statusId = xssfRow.getCell(2);
XSSFCell phoneNumber = xssfRow.getCell(3);
XSSFCell typeId = xssfRow.getCell(4);
XSSFCell industryId = xssfRow.getCell(5);
XSSFCell areaId = xssfRow.getCell(6);
XSSFCell address = xssfRow.getCell(7);
/*中间省略一部分*/
user.setUsername(getValue(userId));
member.setUser(user);
list.add(member);
}
}
}
return list;
}
后记
读取Excel表格数据跟简单,就是几个类的调用,还是挺方便的,还有一点说明一下,对于xls文件就是那个老版本,使用的方式一样,只是名字不同而已,分别对应HSSFWorkbook,HSSFSheet,HSSFRow,HSSFCell