• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用Easy Excel对excel的读写

武飞扬头像
五十六精研
帮助2

目录

Easy Excel

所需依赖

准备一个excel文件

对excel的读取

创建对应的实体类

创建EasyExcelUtil类

修改实体类

对excel的写入

在EasyExcelUtil类中加入写方法

对excel的填充

在EasyExcelUtil类中加入填充方法

 整合为工具类


Easy Excel

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

所需依赖

  1.  
    <dependencies>
  2.  
    <dependency>
  3.  
    <groupId>org.springframework.boot</groupId>
  4.  
    <artifactId>spring-boot-starter</artifactId>
  5.  
    </dependency>
  6.  
     
  7.  
    <dependency>
  8.  
    <groupId>org.springframework.boot</groupId>
  9.  
    <artifactId>spring-boot-starter-test</artifactId>
  10.  
    <scope>test</scope>
  11.  
    </dependency>
  12.  
     
  13.  
    <!--lombok依赖可以不加,只是之后要手动的写getset方法-->
  14.  
    <dependency>
  15.  
    <groupId>org.projectlombok</groupId>
  16.  
    <artifactId>lombok</artifactId>
  17.  
    <version>1.18.24</version>
  18.  
    <scope>provided</scope>
  19.  
    </dependency>
  20.  
     
  21.  
    <!--easyexcel-->
  22.  
    <dependency>
  23.  
    <groupId>com.alibaba</groupId>
  24.  
    <artifactId>easyexcel</artifactId>
  25.  
    <version>2.1.6</version>
  26.  
    </dependency>
  27.  
    <!--slf4j 日志-->
  28.  
    <dependency>
  29.  
    <groupId>org.slf4j</groupId>
  30.  
    <artifactId>slf4j-log4j12</artifactId>
  31.  
    <version>1.7.30</version>
  32.  
    </dependency>
  33.  
    </dependencies>
学新通

准备一个excel文件

内容如下:

学新通

id 姓名 年龄
1 小明 12
2 小红 13
3 小刚 13
4 小美 11
5 小智 10

对excel的读取

创建对应的实体类

  1.  
    @Data
  2.  
    @AllArgsConstructor
  3.  
    @NoArgsConstructor
  4.  
    public class User {
  5.  
    private String id;
  6.  
    private String name;
  7.  
    private Integer age;
  8.  
    }

如果没有导入lombok依赖需要手动加入get,set方法和构造方法

创建EasyExcelUtil类

  1.  
    package com.li.utils;
  2.  
     
  3.  
    import com.alibaba.excel.EasyExcel;
  4.  
    import com.alibaba.excel.context.AnalysisContext;
  5.  
    import com.alibaba.excel.event.SyncReadListener;
  6.  
    import com.li.pojo.DemoData;
  7.  
    import com.li.pojo.User;
  8.  
     
  9.  
    import java.util.ArrayList;
  10.  
    import java.util.List;
  11.  
     
  12.  
    public class EasyExcelUtil {
  13.  
     
  14.  
    public static void main(String[] args) {
  15.  
    EasyExcelUtil.read1();
  16.  
    }
  17.  
     
  18.  
    private static void read1() {
  19.  
    final List list = new ArrayList();
  20.  
    //使用EasyExcel读取test1.xlsx文件
  21.  
    EasyExcel.read("C:\\Users\\lenovo\\Desktop\\user.xlsx", User.class, new SyncReadListener() {
  22.  
    //EasyExcel在读取excel表格时,每读取到一行,就会调用一次这个方法,
  23.  
    //并且将读取到的行数据,封装到指定类型(User)的对象中,传递给我们(Object object)
  24.  
    /*
  25.  
    此问题可能出现在低版本的easyExcel中,出现时可以按照下列方式解决
  26.  
    如果表格数据不是顶行写的,需要通过headRowNumber指定表头行的数量
  27.  
    如果表格数据不是顶列写的,需要在封装的实体属性上通过@ExcelProperty将实体属性和表格列名进行对应
  28.  
    */
  29.  
    @Override
  30.  
    public void invoke(Object object, AnalysisContext context) {
  31.  
    System.out.println(object);
  32.  
    list.add(object);
  33.  
    }
  34.  
    }).doReadAll();
  35.  
     
  36.  
    //获取读取到的数据
  37.  
    for (Object object : list) {
  38.  
    User user = (User) object;
  39.  
    System.out.println(user);
  40.  
    }
  41.  
    }
  42.  
    }
