第一章 EasyExcel简介

1
2
3
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excelgithub地址:https://github.com/alibaba/easyexcel
  • 当前案例采用easyexcel版本 2.2.3

第二章 EasyExcel使用

第1节 EasyExcel相关依赖

1.1 如果添加maven依赖

1
2
3
4
5
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version>
</dependency>

1.2 如果添加jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
asm-4.2.jar
cglib-3.1.jar
commons-codec-1.10.jar
commons-collections4-4.1.jar
curvesapi-1.04.jar
easyexcel-2.2.3.jar
ehcache-3.4.0.jar
poi-3.17.jar
poi-ooxml-3.17.jar
poi-ooxml-schemas-3.17.jar
slf4j-api-1.7.26.jar
stax-api-1.0.1.jar
xmlbeans-2.6.0.jar

第2节 写Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*** 创建User类,用于构建向Excel表格中写数据的类型;* @ExcelProperty:这个注解是EasyExcel提供,用于生成Excel表格头*/
public class User {@ExcelProperty("用户编号")private Integer userId;@ExcelProperty("姓名")private String userName;@ExcelProperty("性别")private String gender;@ExcelProperty("工资")private Double salary;@ExcelProperty("入职时间")private Date hireDate;//setter/getter方法
}

2.1 最简单的写(方式一)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*** 向Excel文档中写数据(方式一)* 最简单的写*/
@Test
public void writeExcel1() {//创建文件保存的位置,以及文件名String fileName="user1.xlsx";/*** 构建要写入的数据* User类是一个自定义的特殊类,专门用来构建向Excel中写数据的类型类* @ExcelProperty是easyexcel提供的注解,用来定义表格的头部*/List<User> data = new ArrayList<>();User user = new User(2001,"李雷","男",1000.123,new Date());data.add(user);//将数据写到Excel的第一个sheet标签中,并且给sheet标签起名字EasyExcel.write(fileName,User.class).sheet("用户信息").doWrite(data);//文件流会自动关闭
}

2.2 最简单的写(方式二)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*** 向Excel文档中写数据(方式二)* 最简单的写*/
@Test
public void writeExcel2() {//创建文件保存的位置,以及文件名String fileName="user2.xlsx";/*** 构建要写入的数据* User类是一个自定义的特殊类,专门用来构建向Excel中写数据的类型类* @ExcelProperty是easyexcel提供的注解,用来定义表格的头部*/List<User> data = new ArrayList<>();User user = new User(2001,"李雷","男",1000.123,new Date());data.add(user);//创建Excel写对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();//创建sheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();//将数据写到sheet标签中excelWriter.write(data, writeSheet);//关闭流,文件流手动关闭excelWriter.finish();
}

2.3 将类中某几个字段排除掉,不写入Excel中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*** 向Excel文档中写数据* 将User类中的某几个属性字段排除*/
@Test
public void writeExcel3() {//创建文件保存的位置,以及文件名String fileName="user3.xlsx";/*** 构建要写入的数据* User类是一个自定义的特殊类,专门用来构建向Excel中写数据的类型类* @ExcelProperty是easyexcel提供的注解,用来定义表格的头部*/List<User> data = new ArrayList<>();User user = new User(2001,"李雷","男",1000.123,new Date());data.add(user);//构建要排除掉的列Set<String> excludeColumnFiledNames = new HashSet<>();//排除掉hireDate和userName字段excludeColumnFiledNames.add("hireDate");excludeColumnFiledNames.add("userName");EasyExcel.write(fileName, User.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("abc").doWrite(data);
}

