什么是POI什么是easyExcel?
首先操作Excel,word 目前比较流行的是,Apache POI和 阿里巴巴的easyExcel
应用场景:
1.将用户数据大量导出为Excel表格 (导出数据)
2.将Excel表中的信息导入到网站数据库中 (大量数据上传)
POI是由Apache软件基金会的开放源码函式库,POI提供给java程序对Miscroslft Office格式档案的读和写的功能
基本功能:
HSSF 提供读写Microsoft Excel 格式档案的功能,(03版本中行数最多只能存65535行)
XSSF 提供读写Microsoft Excel OOXML 格式档案的功能,(07版本行数不限)
HWPF 提供读写Microsoft Word格式档案的功能,
HSLF 提供读写Microsoft Point 格式档案的功能,
HDGF 提供读写Microsoft Visio 格式档案的功能,
POI相比于其他框架比较原生,其实其他框架的底层还是基于POI实现的。
那么! EasyExcel就出现了, EasyExcel是阿里巴巴开源的一个处理excel框架,简单,节省内存著称,
EasyExcel能大大减少占用内存的原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行一行读取数据,逐个解析,反之POI就是把数据先加载到内存中(这样会导致内存溢出OOM )再写入到文件
小文件POI和EasyExcel 大文件 EasyExcel
数据批量导入:
大文件写HSSF: 缺点:最多只能处理65536行,否则会抛出异常
优点:过程写入缓存,不操作磁盘,最后一次性写入磁盘,速度快
大文件写XSSF: 缺点:写数据速度非常慢,非常消耗内存,也会发生内存溢出,比如100万条
优点:可以写较大的数据量 ,如20万条
大文件写XSSF: 优点:可以写非常大的数据量,如200万条甚至更多条,写数据快,占用更少的内存,但是:过程中会产生临时文件,需要清理临时文件
POI-Excel读取:
读取值的时候一定要注意类型
EasyExcel底层也是基于POI
首先导入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
读Excel:
/**
* 最简单的读
* <p>1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
* <p>3. 直接读即可
*/
@Test
public void simpleRead() {
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
写Excel:
/**
* 最简单的写
*/
@Test
public void simpleWrite() {
String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}
web上传、下载:
/**
* 文件下载(失败了会返回一个有部分数据的Excel)
* <p>1. 创建excel对应的实体对象 参照{@link DownloadData}
* <p>2. 设置返回的 参数
* <p>3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("测试", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}
/**
* 文件上传
* <p>1. 创建excel对应的实体对象 参照{@link UploadData}
* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
* <p>3. 直接读即可
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
return "success";
}