POI导出Excel的三种 workbook的区别
HSSFWorkbook:
针对EXCEL 2003版本,扩展名为.xls,此种的局限就是导出的行数最多为65535行。因为导出行数受限,不足7万行,所以一般不会发送内存溢出(OOM)的情况
XSSFWorkbook:
其对应的是EXCEL2007+ ,扩展名为.xlsx ,这种形式的出现是由于第一种HSSF的局限性产生的,因为其导出行数较少,XSSFWorkbook应运而生,最多可以导出104万行。
不过这样就伴随着一个问题–OOM内存溢出。因为使用XSSFWorkbook创建的book sheet row cell 等是存在内存中的,并没有持久化到磁盘上,那么随着数据量的增大,内存的需求量也就增大。那么很有可能出现 OOM了,那么怎么解决呢?
SXSSFWorkbook:
SXSSFWorkbook可以根据行数将内存中的数据持久化写到文件中。(用内存换导出的数据量)
此种的情况就是设置最大内存条数,比如设置最大内存量为5000行, new SXSSFWookbook(5000),当行数达到 5000 时,把内存持久化写到文件中,以此逐步写入,避免OOM。这样就完美解决了大数据下导出的问题
maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
代码实现
@GetMapping("/exportData")
public void exportData(HttpServletResponse res){
service.exportData(res);
}
String[] header = {"编号","姓名"};
@Override
public void exportData(HttpServletResponse res) {
List<Goods> goods = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Goods good = new Goods();
good.setId(String.valueOf(i));
good.setName("我是第"+i+"号");
goods.add(good);
}
try(HSSFWorkbook workbook = new HSSFWorkbook()){
String fileName = "我是一份导出文件.xls";
HSSFSheet sheet = workbook.createSheet("页1");
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < 2; i++) {
HSSFCell cell = row.createCell(i);
if(i == 0){
cell.setCellValue(header[i]);
}else {
cell.setCellValue(header[i]);
}
}
int rowNum = 1;
for (int i = 0; i < goods.size(); i++) {
HSSFRow row1 = sheet.createRow(rowNum);
row1.createCell(0).setCellValue(goods.get(i).getId());
row1.createCell(1).setCellValue(goods.get(i).getName());
rowNum++;
}
res.setContentType("application/octet-stream");
res.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
res.flushBuffer();
workbook.write(res.getOutputStream());
}catch (Exception e){
logger.warning("出错了");
}
}