Фреймворк Excel с открытым исходным кодом Ali "easy-excel"

Java задняя часть
Фреймворк Excel с открытым исходным кодом Ali "easy-excel"

Публичный аккаунт WeChat:Программист Сяо И

предисловие

Опять ошибку написать? Когда мы сталкиваемся с ошибками в сети, нам может потребоваться восстановить данные, так что же нам делать в это время? Вы паникуете.После открытия офлайновой таблицы на некоторое время вы получаете кусок данных для восстановления,а затем пишете сценарий восстановления.Когда вы готовы выпустить восстановление,встает проблема,как разобрать данные и загрузить эти данные в память, а потом читать и восстанавливать по очереди? Слишком медленно.

Вот анализ открытого исходного кода АлиexcelРамкаeasy-excel.

что

Вот официальное введение

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

сможет сделать

  • Пакетная обработка и парсинг данных
  • Поддержка пользовательского сопоставления полей класса модели столбца таблицы excel
  • Чрезвычайно снижает использование памяти, прост в использовании

Быстрая практика

Давайте сначала напишем скрипт, чтобы почувствовать симуляцию и логику, требуемую обработанными данными. Предположим, это скрипт исправления.

Вы много работали, чтобы получить проблемные данные, которые необходимо исправить, из нескольких автономных таблиц, предполагая следующее:

image.png

хорошо, данные доступны, затем начните писать сценарий восстановления, мы сначала определяем интерфейс данных восстановленияFlushDataService.
/**
 * @创建时间 2021/7/11
 */
public interface FlushDataService {
    /**
     * 刷数据接口
     * @param index 为了扩展,定义刷数据文件索引
     */
    void flush(Integer index);
}
Переопределите заголовок Excel и восстановите модель, требуемую данными таблицы.ItemChannelExcel. Обратите внимание здесь@ExcelPropertyПримечания должны быть отмеченыindexсвойства принадлежат вамexcelИндекс столбца таблицы.
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.Data;

/**
 * @创建时间 2021/7/11
 */
@Data
public class ItemChannelExcel extends BaseRowModel {

    @ExcelProperty(index = 0)
    private Long itemNo;

    @ExcelProperty(index = 1)
    private Long itemName;
}
Здесь вам нужно написать слушателяItemChannelExcelListenerнаследоватьAnalysisEventListenerОбщий класс, напишите свою логику обработки бизнес-данных.
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @创建时间 2021/7/11
 */
@Service
public class ItemChannelExcelListener extends AnalysisEventListener<ItemChannelExcel> {

    private AtomicInteger totalHandleCount = new AtomicInteger(0);
    private AtomicInteger sucHandleCount = new AtomicInteger(0);
    private AtomicInteger failHandleCount = new AtomicInteger(0);

    @Override
    public void invoke(ItemChannelExcel channelExcel, AnalysisContext analysisContext) {
        System.out.println("正在处理的行row=="+channelExcel.getItemNo()+"==="+channelExcel.getItemName());

        //invoke rpc interface 这里mock
        try{
            //Result<Xxx> listItemRes = xxxService.listItems(Long shopId);
            //if(listItemRes.isSuccess()) {
            //    sucHandleCount.incrementAndGet();
            //}else{
            //    failHandleCount.incrementAndGet();
            //}
            sucHandleCount.incrementAndGet();
        }catch(Exception ex){
            failHandleCount.incrementAndGet();
        }final {
            totalHandleCount.incrementAndGet();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //全部处理完成的回调函数
        System.out.println("本次一共处理的数据有"+ totalHandleCount+"条");
        System.out.println("本次成功处理的数据有" + sucHandleCount + "条");
        System.out.println("本次失败处理的数据有" + failHandleCount + "条");
    }
Логика восстановления и модель готовы, теперь пришло время написать класс реализации.FlushDataServiceImpl,Обратите внимание, что здесь требуется анализ закачкиExcelСлушатель обязан прочитатьExcelУкажите расположение источника файла, а также модель синтаксического анализа и прослушиватели бизнес-процессов..
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.metadata.Sheet;

import java.io.InputStream;

/**
 * @创建时间 2021/7/11
 */
@service
public class FlushDataServiceImpl implements FlushDataService {
    
    @Resource
    private ItemChannelExcelListener itemChannelExcelListener;

    @Override
    public void flush(Integer index) {
        Class<? extends FlushDataServiceImpl> clazz = this.getClass();
        InputStream resourceAsStream = clazz.getResourceAsStream("/flush.xlsx");
        //这里创建Sheet对象 传1 主要是排查表头,因为excel第一行不需解析,读者按需要指定
        EasyExcelFactory.readBySax(resourceAsStream,new Sheet(1,1, ItemChannelExcel.class), itemChannelExcelListener);
    }
}

пройти тест

image.png

С эффектом все в порядке?Попробуем сейчас,но все равно молюсь,чтобы у вас было меньше проблем.Ведь вы все профессионалы,а баги неизбежны.Смысл в том,что у нас есть возможность быстро решать проблемы,когда они возникают. Ладно, увидимся в следующий раз~

Слова «Я люблю тебя» занимают всего три секунды, чтобы произнести их, три часа, чтобы объяснить, и всю жизнь, чтобы доказать.
«ошибка» состоит из трех букв, ее поиск занимает всего три секунды, три часа — и целая жизнь на отладку.

8c5ca209f75ccfe5ac0992eb229c3cc.png

Наконец

  • Статьи все оригинальные, а оригинальность непростая.Благодаря платформе Nuggets я чувствую, что кое-что приобрел.Помогите Sanlian, пополните
  • Все коды, диаграммы последовательности и диаграммы архитектуры, задействованные в статье, являются общими и могут быть получены, оставив сообщение на официальном аккаунте.
  • Если в статье есть ошибки, пожалуйста, прокомментируйте и оставьте сообщение, чтобы указать, и добро пожаловать на перепечатку, пожалуйста, отметьте источник