一.HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook
Apache POI包中的HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook的区别如下:
HSSFWorkbook:一般用于操作Excel2003以前(包括2003)的版本,扩展名是.xls。
XSSFWorkbook:一般用于操作Excel2007及以上的版本,扩展名是.xlsx。
SXSSFWorkbook(POI 3.8+版本):一般用于大数据量的导出。比如数据量超过5000条即可考虑这种工作表
第一种:HSSFWorkbook
针对EXCEL 2003版本,扩展名为.xls,此种的局限就是导出的行数最多为65535行。因为导出行数受限,不足7万行,所以一般不会发送内存溢出(OOM)的情况
第二种:XSSFWorkbook
这种形式的出现是由于第一种HSSF的局限性产生的,因为其导出行数较少,XSSFWorkbook应运而生,其对应的是EXCEL2007+ ,扩展名为.xlsx ,最多可以导出104万行,不过这样就伴随着一个问题–OOM内存溢出。因为使用XSSFWorkbook创建的book sheet row cell 等是存在内存中的,并没有持久化到磁盘上,那么随着数据量的增大,内存的需求量也就增大。那么很有可能出现 OOM了,那么怎么解决呢?
第三种:SXSSFWorkbook poi.jar 3.8+
SXSSFWorkbook可以根据行数将内存中的数据持久化写到文件中。
此种的情况就是设置最大内存条数,比如设置最大内存量为5000行,
new SXSSFWookbook(5000),当行数达到 5000 时,把内存持久化写到文件中,以此逐步写入,避免OOM。这样就完美解决了大数据下导出的问题
另注:HSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,
XSSFWorkbook的Excel Sheet导出条数上限(>=2007版)是1048576行,16384列,
如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。实际上上万条数据, 甚至上千条数据就可以考虑使用 SXSSFWorkbook了。
附apache poi 官网地址
Apache POI - Component Overview
二.上代码
1.POI坐标依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2.POI核心API概述
2.1 创建工作簿对象
Workbook workbook=new XSSFWorkbook(path)
2.2 获取execl表中的sheet对象
Sheet sheet = workbook.getSheetAt(0);
2.3 获取excel文件中所有物理数据的有效行数
int rows = sheet.getPhysicalNumberOfRows()
2.4 获取行对象
Row row =sheet.getRow(i)
2.5 获取行中的列对象
Cell cell=row.getCell(0)
2.6 获取列的字符串类型数据
cell.getStringCellValue()
2.7 获取列的数字类型字段数据
cell.getNumericCellValue()
2.8 将单元格的内容转换为字符串类型数据,配合3.6使用
cell.setCellType(CellType.STRING);
3.实操代码
public R<String> batchSaveUserInfo(MultipartFile multipartFile){
R<String> result = new R<>();
result.setCode(200);
result.setSuccess(false);
Workbook workbook = null;
InputStream inputStream = null;
try {
//传入的MultipartFile类型的excel文件
inputStream = multipartFile.getInputStream();
String originalFilename = multipartFile.getOriginalFilename();
//判断是否为2017版本,如果是xlsx,就是XSSFWorkbook,如果是xls,就是HSSFWorkbook
if (originalFilename.matches("^(?i)(xlsx)$")) {
workbook = new XSSFWorkbook(inputStream);
} else {
workbook = new HSSFWorkbook(inputStream);
}
//得到excel第一个工作表sheet对象
Sheet sheet = workbook.getSheetAt(0);
//得到总行数
int rowNum = sheet.getPhysicalNumberOfRows();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (workbook != null) {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
result.setMessage("文件解析失败");
return result;
}
————————————————