学新通

运行main后效果如下:

学新通

添加一个方法后再次运行

  1.  
    package com.li.utils;
  2.  
     
  3.  
    import com.alibaba.excel.EasyExcel;
  4.  
    import com.alibaba.excel.context.AnalysisContext;
  5.  
    import com.alibaba.excel.event.AnalysisEventListener;
  6.  
    import com.alibaba.excel.event.SyncReadListener;
  7.  
    import com.li.pojo.DemoData;
  8.  
    import com.li.pojo.User;
  9.  
     
  10.  
    import java.util.ArrayList;
  11.  
    import java.util.List;
  12.  
    import java.util.Map;
  13.  
     
  14.  
    public class EasyExcelUtil {
  15.  
     
  16.  
    public static void main(String[] args) {
  17.  
    EasyExcelUtil.read2();
  18.  
    }
  19.  
     
  20.  
    private static void read1() {
  21.  
    final List list = new ArrayList();
  22.  
    //使用EasyExcel读取test1.xlsx文件
  23.  
    EasyExcel.read("C:\\Users\\lenovo\\Desktop\\user.xlsx", User.class, new SyncReadListener() {
  24.  
    //EasyExcel在读取excel表格时,每读取到一行,就会调用一次这个方法,
  25.  
    //并且将读取到的行数据,封装到指定类型(User)的对象中,传递给我们(Object object)
  26.  
    /*
  27.  
    此问题可能出现在低版本的easyExcel中,出现时可以按照下列方式解决
  28.  
    如果表格数据不是顶行写的,需要通过headRowNumber指定表头行的数量
  29.  
    如果表格数据不是顶列写的,需要在封装的实体属性上通过@ExcelProperty将实体属性和表格列名进行对应
  30.  
    */
  31.  
    @Override
  32.  
    public void invoke(Object object, AnalysisContext context) {
  33.  
    System.out.println(object);
  34.  
    list.add(object);
  35.  
    }
  36.  
    }).doReadAll();
  37.  
     
  38.  
    //获取读取到的数据
  39.  
    for (Object object : list) {
  40.  
    User user = (User) object;
  41.  
    System.out.println(user);
  42.  
    }
  43.  
    }
  44.  
     
  45.  
    private static void read2() {
  46.  
    final List list = new ArrayList();
  47.  
    //使用EasyExcel读取test1.xlsx文件
  48.  
    EasyExcel.read("C:\\Users\\lenovo\\Desktop\\user.xlsx", User.class, new AnalysisEventListener<User>() {
  49.  
    //重写子类方法
  50.  
    @Override
  51.  
    public void invoke(User user, AnalysisContext analysisContext) {
  52.  
    list.add(user);
  53.  
    }
  54.  
     
  55.  
    //重写子类方法
  56.  
    @Override
  57.  
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  58.  
     
  59.  
    }
  60.  
     
  61.  
    @Override
  62.  
    public void invokeHeadMap(Map headMap, AnalysisContext context) {
  63.  
    System.out.println(headMap);
  64.  
    }
  65.  
    }
  66.  
    ).doReadAll();
  67.  
     
  68.  
    //获取读取到的数据
  69.  
    for (Object o : list) {
  70.  
    User user = (User) o;
  71.  
    System.out.println(user);
  72.  
    }
  73.  
    }
  74.  
     
  75.  
    }
学新通

运行效果如下:

学新通

这次的方法可以获取到表头

修改实体类

  1.  
    @Data
  2.  
    @AllArgsConstructor
  3.  
    @NoArgsConstructor
  4.  
    public class User {
  5.  
    @ExcelProperty(index = 0)
  6.  
    private String id;
  7.  
    @ExcelProperty("姓名")
  8.  
    private String name;
  9.  
    @ExcelProperty(index = 3)
  10.  
    private Integer age;
  11.  
    }

 @ExcelProperty注解中的index表示excel表中的列,默认是0,下标从0开始。默认的name,也就是名字,表示该列的表头。

不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配。

用名字去匹配,需要注意,如果名字重复,会导致只有一个字段读取到数据。

