赞
踩
前言
Excel读
1.实体类
2.读监听器与测试类
3.输出结果
Excel写
1.实体类
2.写入Excel的测试类
3.输出结果
填充Excel
1.Excel模板
2.测试类
3.输出结果
前言
EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。
版本支持:
2+版本支持Java7&Java6
3+版本支持Java8
这里使用的EasyExcel版本为3.1.1,JDK版本为1.8.0_161,同时辅助使用lombok和fastjson以简化代码或转化为Jason数据。
Maven依赖配置:
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> //非必要 <version>1.16.10</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> //非必要 <version>1.2.47</version> </dependency> </dependencies>
Excel读
样例内容:
1.实体类
import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class TextReadObject { @ExcelProperty(index = 0) private Integer studentId; @ExcelProperty(index = 1) private String studentName; @ExcelProperty(index = 2) private String institute; @ExcelProperty(index = 3) private Integer level_11; @ExcelProperty(index = 4) private Integer level_12; @ExcelProperty(index = 5) private Integer level_21; @ExcelProperty(index = 6) private Integer level_22; }
其中注解@ExcelProperty可包含两个参数index和value,在简单表头(即表头只占用一行)中以下两条注解基本等价
@ExcelProperty(index = 0)
@ExcelProperty(value = “学号”)
而在复杂表头(即本例)中,需要使用index表示。
另外需要注意的是加入表头名字出现重复,会导致只有一个字段读取到数据,此外在读取操作时不建议index和value同时使用。综上所述,在已知excel表头内容的情况下使用参数index。
2.读监听器与测试类
四个监听器,这里使用前两个
AnalysisEventListener < T >
所有已实现的接口:Listener、ReadListener
直接已知子类:SyncReadListener
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.Map; import java.util.List; import lombok.AllArgsConstructor; @AllArgsConstructor public class DemoDataListener extends AnalysisEventListener<TextReadObject> { private List<TextReadObject> dataList; //读取表头的内容 @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { System.out.println("表头->"+headMap); } //一行一行读取excel中的内容 @Override public void invoke(TextReadObject data, AnalysisContext context) { dataList.add(data); } //读取完成之后执行的方法 @Override public void doAfterAllAnalysed(AnalysisContext context) {} }
读取Excel的测试类:
import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; public class ExcelImport { public static void simpleRead() { String fileName = "F:\\rdtext.xls"; List<TextReadObject> dataList = new ArrayList<>(); //每次会读取100条数据然后返回过来,直接调用使用数据就行 EasyExcel.read(fileName, TextReadObject.class, new DemoDataListener(dataList)) .sheet(0)//读取第一个sheet .headRowNumber(3) //跳过前三行表头内容,假如是简单表头则这句可省略 .doRead(); //若需要实现读取全部sheet,可以使用.doReadAll()代替.sheet(0).doRead() for (TextReadObject dl : dataList) { System.out.println(JSON.toJSONString(dl)); } } public static void main(String[] args) { simpleRead(); } }
SyncReadListener:
所有已实现的接口:Listener、ReadListener
直接已知父类:AnalysisEventListener < T >
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.SyncReadListener; import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; import java.util.Map; public class ExcelImportSync { public static void simpleRead() { String fileName = "F:\\text.xls"; final List dataList = new ArrayList(); EasyExcel.read(fileName, TextReadObject.class, new SyncReadListener() { @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { System.out.println("表头->"+headMap); } @Override public void invoke(Object object, AnalysisContext context) { dataList.add(object); } }).sheet(0).headRowNumber(3).doRead(); for (Object o : dataList) { TextReadObject TOB = (TextReadObject) o; System.out.println(JSON.toJSONString(TOB)); } } public static void main(String[] args) { simpleRead(); } }
相较于AnalysisEventListener < T >,SyncReadListener更加适合对多种实体类实施相同操作的情况,在定义监听器时没有指定具体的实体类。
3.输出结果
二者输出结果一样:
Excel写
1.实体类
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowHeight; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @ColumnWidth(15) //列宽,最大值为255 @HeadRowHeight(16) //表头行高 @ContentRowHeight(16) //数据行高 public class TextWriteObject { //复杂表头自动合并相同的内容 @ExcelProperty(index = 0, value = {"学号", "学号", "学号"}) private Integer studentId; @ExcelProperty(index = 1, value = {"姓名", "姓名", "姓名"}) private String studentName; @ColumnWidth(25)//单独设置列宽 @ExcelProperty(index = 2, value = {"学院", "学院", "学院"}) private String institute; //复杂表头嵌套 @ExcelProperty(index = 3, value = {"成绩", "第一学年", "第一学期"}) private Integer level_11; @ExcelProperty(index = 4, value = {"成绩", "第一学年", "第二学期"}) private Integer level_12; @ExcelProperty(index = 5, value = {"成绩", "第二学年", "第一学期"}) private Integer level_21; @ExcelProperty(index = 6, value = {"成绩", "第二学年", "第二学期"}) private Integer level_22; }
此时在注解@ExcelProperty中可以同时使用参数index和value,用于同时指定位置和内容。
其他未使用注解:
@ContentStyle用于设置内容格式
@ContentFontStyle用于设置单元格内容字体格式
@ExcelIgnore不将该字段转换成Excel
@ExcelIgnoreUnannotated没有注解的字段都不转换
2.写入Excel的测试类
import java.util.ArrayList; import java.util.List; public class ExcelExport { public static void simpleWrite(){ String fileName = "F:\\wttext.xls"; List<TextWriteObject> dataList = new ArrayList<>(); dataList.add(new TextWriteObject(2022101, "张三", "生命科学院", 653, 602, 683, 707)); dataList.add(new TextWriteObject(2022102, "李四", "生命科学院", 568, 596, 611, 632)); dataList.add(new TextWriteObject(2022103, "王五", "生命科学院", 606, 673, 624, 653)); dataList.add(new TextWriteObject(2022201, "赵六", "语言文学院", 710, 722, 686, 703)); EasyExcel.write(fileName, TextWriteObject.class) .sheet(0) .doWrite(dataList); } public static void main(String[] args) { simpleWrite(); } }
3.输出结果
原文链接:https://blog.csdn.net/hermit_f/article/details/126850664
https://blog.csdn.net/hermit_f/article/details/126850664?spm=1001.2014.3001.5506
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。