2.4 只向表格中导出指定某几个字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*** 向Excel文档中写数据* 指定将User类中的某几个字段导出*/
@Test
public void writeExcel4() {//创建文件保存的位置,以及文件名String fileName="user4.xlsx";/*** 构建要写入的数据* User类是一个自定义的特殊类,专门用来构建向Excel中写数据的类型类* @ExcelProperty是easyexcel提供的注解,用来定义表格的头部*/List<User> data = new ArrayList<>();User user = new User(2001,"李雷","男",1000.123,new Date());data.add(user);//构建要导出的列Set<String> includeColumnFiledNames = new HashSet<>();//要导出hireDate和userName字段includeColumnFiledNames.add("hireDate");includeColumnFiledNames.add("userName");EasyExcel.write(fileName, User.class).includeColumnFiledNames(includeColumnFiledNames).sheet("abc").doWrite(data);
}

2.5 插入指定的列

1
将Java对象中指定的属性,插入到Excel表格中的指定的列(在Excel中进行列排序)
  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public class IndexUser {/*** value: 设置Excel中列头的名字 index: 设置Excel中将数据插入指定的列(列排序) eg: value="姓名" index=2 :* 将姓名的列头设置在Excel表格的第三列*/@ExcelProperty(value = "用户编号", index = 0)private Integer userId;@ExcelProperty(value = "姓名", index = 2)private String userName;@ExcelProperty(value = "入职时间", index = 1)private Date hireDate;
    }
    
  • 向Excel中写数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    /*** 插入指定列* Java类中有三个属性* 我现在要将这三个属性的数据保存到Excel表格中* 并且自定义在Excel中的列顺序*/
    @Test
    public void writeExcel5() {//创建文件保存的位置,以及文件名String fileName="user5.xlsx";/*** 构建要写入的数据*/List<IndexUser> data = new ArrayList<>();IndexUser user = new IndexUser(1001,"枫桥夜泊",new Date());data.add(user);EasyExcel.write(fileName, IndexUser.class).sheet("abc").doWrite(data);
    }
    

    2.6 复杂头数据写入

  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    /*** 构建复杂头信息数据的类*/
    public class ComplexHeadUser {/*** {"用户主题1","用户编号"}这种遇到格式设置多级主题* 第一个参数为一级主题(第一行)* 第二个参数为二级主题(第二行)* 如果一级主题名称相同,那么他们会合并单元格*/@ExcelProperty({"用户主题1","用户编号"})private Integer userId;@ExcelProperty({"用户主题2","用户名称"})private String userName;@ExcelProperty({"用户主题3","入职时间"})private Date hireDate;
    }
    
  • 向Excel中写数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    /*** 写入复杂头信息到Excel*/
    @Test
    public void writeExcel6() {//创建文件保存的位置,以及文件名String fileName="user6.xlsx";/*** 构建要写入的数据*/List<ComplexHeadUser> data = new ArrayList<>();ComplexHeadUser user = new ComplexHeadUser(1001,"枫桥夜泊",new Date());data.add(user);EasyExcel.write(fileName, ComplexHeadUser.class).sheet("abc").doWrite(data);
    }
    

2.7 重复写到Excel的同一个sheet中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*** 重复写到同一个sheet中*/
@Test
public void writeExcel7() {//创建文件保存的位置,以及文件名String fileName="user7.xlsx";//构建数据List<User> data = new ArrayList<>();User user1 = new User(2001,"李雷1","男",1000.123,new Date());User user2 = new User(2002,"李雷2","男",1000.123,new Date());User user3 = new User(2003,"李雷3","男",1000.123,new Date());User user4 = new User(2004,"李雷4","男",1000.123,new Date());data.add(user1);data.add(user2);data.add(user3);data.add(user4);//创建ExcelWriter对对象并设置用哪个Class(数据类型)去写ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();//创建sheetWriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();//模拟重复写入,模拟重复写入5次for (int i = 0; i < 5; i++) {excelWriter.write(data, writeSheet);}//关闭流excelWriter.finish();
}

2.8 重复的写到Excel的不同sheet中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*** 重复写到不同sheet中*/
@Test
public void writeExcel8() {//创建文件保存的位置,以及文件名String fileName="user8.xlsx";//构建数据List<User> data = new ArrayList<>();User user1 = new User(2001,"李雷1","男",1000.123,new Date());User user2 = new User(2002,"李雷2","男",1000.123,new Date());User user3 = new User(2003,"李雷3","男",1000.123,new Date());User user4 = new User(2004,"李雷4","男",1000.123,new Date());data.add(user1);data.add(user2);data.add(user3);data.add(user4);//创建ExcelWriter对对象并设置用哪个Class(数据类型)去写ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();//模拟重复写入,模拟重复写入5次for (int i = 0; i < 5; i++) {//创建sheet(因为写入到不同的sheet,所以需要多次创建sheet)//WriteSheet writeSheet = EasyExcel.writerSheet(i,"用户信息"+i).build(); //用下面的格式也可以WriteSheet writeSheet = EasyExcel.writerSheet("用户信息"+i).build();excelWriter.write(data, writeSheet);}//关闭流excelWriter.finish();
}

2.9 日期、数字类型格式化

1
2
3
4
对于日期和数字有时候我们需要对其展示的样式进行格式化,easyexcel提供了一下注解
@DateTimeFormat : 日期格式化
@NumberFormat   : 数字格式化(小数或者百分数)
  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    /*** 创建User类,用于构建向Excel表格中写数据的类型;* @ExcelProperty:这个注解是EasyExcel提供,用于生成Excel表格头*/
    public class User {@ExcelProperty("用户编号")private Integer userId;@ExcelProperty("姓名")private String userName;@ExcelProperty("性别")private String gender;//格式化小数类型,如果是百分数那么定义为  #.##% 比如:9.12%@NumberFormat("#.##")@ExcelProperty("工资")private Double salary;//格式化时间@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")@ExcelProperty("入职时间")private Date hireDate;
    }
    
  • 向Excel中写数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    /*** 日期、数字格式化*/
    @Test
    public void writeExcel9() {//创建文件保存的位置,以及文件名String fileName="user9.xlsx";//构建数据List<User> data = new ArrayList<>();User user1 = new User(2001,"李雷1","男",1000.12223,new Date());User user2 = new User(2002,"李雷2","男",1000.12223,new Date());User user3 = new User(2003,"李雷3","男",1000.12223,new Date());User user4 = new User(2004,"李雷4","男",1000.13323,new Date());data.add(user1);data.add(user2);data.add(user3);data.add(user4);EasyExcel.write(fileName, User.class).sheet("用戶信息").doWrite(data);
    }
    

    2.10 写入图片到Excel

  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    /*** 构建向Excel中写图片的类 支持5种数据类型的图片类型 * 1. 图片可以是一个File格式 * 2. 图片可以是一个InputStream输入流的方式 * 3. 图片可以是一个byte[]数组的方式 * 4. 图片可以是 一个网络的java.net.URL对象方式 * 5. 图片也可以是一个String类型方式(当是String类型是,需要StringImageConverter类型转换器)* */
    @ContentRowHeight(100)  // 内容高度
    @ColumnWidth(100 / 8)   // 列宽
    public class ImageData {// 使用抽象文件表示一个图片private File file;// 使用输入流保存一个图片private InputStream inputStream;/*** 当使用String类型保存一个图片的时候需要使用StringImageConverter转换器*/@ExcelProperty(converter = StringImageConverter.class)private String string;// 使用二进制数据保存为一个图片private byte[] byteArray;// 使用网络链接保存一个图片private URL url;
    }
    
  • 向Excel中写数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    /*** 将图片写入到Excel表格中* EasyExcel提供了5种数据格式进行图片写入* @throws IOException */
    @Test
    public void writeExcel10() throws IOException {//创建文件保存的位置,以及文件名String fileName="user10.xlsx";List<ImageData> list = new ArrayList<ImageData>();ImageData imageData = new ImageData();//根据File写入imageData.setFile(new File("imgs/img.png"));//根据InputStream写入imageData.setInputStream(new FileInputStream("imgs/img.png"));//根据String类型写入imageData.setString("imgs/img.png");/** 使用二进制方式写入步骤:* 1. 获取文件大小* 2. 读成二进制流*/File file = new File("imgs/img.png");//创建一个指定大小的二进制数组byte[] byteArray = new byte[(int)file.length()];FileInputStream in = new FileInputStream(file);//将文件流写入到二进制数组中in.read(byteArray, 0, (int)file.length());imageData.setByteArray(byteArray);//只用网络链接imageData.setUrl(new URL("https://pics5.baidu.com/feed/e850352ac65c10384dcf6805a7540815b17e890b.jpeg?token=46fd105a95d8754d3daf93de7e8a7f6f"));list.add(imageData);EasyExcel.write(fileName, ImageData.class).sheet().doWrite(list);//关闭输入流in.close();
    }
    

2.11 设置写入Excel的列宽行高设置

  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    @ContentRowHeight(30) //设置内容高度
    @HeadRowHeight(40)    //设置标题高度
    @ColumnWidth(25)      //设置列宽
    public class WidthAndHeightData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ColumnWidth(50)   //设置列宽(可以修饰类,也可以修饰具体属性)@ExcelProperty("数字标题")private Double doubleData;
    }
    
  • 向Excel中写数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    /*** 设置Excel的列宽行高*/
    @Test
    public void writeExcel11(){//创建文件保存的位置,以及文件名String fileName="user11.xlsx";//构建数据List<WidthAndHeightData> list = new ArrayList<WidthAndHeightData>();WidthAndHeightData wahd = new WidthAndHeightData();wahd.setString("小明");wahd.setDoubleData(200.12);wahd.setDate(new Date());list.add(wahd);//写数据EasyExcel.write(fileName, WidthAndHeightData.class).sheet("信息").doWrite(list);
    }
    

2.12 通过注解形式设置写入Excel的样式

  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    //头背景设置成红色 IndexedColors.RED.getIndex()
    @HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)
    //头字体设置成20
    @HeadFontStyle(fontHeightInPoints = 20)
    //内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
    @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
    //内容字体设置成20
    @ContentFontStyle(fontHeightInPoints = 20)
    public class DemoStyleData {// 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 14)// 字符串的头字体设置成20@HeadFontStyle(fontHeightInPoints = 30)// 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)// 字符串的内容字体设置成20@ContentFontStyle(fontHeightInPoints = 30)@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;
    }
    
  • 向Excel中写数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    /*** 注解形式设置Excel样式*/
    @Test
    public void writeExcel12(){//创建文件保存的位置,以及文件名String fileName="user12.xlsx";//构建数据List<DemoStyleData> list = new ArrayList<>();DemoStyleData dsld = new DemoStyleData();dsld.setDate(new Date());dsld.setDoubleData(200.12);dsld.setString("韓梅梅");list.add(dsld);EasyExcel.write(fileName, DemoStyleData.class).sheet("信息").doWrite(list);
    }
    

2.13 合并单元格

  • 写Excel的Java对象类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    /** @OnceAbsoluteMerge: 指定从哪一行开始,哪一行结束,哪一列开始,哪一列结束,进行合并单元格* firstRowIndex   : 起始行索引 从0开始* lastRowIndex    : 结束行索引* firstColumnIndex: 起始列索引 从0开始* lastColumnIndex : 结束列索引* 例如: 第2-3行,2-3列进行合并*/
    @OnceAbsoluteMerge(firstRowIndex = 1,lastRowIndex = 2,firstColumnIndex = 1,lastColumnIndex = 2)
    public class DemoMergeData {//每隔两行合并一次(竖着合并单元格)//@ContentLoopMerge(eachRow = 2)@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;
    }
    
  • 向Excel中写数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    /*** 合并单元格*/
    @Test
    public void writeExcel13(){//创建文件保存的位置,以及文件名String fileName="user13.xlsx";//构建数据List<DemoMergeData> list = new ArrayList<>();DemoMergeData dmd = new DemoMergeData();dmd.setDate(new Date());dmd.setDoubleData(200.12);dmd.setString("韓梅梅");DemoMergeData dmd2 = new DemoMergeData();dmd2.setDate(new Date());dmd2.setDoubleData(200.12);dmd2.setString("韓梅梅");DemoMergeData dmd3 = new DemoMergeData();dmd3.setDate(new Date());dmd3.setDoubleData(200.12);dmd3.setString("韓梅梅");DemoMergeData dmd4 = new DemoMergeData();dmd4.setDate(new Date());dmd4.setDoubleData(200.12);dmd4.setString("韓梅梅");DemoMergeData dmd5 = new DemoMergeData();dmd5.setDate(new Date());dmd5.setDoubleData(200.12);dmd5.setString("韓梅梅");list.add(dmd);list.add(dmd2);list.add(dmd3);list.add(dmd4);list.add(dmd5);EasyExcel.write(fileName, DemoMergeData.class).sheet("信息").doWrite(list);
    }
    