如果有一个index的列向后移动了一列,那么之后的属性默认会获取向后移动一列的数据

修改好后运行结果如下

学新通

这里可以看到age没有获取到值,因为我们将他的index设置的3,是没有值的列。

 将其修改为2后就会恢复正常

学新通学新通

对excel的写入

在EasyExcelUtil类中加入写方法

  1.  
    private static void write1() {
  2.  
    List list = new ArrayList();
  3.  
    list.add(new User("1", "大明", 1));
  4.  
    list.add(new User("2", "大红", 1));
  5.  
    list.add(new User("3", "大刚", 1));
  6.  
    //1.
  7.  
    EasyExcel
  8.  
    .write("C:\\Users\\lenovo\\Desktop\\user.xlsx", User.class)
  9.  
    .sheet(1)//可以在其中写入数字,将其设置为sheet页的名称,不写默认是0
  10.  
    .doWrite(list);
  11.  
    }
  12.  
     
  13.  
    public static void write2(){
  14.  
    List list = new ArrayList();
  15.  
    list.add(new User("1", "大明", 1));
  16.  
    list.add(new User("2", "大红", 1));
  17.  
    list.add(new User("3", "大刚", 1));
  18.  
    //2.
  19.  
    ExcelWriter excelWriter = null;
  20.  
    try {
  21.  
    excelWriter = EasyExcel.write("C:\\Users\\lenovo\\Desktop\\user.xlsx", User.class).build();
  22.  
    WriteSheet writeSheet = EasyExcel.writerSheet("sheet名称").build();
  23.  
    excelWriter.write(list, writeSheet);
  24.  
    } finally {
  25.  
    // 千万别忘记finish 会帮忙关闭流
  26.  
    if (excelWriter != null) {
  27.  
    excelWriter.finish();
  28.  
    }
  29.  
    }
  30.  
    }
学新通

然后在main方法中运行后查看excel表

学新通学新通

 运行write2()效果

学新通

 在对表进行写的时候,表头默认是属性名,也可以使用注解进行更改。

对excel的填充

在EasyExcelUtil类中加入填充方法

  1.  
    private static void write_template_multi() {
  2.  
    List list = new ArrayList();
  3.  
    /*list.add(new User("1", "大明", 1));
  4.  
    list.add(new User("2", "大红", 1));
  5.  
    list.add(new User("3", "大刚", 1));*/
  6.  
    EasyExcel
  7.  
    .write("C:\\Users\\lenovo\\Desktop\\user.xlsx", User.class)
  8.  
    .withTemplate("C:\\Users\\lenovo\\Desktop\\user_template.xlsx")
  9.  
    .sheet()
  10.  
    .doFill(list);
  11.  
    }

 该方法会将user_template.xlsx中的内容复制到user.xlsx中

创建一个user_template.xlsx文件,内容如下:

学新通

id 姓名 age
1 name 18

 然后在main中运行方法结果如下

user.xlsx的内容和user_template.xlsx一样了。

学新通

可以通过修改实体类的注解来改变表格中的样式

  1.  
    @Data
  2.  
    @AllArgsConstructor
  3.  
    @NoArgsConstructor
  4.  
    @HeadRowHeight(30) //表头行高
  5.  
    @ContentRowHeight(20) //数据行高
  6.  
    @ColumnWidth(25) //列宽
  7.  
    public class User {
  8.  
    @ExcelProperty("id")
  9.  
    private String id;
  10.  
    @ExcelProperty({"个人信息","姓名"})
  11.  
    private String name;
  12.  
    @ExcelProperty({"个人信息","年龄"})
  13.  
    private Integer age;
  14.  
    }

重新创建表格后的结果如下

