EasyExcel

常用API及注解

1、常用类
  • EasyExcel 入口类,用于构建开始各种操作;

  • ExcelReaderBuilder 构建出一个ReadWorkbook对象,即一个工作簿对象,对应的是一个Excel文件;

  • ExcelWriterBuilder 构建出一个WriteWorkbook对象,即一个工作簿对象,对应的是一个Excel文件;

  • ExcelReaderSheetBuilder 构建出一个ReadSheet对象,即一个工作表的对象,对应的Excel中的每个sheet,一个工作簿可以有多个工作表;

  • ExcelWriterSheetBuilder 构建出一WriteSheet对象,即一个工作表的对象,对应的Excel中的每个sheet,一个工作簿可以有多个工作表;

  • ReadListener 在每一行读取完毕后都会调用ReadListener来处理数据,我们可以把调用service的代码可以写在其invoke方法内部;

  • WriteHandler 在每一个操作包括创建单元格、创建表格等都会调用WriteHandler来处理数据,对使用者透明不可见;

  • 所有配置都是继承的 Workbook的配置会被Sheet继承。所以在用EasyExcel设置参数的时候,在EasyExcel…sheet()方法之前作用域是整个sheet,之后针对单个sheet。

2、读取时的注解
2.1 @ExcelProperty

使用位置:标准作用在成员变量上

可选属性:

属性名含义说明
index对应Excel表中的列数默认-1,建议指定时从0开始
value对应Excel表中的列头
converter成员变量转换器自定义转换器需要实Converter接口

使用效果:index属性可以指定当前字段对应excel中的哪一列,可以根据列名value去匹配,也可以不写。

如果不使用@ExcelProperty注解,成员变量从上到下的顺序,对应表格中从左到右的顺序;

**使用建议:**要么全部不写,要么全部用index,要么全部用名字去匹配,尽量不要三个混着用。

2.2 @ExcelIgnore

使用位置:标注在成员变量上,默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

2.3 @DateTimeFormat

使用位置:标注在成员变量上,日期转换,代码中用String类型的成员变量去接收excel中日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat

2.4 @NumberFormat

使用位置:标注在成员变量上,数字转换,代码中用String类型的成员变量去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat

2.5 @ExcelIgnoreUnannotated

使用位置:标注在类上。

不标注该注解时,默认类中所有成员变量都会参与读写,无论是否在成员变量上加了@ExcelProperty 的注解。

标注该注解后,类中的成员变量如果没有标注@ExcelProperty 注解将不会参与读写。

3、 读取时通用参数

ReadWorkbook,ReadSheet 都会有的参数,如果为空,默认使用上级。

  • converter 转换器,默认加载了很多转换器。也可以自定义。
  • readListener 监听器,在读取数据的过程中会不断的调用监听器。
  • headRowNumber 指定需要读表格的 列头行数。默认有一行头,也就是认为第二行开始起为数据。
  • headclazz二选一。读取文件头对应的列表,会根据列表匹配数据。建议使用clas,就是文件中每一行数据对应的代码中的实体类型。
  • clazzhead二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据。
  • autoTrim 字符串、表头等数据自动trim
  • password 读的时候是否需要使用密码
4、ReadWorkbook(工作簿对象)参数
  • excelType 当前excel的类型,读取时会自动判断,无需设置。
  • inputStreamfile二选一。建议使用file。
  • fileinputStream二选一。读取文件的文件。
  • autoCloseStream 自动关闭流。
  • readCache 默认小于5M用 内存,超过5M会使用 EhCache,不建议使用这个参数。
  • useDefaultListener @since 2.1.4 默认会加入ModelBuildEventListener 来帮忙转换成传入class的对象,设置成false后将不会协助转换对象,自定义的监听器会接收到Map<Integer,CellData>对象,如果还想继续接听到class对象,请调用readListener方法,加入自定义的beforeListenerModelBuildEventListener、 自定义的afterListener即可。
5、ReadSheet(工作表对象)参数
  • sheetNo 需要读取Sheet的编号,建议使用这个来指定读取哪个Sheet
  • sheetName 根据名字去匹配Sheet,excel 2003不支持根据名字去匹配
6、写入时的注解注解
@ExcelProperty

使用位置:标准作用在成员变量上

可选属性:

属性名含义说明
index对应Excel表中的列数默认-1,指定时建议从0开始
value对应Excel表中的列头
converter成员变量转换器自定义转换器需要实Converter接口

使用效果index 指定写到第几列,如果不指定则根据成员变量位置排序;

value指定写入的列头,如果不指定则使用成员变量的名字作为列头;

​ 如果要设置复杂的头,可以为value指定多个值。

其他注解:

基本和读取时一致

  • @ContentRowHeight() 标注在类上或属性上,指定内容行高

  • @HeadRowHeight() 标注在类上或属性上,指定列头行高

  • @ColumnWidth() 标注在类上或属性上,指定列宽

  • ExcelIgnore` 默认所有字段都会写入excel,这个注解会忽略这个字段

  • DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat

  • NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat

  • ExcelIgnoreUnannotated 默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与

7、写入时通用参数

WriteWorkbookWriteSheet都会有的参数,如果为空,默认使用上级。

  • converter 转换器,默认加载了很多转换器。也可以自定义。

  • writeHandler 写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用,对使用者透明不可见。

  • relativeHeadRowIndex 距离多少行后开始。也就是开头空几行

  • needHead 是否导出头

  • headclazz二选一。写入文件的头列表,建议使用class。

  • clazzhead二选一。写入文件的头对应的class,也可以使用注解。

  • autoTrim 字符串、表头等数据自动trim

8、WriteWorkbook(工作簿对象)参数

  • excelType 当前excel的类型,默认为xlsx

  • outputStreamfile二选一。写入文件的流

  • fileoutputStream二选一。写入的文件

  • templateInputStream 模板的文件流

  • templateFile 模板文件

  • autoCloseStream 自动关闭流。

  • password 写的时候是否需要使用密码

  • useDefaultStyle 写的时候是否是使用默认头

9、WriteSheet(工作表对象)参数

  • sheetNo 需要写入的编号。默认0

  • sheetName 需要些的Sheet名称,默认同sheetNo

一、快速开始
1.1简单的读
/**
 * 需求:单实体导入
 * 导入Excel学员信息到系统。
 * 包含如下列:姓名、性别、出生日期
 */

1.导入坐标

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.6</version>
</dependency>
<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>

2.创建excel每个字段对应的属性实体类

@Data 
public class Student{
    private String name;
    private String gender;
    private Date birthday;
    private String id;
}

3.读取excel文件 :调用EasyExcel的API读取的Excel文件的测试类

public class StudentReadDemo{
    public static void main(String[] args) throws FileNotFoundException{
        
        /*
        	pathName  		文件路径;"d:\\杭州黑马在线202003班学员信息.xls"
        	head			每行数据对应的实体;Student.class
        	readListener	读监听器,每读一样就会调用一次该监听器的invoke方法
        
        	sheet方法参数: 工作表的顺序号(从0开始)或者工作表的名字,不传默认为0
        */
        EasyExcel.read("202003班学员信息.xls",Sstudent.class,new StudentReadListener()).sheet().doRead();
    }
}

4.读取excel的监听器,用于处理读取产生的数据

public class StudentReadListner extends AnalysisEventListner<Student>{
    //每读一行excel表的数据,就会调用invoke方法一次
    @Override
    public void invoke(Student data, AnalysisContext context){
		System.out.println("data="+data);
    }
    
    // 全部读完之后,会调用该方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // TODO......
    }
}
1.2简单的写
/**
 * 需求:单实体导出
 * 导出多个学生对象到Excel表格
 * 包含如下列:姓名、性别、出生日期
 */

1.编写excel对应的实体类

@Data
public class Student{
    
    @ExcelIgnore  //忽略字段注解
    private String id;
    
    @ExcelProperty("姓名") //导出到excel的字段名
    private String name;
    
    @ExcelProperty("性别")
    private String gender;
    
    @ExcelProperty("出生日期")
    private Date birthday;
}

2.准备数据写入文件

public class StudentWriteDemo{
    public static void main(String[] args){
        List<Student> students = initData();
        /*
            String pathName 写入文件的路径
            Class head      写入文件的对象类型
            默认写入到07的xlsx中,如果想要写入xls,可以指定类型(待验证)
         */
        EasyExcel.write("202003班学员信息.xls",Student.class).sheet().doWrite(student); // sheet方法参数: 工作表的顺序号(从0开始)或者工作表的名字
    }
    
    private static List<Student> initData(){
        ArrayList<Student> students = new ArrayList<>();
        for(int i=0;i<10;i++){
            Student data = new Student();
            data.setName("喜羊羊"+i+"号");
            data.setBIrthday(new Date());
            data.setGender("男");
            students.add(data);
        }
        return students;
    }
}
二、文件上传和下载
2.1 基于springboot的文件上传

1.导入依赖

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>easyexcel</artifactId>
   <version>2.1.6</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.17</version>
</dependency>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.编写excel对应实体类

@Data
@Repository
public class Student{
    private String name;
    private String gender;
    private Date birthday;
    private String id;
}

3.编写回调监听器

@Component
@Scope("prototype")//多例模式
public class WebStudentListener extends AnalysisEventListener<Student>{
    
    @Autowired
    private StudentService studentService;
    
    private final int BATCH_SAVE_NUM = 5;
    List<Student> student = new ArrayList<>();
    
    private int count 0;
    
    //每读一样,会调用该invoke方法一次
    @Override
    public void invoke(Student data, AnalysisContext context) {
        students.add(data);
        if (++count % BATCH_SAVE_NUM == 0) {
            studentService.save(students);
            students.clear();
        }
    }
    
    // 全部读完之后,会调用该方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // TODO......
    }
    
}

4.业务代码接口StudentService和实现类StudentServiceImpl

public interface StudentService{
    void save(ArrayList<Student> students);
}

@Service
public class StudentServiceImpl implements StudentService{
    @Override
    public void save(ArrayList<Student> student){
        System.out.println("student in service = "+student);
    }
}

5.控制器读取上传的excel文件

@Controller
public class  WebUploadAndDownload{
	/**
     * 文件上传
     * 1. 编写excel中每一行对应的实体类
     * 2. 由于默认异步读取excel,所以需要逐行读取的回调监听器
     * 3. 开始读取Excel
     */
     @Autowired
    WebStudentListener webStudentListener;
    
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException{
        EasyExcel.read(file.getInputStream,Student.class,webStudentListener).sheet().doRead();
        return "success";
    }

}
2.1 基于springboot的文件下载

1.编写实体类并创建对象以便写入表格

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    @ExcelIgnore
    private String id;

    @ExcelProperty("学生姓名")
    private String name;

    @ExcelProperty("学生性别")
    private String gender;

    @ExcelProperty("学生出生日期")
    private Date birthday;
}

}

2.编码将数据写入到响应体实现下载

public class WebUploadAndDownload {

    /**
     * 文件下载
     * 1. 编写实体类并创建对象以便写入表格
     * 2. 设置响应参数:文件的ContentType和文件名,同时设置编码避免乱码
     * 3. 直接写,内部会调用finish方法自动关闭OutputStream
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        
        // 防止中文乱码 
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        
		//设置保存文件名	
        String fileName = URLEncoder.encode("学会表", "UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName + ".xlsx");
        
        
        //写入数据
         ServletOutputStream outputStream = response.getOutputStream();
         List<Student> studentList = initList();
         EasyExcel.write(outputStream,Student.class).sheet().doWrite(studentList);
    }
    
    // 循环生成10个学生对象
	private static List<Student> initData() {
    ArrayList<Student> students = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Student data = new Student();
        data.setName("杭州黑马学号0" + i);
        data.setBirthday(new Date());
        data.setGender("男");
        students.add(data);
       }
      return students;
    }
}
EasyExcel是一款基于Java的简单、快速、占用内存小的Excel处理工具,广泛应用于Web开发中处理Excel文件的场景。在面试中,可能会涉及到以下几个方面: 1. EasyExcel的基本概念和特性: EasyExcel支持读写Excel文件,相比于Apache POI等传统库,它具有更简洁的API、更少的内存消耗和更快的读写速度。特别适合处理大量数据的Excel读写操作。 2. EasyExcel的核心组件和工作原理: - Reader(读取器):用于读取Excel文件,可以按行、按列或按单元格的方式读取数据。 - Writer(写入器):用于写入数据到Excel文件,提供了同步和异步的写入方式。 - Converter(转换器):用于数据类型的转换,比如将字符串转换为日期等。 - Handler(处理器):用于处理读取数据过程中的回调操作。 3. EasyExcel的使用场景和优势: - 读写大数据量:EasyExcel能够处理超过百万行的数据,并且对内存的要求相对较低。 - 高效的读写性能:它通过优化内存使用,提供了解决内存溢出的问题。 - 注解方式配置:通过注解来映射Excel文件和Java对象,简化了代码的编写。 4. 面试可能会问的问题: - 如何使用EasyExcel实现一个读写Excel文件的功能? - EasyExcel如何处理大数据量的Excel文件? - 在什么情况下,你应该选择使用EasyExcel而不是Apache POI? - 描述一下EasyExcel的数据模型和它的数据处理流程。 - 如何在EasyExcel中自定义数据转换和格式化?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值