Начало работы с EasyExcel от Alibaba

Excel

1. О EasyExcel

1. Что такое EasyExcel и что он делает?

EasyExcel — это простой и экономичный проект с открытым исходным кодом для чтения и записи Excel на основе Java. В случае максимально возможной экономии памяти поддерживает чтение и запись сотен M Excel.

2. Почему вы выбрали EasyExcel, а не Apache POI или JXL?

Наиболее известными фреймворками для парсинга Java и генерации Excel являются Apache poi и jxl. Но у всех у них есть серьезная проблема, то есть они потребляют много памяти.У Poi есть набор API режима SAX, которые могут в определенной степени решить некоторые проблемы с переполнением памяти.Однако у POI все же есть некоторые недочеты.Например, Версия Excel 07 распаковывается и сохраняется после распаковки.Это делается в памяти, и потребление памяти по-прежнему очень велико. easyexcel переписал анализ poi для версии Excel 07. Первоначальный 3M excel, использующий POI sax, по-прежнему требует около 100 МБ памяти для сокращения до нескольких мегабайт, и независимо от того, насколько велик Excel, не будет переполнения памяти, версия 03 полагается на Режим саксофона POI. Преобразование модели инкапсулировано в верхнем уровне, что делает его проще и удобнее для пользователей.

3. Как им пользоваться?

Следующие главы позволяют быстро использовать EasyExcel для чтения и записи файлов Excel.

2. Начало работы с EasyExcel

1. Создайте новый проект maven и импортируйте пакет jar easyexcel.

Пакет jar проекта maven можно найти вmvnrepository.com/Поиск внутри, можно быстро найти нужный jar-пакет и версию.

Я выбрал последнюю версию 2.1.4 здесь.

2. Создайте новый класс сущностей

package com.hgl.entity;

import java.util.Date;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;

// 表示列宽
@ColumnWidth(20)
public class UserEntity {    
    
    // index--表示属性在第几列,value--表示标题
    @ExcelProperty(value = "姓名", index = 0)
    private String name;
    
    // @DateTimeFormat--对日期格式的转换
    @DateTimeFormat("yyyy-MM-dd")
    @ExcelProperty(value = "生日", index = 1)
    private Date birthday;

    @ExcelProperty(value = "电话", index = 2)
    private String telphone;
    
    // @NumberFormat--对数字格式的转换
    @NumberFormat("#.##")
    @ExcelProperty(value = "工资", index = 3)
    private double salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getTelphone() {
        return telphone;
    }

    public void setTelphone(String telphone) {
        this.telphone = telphone;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    
}

3. Обеспечьте интерфейс для внешних вызовов для записи в Excel

package com.hgl.controller;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.excel.EasyExcel;
import com.google.common.collect.Lists;
import com.hgl.entity.UserEntity;

@RestController
@RequestMapping("/excel")
public class ExcelWriteController{


    /**
     * 测试写入Excel文件
     * 
     * @param response
     * @throws IOException
     */
    @GetMapping("/download")
    public void doDownLoad(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=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), UserEntity.class).sheet("模板").doWrite(getData());
    }

    /**
     * 构造假数据,实际上应该从数据库查出来
     * 
     * @return List<UserEntity>
     */
    private List<UserEntity> getData(){
        List<UserEntity> users = Lists.newArrayList();
        for (int i = 1; i <= 9; i++) {
            UserEntity user = new UserEntity();
            user.setBirthday(new Date());
            user.setName("user_" + i);
            user.setSalary(1.285 * i);
            user.setTelphone("1888888888" + i);
            users.add(user);
        }
        return users;
    }
}

Скачать результат:

4. Обеспечить интерфейс для внешних вызовов для чтения Excel

Сначала нам нужно написать слушателя:

package com.hgl.listener;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.hgl.entity.UserEntity;

/**
 * 1、注意监听器不能由spring容器管理,每次调用时都需要手动new
 * 2、监听器内部需要使用ioc中的bean时,可以通过构造方法传入
 * 
 * @author guilin
 *
 */
public class UserListener extends AnalysisEventListener<UserEntity>{
    
    private List<UserEntity> data = Lists.newArrayList();
    
    private static final Logger LOGGER = LoggerFactory.getLogger(UserListener.class);
    
    /**
     *    解析每条数据时都会调用 
     */
    @Override
    public void invoke(UserEntity user, AnalysisContext context) {
        data.add(user);
    }

    /**
     *    所有数据解析完之后调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 可以在此处执行业务操作
        // 本例就打印到控制台即可,表示读取完成
        LOGGER.info(JSON.toJSONString(data));
    }

} 

Читать метод:

package com.hgl.controller;

import java.io.IOException;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.excel.EasyExcel;
import com.hgl.entity.UserEntity;
import com.hgl.listener.UserListener;

@RestController
@RequestMapping("/excel")
public class ExcelReadController {
    
    /**
     * 测试读取Excel文件
     * 
     * @param file
     * @return String
     */
    @PostMapping("/read")
    public String doDownLoad(MultipartFile file) throws IOException {
         EasyExcel.read(file.getInputStream(), UserEntity.class, new UserListener()).sheet().doRead();
         return "success";
    }
} 

Используйте postman для проверки прочитанных данных:

Данные успешно прочитаны:

3. Закрытие

В этой статье представлен простейший пример использования EasyExcel для операций чтения и записи. Дополнительные методы использования см. в официальной документации или в сообществе открытого исходного кода.

Прикрепите официальный адрес документа:alibaba-easyexcel.github.io/

Адрес с открытым исходным кодом на GitHub:GitHub.com/Alibaba/EAS…