第3节 读Excel

3.1 最简单的读取Excel

  • Excel表格数据类型

  • 盛装数据的Java对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    /*** 承装Excel表格数据的类* 注意点: Java类中的属性的顺序和Excel中的列头的顺序是相同的*/
    public class DemoData {private String name;private Date hireDate;private Double salary;
    }
    
  • 读取Excel数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    /** 最简单的读取Excel内容(方式一)* 默认读取Excel文件中的第一个sheet*/
    @Test
    public void testRead1() {//读取的文件路径String fileName="user11.xlsx";Class<DemoData> head = DemoData.class; //创建一个数据格式来承装读取到数据//读取数据EasyExcel.read(fileName, head, new AnalysisEventListener<DemoData>() {/*** 解析每一条数据的时候被调用*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {//在这里操作,将解析的每一条数据保存到数据库中,在这里可以调用数据库System.out.println("解析的数据为: "+data);}/*** 解析完所有数据的时候被调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("数据解析完成..........");}}).sheet().doRead();}/** 最简单的读取Excel内容(方式二)* 默认读取Excel文件中的第一个sheet*/
    @Test
    public void testRead2() {//读取的文件路径String fileName="user11.xlsx";Class<DemoData> head = DemoData.class; //创建一个数据格式来承装读取到数据//创建ExcelReader对象ExcelReader excelReader = EasyExcel.read(fileName, head, new AnalysisEventListener<DemoData>() {@Overridepublic void invoke(DemoData data, AnalysisContext context) {System.out.println("读取到的数据为:"+data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("数据解析已完成");}}).build();//创建sheet对象,并读取Excel的第1个sheet(下标从0开始)ReadSheet readSheet = EasyExcel.readSheet(0).build();excelReader.read(readSheet);//关闭流操作,在读取文件时会创建临时文件,如果不关闭,磁盘爆掉excelReader.finish();
    }
    

3.2 根据Excel中指定的列名或者列的下标读取指定列的数据

  • 盛装数据的Java对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    public class IndexOrNameData {/*** 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配*/@ExcelProperty(index = 2)private Double doubleData;/*** 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据*/@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;
    }
    
  • 读取Excel数据操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    /** 根据名称或者下标获取指定的Excel表格数据*/
    @Test
    public void testRead3() {//读取的文件路径String fileName="user11.xlsx";Class<IndexOrNameData> head = IndexOrNameData.class; //创建一个数据格式来承装读取到数据//读取数据EasyExcel.read(fileName, head, new AnalysisEventListener<IndexOrNameData>() {/*** 解析每一条数据的时候被调用*/@Overridepublic void invoke(IndexOrNameData data, AnalysisContext context) {//在这里操作,将解析的每一条数据保存到数据库中,在这里可以调用数据库System.out.println("解析的数据为: "+data);}/*** 解析完所有数据的时候被调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("数据解析完成..........");}}).sheet().doRead();}
    

3.3 格式化Excel中的数据格式(例如时间)

  • 盛装数据的Java对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    /*** 定义需要被格式化的字段* 如果使用@NumberFormat("#.##")注解,建议数据类型采用String,如果使用double可能不能被格式化*/
    public class ConverterData {@NumberFormat("#.#")@ExcelProperty("数字标题")private String salary;@DateTimeFormat("yyyy-MM-dd HH:mm:ss")@ExcelProperty("日期标题")private Date hireDate;
    }
    
  • 读取Excel数据操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    /** 格式化Excel中的数据格式(例如时间)*/
    @Test
    public void testRead4() {//读取的文件路径String fileName="user11.xlsx";Class<ConverterData> head = ConverterData.class; //创建一个数据格式来承装读取到数据//读取数据EasyExcel.read(fileName, head, new AnalysisEventListener<ConverterData>() {/*** 解析每一条数据的时候被调用*/@Overridepublic void invoke(ConverterData data, AnalysisContext context) {//在这里操作,将解析的每一条数据保存到数据库中,在这里可以调用数据库System.out.println("解析的数据为: "+data);}/*** 解析完所有数据的时候被调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("数据解析完成..........");}}).sheet().doRead();
    }
    

3.4 读取多个或者全部的Sheet

  • 盛装数据的Java对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    /*** 承装Excel表格数据的类* 注意点: Java类中的属性的顺序和Excel中的列头的顺序是相同的*/
    public class DemoData {private String name;private Date hireDate;private Double salary;
    }
    
  • 读取Excel数据操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    /** 读取Excel中的多个或者全部sheet*/
    @Test
    public void testRead5() {//读取的文件路径String fileName="user11.xlsx";Class<DemoData> head = DemoData.class; //创建一个数据格式来承装读取到数据/*** 读取全部sheet*/EasyExcel.read(fileName, head, new AnalysisEventListener<DemoData>() {@Overridepublic void invoke(DemoData data, AnalysisContext context) {// 每解析一条数据被调用一次System.out.println("解析的数据为: "+data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 数据解析完成之后被调用System.out.println("数据解析完成......");}}).doReadAll();System.out.println("============================================================");/*** 读取其中的某几个sheet*///构建ExcelReader对象ExcelReader excelReader = EasyExcel.read(fileName).build();//创建想要获取的sheet对象ReadSheet sheet1 = EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new AnalysisEventListener<DemoData>() {@Overridepublic void invoke(DemoData data, AnalysisContext context) {// 每解析一条数据被调用一次System.out.println("解析的数据为: "+data);              }@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 数据解析完成之后被调用System.out.println("数据解析完成......");             }}).build();ReadSheet sheet2 = EasyExcel.readSheet(2).head(DemoData.class).registerReadListener(new AnalysisEventListener<DemoData>() {@Overridepublic void invoke(DemoData data, AnalysisContext context) {// 每解析一条数据被调用一次System.out.println("解析的数据为: "+data);              }@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 数据解析完成之后被调用System.out.println("数据解析完成......");             }}).build();//读取sheetexcelReader.read(sheet1,sheet2);//关闭excelReader.finish();
    }

第4节 填充Excel

4.1 简单填充

  • 创建Excel模板格式

    1
    
    填充单个属性使用{}作为占位符,在大括号里面定义属性名称,如果{}想不作为占位符展示出来,可以使用反斜杠进行转义.
    

  • 填充数据的Java类

    1
    2
    3
    4
    
    public class FillData {private String name;private double number;
    }
    
  • 填充的代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    /*** 简单的单个对象填充*/
    @Test
    public void excelFull() {//读取模板文件String templateFileName="templateFileName.xlsx";//通过模板文件生成的填充之后的文件String fullFile="fullFile.xlsx";//构建要填充的数据FillData data = new FillData();data.setName("张三");data.setNumber(5.2);//填充操作EasyExcel.write(fullFile).withTemplate(templateFileName).sheet().doFill(data);
    }
    
  • 填充之后的效果

4.2 列表填充

  • 创建Excel模板格式

    1
    
    当占位符是一个列表时,{}里面的属性前面要加一个点代表多个
    

  • 填充数据的Java类

    1
    2
    3
    4
    
    public class FillData {private String name;private double number;
    }
    
  • 填充的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    /*** 简单的列表对象填充*/
    @Test
    public void excelFull2() {//读取模板文件String templateFileName="templateFileName2.xlsx";//通过模板文件生成的填充之后的文件String fullFile="fullFile2.xlsx";//构建要填充的数据列表List<FillData> list = new ArrayList<FillData>();FillData data1 = new FillData();data1.setName("张三");data1.setNumber(5.2);FillData data2 = new FillData();data2.setName("张三");data2.setNumber(5.2);list.add(data1);list.add(data2);//填充操作EasyExcel.write(fullFile).withTemplate(templateFileName).sheet().doFill(list);
    }
    
  • 填充之后的效果

第5节 Web操作(Excel上传/下载)

5.1 Excel下载

  • HTML

    1
    
    <a href="${pageContext.request.contextPath }/DownLoadExcel">下载</a>
    
  • 封装数据的Java类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class User {@ExcelProperty("用户编号")private Integer userId;@ExcelProperty("用户名称")private String userName;@ExcelProperty("用户性别")private String gender;@ExcelProperty("创建时间")private Date createTime;
    }
    
  • 下载操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*** EasyExcel下载步骤*///设置响应头response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");//设置防止文件名中文乱码String fileName = URLEncoder.encode("中文文件名","utf-8");response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");//构建写入到Excel中的数据(此数据可以从数据库中获取)List<User> users = new ArrayList<>();User user1 = new User(1001, "李雷1", "男", new Date());User user2 = new User(1002, "李雷2", "男", new Date());User user3 = new User(1003, "李雷3", "男", new Date());users.add(user1);users.add(user2);users.add(user3);EasyExcel.write(response.getOutputStream(),User.class).sheet("用户信息").doWrite(users);
    }
    

5.2 Excel上传

  • 前端页面

    1
    2
    3
    4
    
    <form action="${pageContext.request.contextPath }/UploadExcelServlet" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="上传">
    </form>
    
  • 接收从Excel中获取到的数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class User {@ExcelProperty("用户编号")private Integer userId;@ExcelProperty("用户名称")private String userName;@ExcelProperty("用户性别")private String gender;@ExcelProperty("创建时间")private Date createTime;
    }
    
  • 上传操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload fileUpload = new ServletFileUpload(factory);//设置单个文件为3MfileUpload.setFileSizeMax(1024*1024*3);//总文件大小为30MfileUpload.setSizeMax(1024*1024*3*10);try {List<FileItem> list = fileUpload.parseRequest(req);for (FileItem fileItem : list) {//判断是否为附件if(!fileItem.isFormField()) {//是附件InputStream inputStream = fileItem.getInputStream();EasyExcel.read(inputStream,User.class,new AnalysisEventListener<User>() {@Overridepublic void doAfterAllAnalysed(AnalysisContext arg0) {System.out.println("Excel全部读完被执行......");}@Overridepublic void invoke(User data, AnalysisContext arg1) {//读完一行就执行一次(调用数据库进行插入操作)System.out.println("解析一行: "+data);}}).sheet().doRead();}else {//普通表单}}} catch (FileUploadException e) {e.printStackTrace();}//上传完成进行转发或者重定向
    }