学新通

 整合为工具类

  1.  
    import com.alibaba.excel.EasyExcel;
  2.  
    import com.alibaba.excel.ExcelWriter;
  3.  
    import com.alibaba.excel.context.AnalysisContext;
  4.  
    import com.alibaba.excel.event.AnalysisEventListener;
  5.  
    import com.alibaba.excel.event.SyncReadListener;
  6.  
    import com.alibaba.excel.write.metadata.WriteSheet;
  7.  
     
  8.  
    import java.io.File;
  9.  
    import java.util.*;
  10.  
     
  11.  
    public class EasyExcelUtil {
  12.  
     
  13.  
    /**
  14.  
    * 读取excel表格
  15.  
    * @param file 目标文件
  16.  
    * @param head 文件读出后所对应的类
  17.  
    * @return 返回读出数据的集合
  18.  
    */
  19.  
    private static List readExcel(File file,Class head) {
  20.  
    final List list = new ArrayList();
  21.  
    //使用EasyExcel读取.xlsx文件
  22.  
    EasyExcel.read(file, head, new SyncReadListener() {
  23.  
    @Override
  24.  
    public void invoke(Object object, AnalysisContext context) {
  25.  
    list.add(object);
  26.  
    }
  27.  
    }).doReadAll();
  28.  
    return list;
  29.  
    }
  30.  
     
  31.  
    /**
  32.  
    * 读取excel表格
  33.  
    * @param file 目标文件
  34.  
    * @param head 文件读出后所对应的类
  35.  
    * @return 返回一个Map,其中有数据的集合list,还有一个表格中的标题map
  36.  
    */
  37.  
    private static Map<String, Object> readExcelTitle(File file, Class head){
  38.  
    //使用EasyExcel读取.xlsx文件
  39.  
    List list=new ArrayList();
  40.  
    Map<String,Object> map=new HashMap<>();
  41.  
    EasyExcel.read(file,head, new AnalysisEventListener<Object>() {
  42.  
    //重写子类方法
  43.  
    @Override
  44.  
    public void invoke(Object object, AnalysisContext analysisContext) {
  45.  
    list.add(object);
  46.  
    }
  47.  
    //重写子类方法
  48.  
    @Override
  49.  
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  50.  
    }
  51.  
     
  52.  
    @Override
  53.  
    public void invokeHeadMap(Map headMap, AnalysisContext context) {
  54.  
    //headMap,中存放着表格标题
  55.  
    map.put("title",headMap);//将标题存放到定义的map中
  56.  
    System.out.println(headMap);
  57.  
    }
  58.  
    }
  59.  
    ).doReadAll();
  60.  
    map.put("data",list);//将数据存放到定义的map中
  61.  
    return map;
  62.  
    }
  63.  
     
  64.  
    /**
  65.  
    * 将数据写入到表格中,如果不存在则会创建一个表格
  66.  
    * @param file 目标文件
  67.  
    * @param list 要写入的数据
  68.  
    * @param head 数据对应的实体类
  69.  
    */
  70.  
    private static void writeExcel(File file, List list, Class head) {
  71.  
    EasyExcel
  72.  
    .write(file, head)
  73.  
    .sheet()
  74.  
    .doWrite(list);
  75.  
    }
  76.  
     
  77.  
    /**
  78.  
    * 将数据写入到表格中,如果不存在则会创建一个表格
  79.  
    * @param file 目标文件
  80.  
    * @param list 要写入的数据
  81.  
    * @param head 数据对应的实体类
  82.  
    * @param sheetName sheet页的名字
  83.  
    */
  84.  
    private static void writeExcel(File file, List list, Class head,String sheetName) {
  85.  
    ExcelWriter excelWriter = null;
  86.  
    try {
  87.  
    excelWriter = EasyExcel.write(file, head).build();
  88.  
    WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
  89.  
    excelWriter.write(list, writeSheet);
  90.  
    } finally {
  91.  
    // 千万别忘记finish 会帮忙关闭流
  92.  
    if (excelWriter != null) {
  93.  
    excelWriter.finish();
  94.  
    }
  95.  
    }
  96.  
    }
  97.  
     
  98.  
    /**
  99.  
    * 将模板数据写入到表格中
  100.  
    * @param file 对应的表格文件
  101.  
    * @param fileTemplate 模板文件
  102.  
    * @param head 对应的实体类
  103.  
    */
  104.  
    private static void write_template_multi(File file,File fileTemplate,Class head) {
  105.  
    List list = new ArrayList();
  106.  
    EasyExcel
  107.  
    .write(file, head)
  108.  
    .withTemplate(fileTemplate)
  109.  
    .sheet()
  110.  
    .doFill(list);
  111.  
    }
  112.  
     
  113.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbhagc
系列文章
更多 icon
同类精品
更多 icon
继续加载