一、为什么使用easyexcel
解析excel现在比较有名的依赖是poi和jwi,但是他们都存在不能解析大excel的问题,导致这个问题的原因是因为poi和jwi都是读取到内存中解析的。而一个3M的excel用POI sax解析依然需要100M左右内,改用easyexcel可以降低到几M。因为easyexcel在必要时候还使用了磁盘读取。03版依赖POI的sax模式,在上层做了模型转换的封装,方便用户使用。
二、上代码
1、依赖(junit和lombok你们酌情添加)
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>net.sf.saxon</groupId> <artifactId>saxon-dom</artifactId> <version>8.7</version> </dependency>
2、映射类
@Data public class DataDemo { @ExcelProperty("姓名") private String name; @ExcelProperty("生日") private Date birthday; @ExcelProperty("薪资") private Double salary; }
3、读取excel的处理逻辑编写
public class ExcleDemoListener extends AnalysisEventListener
{
@Override
public void invoke(DataDemo dataDemo, AnalysisContext analysisContext) {
System.out.println(“解析到一条数据:”+ dataDemo.toString());
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println(“所有数据解析完成!”);
} }
4、测试类
public class EasyExcelTest { private String getResourcePath(){ // return this.getClass().getClassLoader().getResource("").getPath(); return "这里填文件路径"; } /** * 循环制造list集合数据 * @return */ private List<DataDemo> data() { List<DataDemo> list = new ArrayList<>(); //算上标题,做多可写65536行 //超出:java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535) for (int i = 0; i < 5; i++) { DataDemo data = new DataDemo(); data.setName("yixin" + i); data.setBirthday(new Date()); data.setSalary(123456.1234); list.add(data); } return list; } /** * 写入xlsx文件测试方法 */ @Test public void simpleWriteXlsx() { String fileName = getResourcePath()+"demoExcel2.xlsx"; //需要提前新建目录 // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 EasyExcel.write(fileName, DataDemo.class).sheet("模板").doWrite(data()); } /** * 写入xls文件测试方法 */ @Test public void simpleWriteXls() { String fileName = getResourcePath()+"demoExcel1.xls"; // 如果这里想使用03 则 传入excelType参数即可 EasyExcel.write(fileName, DataDemo.class).excelType(ExcelTypeEnum.XLS).sheet("模板").doWrite(data()); } /** * 读取xlsx文件最简单的读 */ @Test public void simpleReadXlsx() { String fileName = getResourcePath()+"demoExcel2.xlsx"; // 这里默认读取第一个sheet EasyExcel.read(fileName, DataDemo.class, new ExcleDemoListener()).sheet().doRead(); } /** * 读取xls文件最简单的读 */ @Test public void simpleReadXls() { String fileName = getResourcePath()+"demoExcel1.xls"; EasyExcel.read(fileName, DataDemo.class, new ExcleDemoListener()).excelType(ExcelTypeEnum.XLS).sheet().doRead(); } }
- 想深入了解当然要去官网了。
easyexcel官网:https://easyexcel.opensource.alibaba.com/docs/current/