EasyExcel基本操作看这一篇文章就够了相关推荐

  1. js层级选择框样式_IOS和JS的交互,看这一篇文章就够了

    IOS和JS的交互,看这一篇文章就够了 创作不易,请珍惜,之后会持续更新,不断完善 Demo地址 目录 WKWebView使用.JS的交互 WKWebView使用.JS的交互 演示(本来想贴张GIF作 ...

  2. 关于VR产品的前世今生,看这一篇文章就够了

    关于VR产品的前世今生,看这一篇文章就够了(转) 文/胡勇 即使最富质疑精神最冷静的人也无法漠视现在的 VR/AR 掀起的狂潮,这个从科技圈蔓延到实业界最后席卷大众的想象力的狂欢正以前所未有的态势改变 ...

  3. 五年程序员是如何玩转闲鱼无货源的,只看这一篇文章就够了

    今天的内容方向主要是基础篇-进阶篇 ,优化了一下操作方法,尽量细化,让你看完这篇内容之后从入门到大神. 基础篇: 注册这些基础的之前说过,这次就不说了,这次说下如何养号. 完善个人资料(头像.昵称.简 ...

  4. 动态规划——01背包问题 看此一篇文章就够了

    本文讲述经典算法--动态规划的 常见问题 01背包  一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...

  5. 产品经理如何进行数据分析?看这一篇文章就够了

    一.数据分析的层级 产品的数据分析经常会遇到这样的问题:只有数据,没有分析.仅仅是描述数据,告诉你产品发生了什么. 比如次日留存率只有5%,这个数据偏低,可以看出该功能的用户粘性不好. 然后呢?往往就 ...

  6. java 计算机概述看这一篇文章就够了

    第一章 计算机概述 第1节 计算机介绍 1 广义上: 凡是可以帮助我们完成计算的工具统称为计算机(比如 算盘.计算器等...) 狭义上: 当前说计算机一般情况特指电子计算机(电脑) 第2节 计算机历史 ...

  7. ES学习看这一篇文章就够了

    第一章 ES简介 第1节 ES介绍 1 2 3 4 1.Elasticsearch是一个基于Lucene的搜索服务器 2.提供了一个分布式的全文搜索引擎,基于restful web接口 3.Elast ...

  8. 关于5G,看这一篇文章就够了

    对于大多数人来说,5G 这个名词即使不了解也一定听说过.不过,4G 时代不是才开始没几年吗?现在就说下一代无线通讯技术是不是有点早?确实是,不过时光飞逝岁月如梭,技术发展可不等人,5G移动通信可能很快 ...

  9. 如何进行云主机迁移?看这一篇文章就够了!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云计算产品团队发表于云+社区专栏 主机迁移概述 在云计算时代,不管是从IDC上云还是多云直接的迁移,都已经是常见的事宜.而在上云/ ...

最新文章

  1. C# 获取配置文件节点值
  2. strcpy ,strncpy ,strlcpy地用法
  3. 读取文件卡顿_奥睿科IV300固态硬盘评测:35克,读取超900M/s?
  4. 自动化运维工具Ansible实战(一)简介和部署
  5. 三星+android+u盘模式,三星安卓机,如何开启开发者模式,进行USB调试?
  6. LaTex 常用数学公式符号速记
  7. vios support for power
  8. mp4parser库
  9. 如何把应用程序和资料转移到新的硬盘?
  10. 机器学习笔记 - 行列式
  11. 高数下|级数4|手写笔记(绝对收敛与条件收敛)
  12. DSP28035控制舵机
  13. 浙大版《python程序设计》第四章课后习题
  14. bundle initial exceeded maximum budget. Budget 1.00 MB was not met by 642.91 kB with a total of 1.63
  15. 如何选择和阅读研究文献
  16. 室内设计计算机学什么软件,学习室内设计需要会用到哪些软件呢?
  17. mysql中ddl和ddm_浅析分布式数据库中间件DDM
  18. 《云原生安全技术规范》解读
  19. Random Thoughts #2 罗列几个国内的VR类应用
  20. JavaScript弹出对话框的三种方法

热门文章

  1. 简单的EasyUI登录界面
  2. Android性能优化实践
  3. python如何将两个list合并成字典_怎么把两个列表合并成字典 论Python怎样将两个list合并为一个字典...
  4. 创建表空间oracle10g,Oracle10g创建表空间慢问题
  5. 微信公众平台开发之微商城
  6. TIM基本定时器——定时
  7. idea中字体大小以及注释的颜色设置
  8. NVCC Fatal
  9. 笔记本电脑开机到登入页面扩展显示器和电脑突然黑屏很久才显示
  10. 苹果切换系统按哪个键_苹果全新笔记本 一体机正品专区