Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

快速、简洁、解决大文件内存溢出的java处理Excel工具

License

Notifications You must be signed in to change notification settings

GatesChe/easyexcel

Repository files navigation

EasyExcel

Build Status Maven central License

QQ1群(已满): 662022184
QQ2群(已满): 1097936804
QQ3群(已满): 453928496
QQ4群(已满): 496594404
QQ5群: 451925680
钉钉1群(已满): 21960511
钉钉2群(已满): 32796397
钉钉3群(已满): 33797247
钉钉4群(已满): 33491624
钉钉5群(已满): 32134498
钉钉6群(已满): 34707941
钉钉7群(已满): 35235427
钉钉8群: 44752220

官方网站: https://easyexcel.opensource.alibaba.com/

常见问题

因为公司不方便用QQ,所以建议加钉钉群

JAVA解析Excel工具EasyExcel

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

64M内存20秒读取75M(46W行25列)的Excel(3.0.2+版本)

当然还有极速模式能更快,但是内存占用会在100M多一点 img

最新版本

 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>easyexcel</artifactId>
 <version>3.1.1</version>
 </dependency>

相关文档

维护者

姬朋飞(玉霄)、庄家钜、怀宇

快速开始

读Excel

DEMO代码地址:https://github.com/alibaba/easyexcel/blob/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java

 /**
 * 最简单的读
 * <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

DEMO代码地址:https://github.com/alibaba/easyexcel/blob/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

 /**
 * 最简单的写
 * <p>1. 创建excel对应的实体对象 参照{@link com.alibaba.easyexcel.test.demo.write.DemoData}
 * <p>2. 直接写即可
 */
 @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上传、下载

DEMO代码地址:https://github.com/alibaba/easyexcel/blob/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java

 /**
 * 文件下载(失败了会返回一个有部分数据的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.openxmlformats-officedocument.spreadsheetml.sheet");
 response.setCharacterEncoding("utf-8");
 // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
 String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
 response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + 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";
 }

联系我们

有问题阿里同事可以通过钉钉找到我,阿里外同学可以通过git留言。其他技术非技术相关的也欢迎一起探讨。

About

快速、简洁、解决大文件内存溢出的java处理Excel工具

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%

AltStyle によって変換されたページ (->オリジナル) /