快速入门
引入依赖
构建实体类
数据导出
参数
WriteWorkbook
WriteSheet
WriteTable
测试
数据导入
测试
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。
GitHub地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具
快速入门
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.0</version>
</dependency>
构建实体类
@Data //为实体类提供set、get方法
public class User {
//此注解用于Excel的表头
@ExcelProperty("用户姓名")
private String username;
@ExcelProperty("用户性别")
private String sex;
@ExcelProperty("用户年龄")
private Integer age;
//此注解会在数据导出之后忽略该字段
@ExcelIgnore
private String address;
}
数据导出
参数
WriteWorkbook
可以理解成一个excelWriteSheet
理解成一个excel里面的一个表单WriteTable
一个表单里面如果有多个实际用的表格,则可以用WriteTable
这是三个参数都有的通用参数,如果这些均为空,那么默认使用上级。
名称 | 默认值 | 描述 |
---|---|---|
converter | 空 | 默认加载了很多转换器,这里可以加入不支持的字段 |
writeHandler | 空 | 写的处理器。可以实现WorkbookWriteHandler ,SheetWriteHandler ,RowWriteHandler ,CellWriteHandler ,在写入excel的不同阶段会调用 |
relativeHeadRowIndex | 0 | 写入到excel和上面空开几行 |
head | 空 | 与clazz 二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class |
clazz | 空 | 与head 二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据 |
autoTrim | true | 会对头、读取数据等进行自动trim |
use1904windowing | false | excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始 |
useScientificFormat | false | 数字转文本的时候在较大的数值的是否是否采用科学计数法 |
needHead | true | 是否需要写入头到excel |
useDefaultStyle | true | 是否使用默认的样式 |
automaticMergeHead | true | 自动合并头,头中相同的字段上下左右都会去尝试匹配 |
excludeColumnIndexes | 空 | 需要排除对象中的index的数据 |
excludeColumnFieldNames | 空 | 需要排除对象中的字段的数据 |
includeColumnIndexes | 空 | 只要导出对象中的index的数据 |
includeColumnFieldNames | 空 | 只要导出对象中的字段的数据 |
WriteWorkbook
EasyExcel.write(fileName, User.class)
//在write方法之后,在 sheet方法之前都是设置WriteWorkbook的参数
.sheet("模板")
.doWrite(传入的数据);
WriteSheet
EasyExcel.write(fileName, User.class)
.sheet("模板")
//在sheet方法之后,在 sheet方法之前都是设置WriteSheet的参数
.doWrite(传入的数据);
WriteTable
EasyExcel.write(fileName, User.class)
.sheet("模板")
.table()
//在table方法之后,在 sheet方法之前都是设置WriteTable的参数
.doWrite(传入的数据);
测试
public class TestWrite {
public static void main(String[] args) {
String fileName = "C:\\Users\\Administrator\\Desktop\\EasyExcel\\用户信息.xlsx";
//创建一个集合放入用户信息
List<User> list = new ArrayList<>();
User u1 = new User("张三","男",18,"福建省");
User u2 = new User("李四","女",17,"浙江省");
User u3 = new User("王五","男",22,"江西省");
User u4 = new User("赵六","男",19,"江苏省");
User u5 = new User("小七","女",20,"广东省");
list.add(u1);
list.add(u2);
list.add(u3);
list.add(u4);
list.add(u5);
//这里用到了EasyExcel的写功能
//write传入文件导出位置以及写入信息的字节码文件
//sheet传入模板内容
//doWrite用于将传入的数据进行分页查询
EasyExcel.write(fileName, User.class).sheet("UserTable").doWrite(list);
}
}
数据导入
public class TestRead {
public static void main(String[] args) {
String fileName = "C:\\Users\\Administrator\\Desktop\\EasyExcel\\用户信息.xlsx";
EasyExcel.read(fileName, User.class,new ExcelListener())
.sheet()
//doReda()方法用于关闭读取流
.doRead();
}
}
public class ExcelListener extends AnalysisEventListener<User> {
/**
* 一行一行读取Excel内容,从第二行开始读取
* @param user
* @param analysisContext
*/
@Override
public void invoke(User user, AnalysisContext analysisContext) {
System.out.println(user);
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息" + headMap);
}
/**
* 读取完Excel后执行
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("读取完Excel后执行");
}
}