目录
一 POI简介
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。是目前较流行的导入导出excel框架。
官方网站:Apache POI - the Java API for Microsoft Documentshttps://poi.apache.org/
二 行数限制
HSSFWorkbook:
缺点:最多只能处理65536行
,否则会抛异常
优点:过程中写入缓存,不操作磁盘,最后一次性吸入磁盘,速度快
XSSFWorkbook:最大数据:1048576行,16384列,
缺点:写数据时速度非常慢,非常耗内存
,也会发生内存溢出,如100万条。
优点:可以写较大数据量,如20万条
。
SXSSFWorkbook:
优点:可以写非常大的数据量,如100万条甚至更多条写数据速度快,占用更少的内存
注意:
- 过程中会
产生临时文件
,需要清理临时文件默认由100条记录被保存在内存中
,如果超过这数量,则最前面的数据被写入临时文件- 如果想自定义内存中数据的数量,可以使用
new SXSSFWorkbook(数量)
三 案例(导入和导出)
3.1 导入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
3.2 导入案例
controller入口:
@PostMapping("import")
public Response importRepayReconciliate(MultipartFile file,HttpServletRequest request){
try {
// 判断文件是否为空
if (!file.isEmpty()) {
// 文件保存路径
String message = repayService.import(file.getInputStream(),request);
return new Response(MessageConstants.MSG_SUCCESS, null, null);
} else {
return new Response(MessageConstants.MSG_SYS_ERROR, null, "文件为空,请上传文件!");
}
} catch (Exception e) {
log.error("操作失败,请联系系统管理员!",e,e.getMessage());
return new Response(MessageConstants.MSG_SYS_ERROR, null, e.getMessage());
}
}
service类:
Workbook book = WorkbookFactory.create(inputStream); //创建工作簿
Sheet sheet = book.getSheetAt(0);//获取到工作表
int lastRowNum = sheet.getLastRowNum();//获取到表格最后一行
if (lastRowNum < 1 ) {
return "你未导入任何数据,请添加数据后导入...";
}
Row row = sheet.getRow(2);
Cell cell = row.getCell(1);
String type = cell.getStringCellValue();row = sheet.getRow(i);
cell = row.getCell(1);
cell.setCellType(CellType.STRING);// 获取单元格值(为文本重要)
String value = new DataFormatter().formatCellValue(cell);
3.3 导出案例(返回文件流方式)
关键词汇总结:
方式1:
HSSFWorkbook book = new HSSFWorkbook(); // 有行数限制 不能大于65536行
HSSFSheet sheet = book.createSheet();方式2:
XSSFWorkbook book = new XSSFWorkbook(); // 没有行数限制
XSSFSheet sheet = book.createSheet();方式3:
SXSSFWorkbook book = new SXSSFWorkbook();// 没有行数限制 不占内存(通用)
book.setCompressTempFiles(true); //开启压缩配置项XSSFRow titleRow = sheet.createRow(0);
// 设置单元格宽度
sheet.setColumnWidth(i, 2000);.....
book.write(out);
response.flushBuffer();
book.dispose(); //临时文件需要手动显式删除,调用dispose方法 即可
out.close();
book.close();
样式管理