EasyExcel 的使用


EasyExcel 的使用

一、简介

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。

ExsyExcel 的使用

  1. 依赖
<!-- easyexcel 依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>
  1. 创建实体类
@Data
public class Student implements Serializable {
//    @ExcelProperty(index = 2) index 设置从第几行读取数据默认从第一行 通过index修改
    //@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒") 时间格式化 想要的指定格式
    // @NumberFormat("#.##%")  想要的百分比数子
    /**
     * converter属性定义自己的字符串转换器
     *@ExcelProperty(converter = CustomStringConverter.class) 见下方自定义转换器
     *private String string;
     *
     */
    @ExcelProperty(converter = CustomStringConverter.class)
    @ExcelProperty("id")
    private Integer id;
    @ExcelProperty("name")
    private String name;
}
  1. 读表
@Test
public void read() {
    String fileName = "zzy.xlsx";
    // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    // 参数一:读取的excel文件路径
    // 参数二:读取sheet的一行,将参数封装在DemoData实体类中
    // 参数三:读取每一行的时候会执行DemoDataListener监听器
    EasyExcel.read(fileName, Student.class, new DemoDataListener()).sheet().doRead();
}
  1. 写表
@Test
public void simpleWrite() {
    String fileName = "zzy.xlsx";
    // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    // 如果这里想使用03 则 传入excelType参数即可
    // 参数一:写入excel文件路径
    // 参数二:写入的数据类型是DemoData
    // data()方法是写入的数据,结果是List<DemoData>集合
    EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(data());
}
  1. 文件的上传和下载
/**
	excel文件的下载
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
    EasyExcel.write(response.getOutputStream(), Student.class).sheet("zzy").doWrite(data());
}

/**
	excel文件的上传
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
    EasyExcel.read(file.getInputStream(), Student.class, new DemoDataListener()).sheet().doRead();
    return "success";
}
  1. 创建监听器
public class DemoDataListener extends AnalysisEventListener<DemoData> {

    List<DemoData> list = new ArrayList<DemoData>();
    
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public DemoDataListener() {}

    /**
     * @param data
     * @param context
     */
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        System.out.println("每一行的数据:{}", JSON.toJSONString(data));
        list.add(data);
    }

    /**
     * 数据处理完之后都会来调用
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println(JSON.toJSONString(list));
    }
}
  1. 自定义转化器
public class CustomStringConverter implements Converter<String> {
    @Override
    public Class supportJavaTypeKey() {
        return String.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 这里读的时候会调用
     */
    @Override
    public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) {
        return "自定义:" + cellData.getStringValue();
    }

    /**
     * 这里是写的时候会调用
     */
    @Override
    public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) {
        return new CellData(value);
    }

}
  1. 读取头文件
@Test
public void complexHeaderRead() {
    String fileName = "zzy.xlsx";
    // 这里 需要指定读用哪个class去读,然后读取第一个sheet 
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
        // 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入默认1行
        .headRowNumber(1).doRead();
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM