Публичный аккаунт 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
- Чрезвычайно снижает использование памяти, прост в использовании
Быстрая практика
Давайте сначала напишем скрипт, чтобы почувствовать симуляцию и логику, требуемую обработанными данными. Предположим, это скрипт исправления.
Вы много работали, чтобы получить проблемные данные, которые необходимо исправить, из нескольких автономных таблиц, предполагая следующее:
хорошо, данные доступны, затем начните писать сценарий восстановления, мы сначала определяем интерфейс данных восстановления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);
}
}
пройти тест
С эффектом все в порядке?Попробуем сейчас,но все равно молюсь,чтобы у вас было меньше проблем.Ведь вы все профессионалы,а баги неизбежны.Смысл в том,что у нас есть возможность быстро решать проблемы,когда они возникают. Ладно, увидимся в следующий раз~
Слова «Я люблю тебя» занимают всего три секунды, чтобы произнести их, три часа, чтобы объяснить, и всю жизнь, чтобы доказать.
«ошибка» состоит из трех букв, ее поиск занимает всего три секунды, три часа — и целая жизнь на отладку.
Наконец
- Статьи все оригинальные, а оригинальность непростая.Благодаря платформе Nuggets я чувствую, что кое-что приобрел.Помогите Sanlian, пополните
- Все коды, диаграммы последовательности и диаграммы архитектуры, задействованные в статье, являются общими и могут быть получены, оставив сообщение на официальном аккаунте.
- Если в статье есть ошибки, пожалуйста, прокомментируйте и оставьте сообщение, чтобы указать, и добро пожаловать на перепечатку, пожалуйста, отметьте источник