目录java
此文章以独家受权一下公众号 :
【新华先后端开发】
【脚本之家】git
【快速、简单避免OOM的java处理Excel工具】 github上关于项目的介绍github
poi使用userModel模式,这个模式的特色就是上手很容易。代码写起来很复杂。并且公用的地方不多。致使每次读写excel都须要从新编写。
EasyExcel使用SAX模式使得easyexcel能够节省内存。并且easyexcel解决了内存泄漏问题。若是想了解SAX模式开发那成本须要3~5天学习。数据库
经过Java读写excel大概有如下几种:
poi、csv、jxl、jxls 、easyPoi 、easyExcel
根据性能他们的排序:
jxl 、 easyexcel 、 csv 、 poi 、 easypoi 、 jxlsapache
由于是基于模板的。因此jxls实现导出的很简单。可是实现读取数据这里就很很差办了。这里笔者暂时不知道如何实现。 这个问题就留给聪明的读者吧!!!windows
二者均可以在自身的功能不足的状况下,经过POI的功能实现自定义功能后端
easyexcel名字很是的符合他的个性。他是真的很easy.下面咱们来实现一个导出学生信息的代码api
String fileName = EasyExcelTools.class.getResource("/").getPath() + "student" + System.currentTimeMillis() + ".xlsx"; ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(fileName, Student.class); //excelWriterBuilder.registerConverter(new SexConverter()).registerWriteHandler(new AgeRowHandler()).registerWriteHandler(new SexCellWriteHandler()); ExcelWriter excelWriter = excelWriterBuilder.build(); WriteSheet writeSheet = EasyExcel.writerSheet("中化安元").build(); try { excelWriter.write(ts, writeSheet); } catch (Exception e) { e.printStackTrace(); }finally { excelWriter.finish(); }
fileName 是导出的文件地址缓存
public class Student { /** * 学生索引id */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"学号"}) private String id; /** * 姓名 */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"姓名"}) private String userName; /** * 用户昵称 */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"昵称"}) @ExcelIgnore private String userNick; /** * 年龄 */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"年龄"}) private Integer age; /** * 性别 true : 男 ; false : 女 */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"性别"}) private boolean sex; /** * 生日 */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"生日"}) private Date birth; /** * 身高 */ @ExcelProperty(value = {HeadConstant.FIRSTNAME,HeadConstant.SECONDNAME,"身高"}) private Double height; }
beforeCellCreate
,afterCellCreate
,afterCellDispose
.其中afterCellDispose
方法是在单元格建立后销毁前的一个时机。这时候咱们能够改变单元格内容。easyExcel提供了四种时间捕捉接口
convertToJavaData
: excel数据转换成Java对象convertToExcelData
: Java对象转换成excel数据afterCellDispose
方法中实现CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper(); Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.URL); hyperlink.setAddress("https://gitee.com/zxhTom"); cell.setHyperlink(hyperlink);
<dependency> <groupId>net.sourceforge.javacsv</groupId> <artifactId>javacsv</artifactId> <version>2.0</version> </dependency>
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.0-beta4</version> </dependency>
1900 windowing 1900年日期系统
1904 windowing 1904年日期系统
Excel for windows 使用1900
Excel2008 for mac 和以前版本 1904
excel 2016 for mac ; excel for mac 2011 1900微信