easyExcel импортирует Excel, возвращает строку, к которой принадлежит сообщение об ошибке, и добавляет ненулевое проверочное заключение.
easyExcel импортирует Excel, возвращает строку, к которой принадлежит сообщение об ошибке, и добавляет ненулевое проверочное заключение.

easyExcel импортирует Excel, возвращает строку, к которой принадлежит сообщение об ошибке, и добавляет ненулевое проверочное заключение.

В проекте определенно будут некоторые функции импорта Excel. Существующая проблема: исключение преобразования типа во время импорта. Если выдается только исключение ошибки, пользователь не сможет понять сообщение об ошибке. какая это строка и столбец. В данных имеется аномалия. Без дальнейших церемоний, давайте перейдем к коду.

Импортированный фреймворкeasyExcelhttps://easyexcel.opensource.alibaba.com/

1. Верните функцию строки, которой принадлежит сообщение об ошибке.

Код прослушивателя ExcelListener:

Язык кода:javascript
копировать
/**
 * @author : Подметающий монах
 * @date :2023/08/29 0029 13:35
 * @version: V1.0
 * @slogan: В моём поколении мир неспокойный, и как только я ввожу код, годы мчат меня
 * @description: Универсальный EasyExcel слушатель
 **/
@Slf4j
public final class ExcelListener<T> extends AnalysisEventListener<T> {

    /**
     * Настроено для временного хранения данных
     * Значение можно получить через экземпляр
     */
    private List<T> datas = new ArrayList<>();

    /**
     * Метод вызова() будет вызываться каждый раз при анализе строки.
     * @param data  объект данных после чтения
     * @param context содержание
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
       
            datas.add(data);
      
    }

    /**
     * Действия после прочтения
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
     log.info("Чтение всех данных завершено");
    }

    /**
     * аномальныйметод (Преобразование типа аномальный также будет выполнять этот метод)  (Чтение аномальной строки также выполнит этот метод)
     *
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        log.info("иметьаномальный");        // Если это преобразование определенной ячейки аномальное Можно получить конкретный номер строки
        // Если вы хотите получить информацию заголовка Используется с ignoreHeadMap.
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            log.error("Нет.{}ХОРОШО,Нет.{}анализ столбцааномальный,данныедля:{}", excelDataConvertException.getRowIndex(),
                    excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData());
            выдать новое RuntimeException("Нет."+excelDataConvertException.getRowIndex()+"ХОРОШО" +
                    "," + (excelDataConvertException.getColumnIndex() + 1) + «Ошибка чтения столбца»);
        }
    }

    /**
     * возвращатьсяданные     * @return Возвращает прочитанную коллекцию данных.
     **/
    public List<T> getDatas() {
        return datas;
    }
}

Преимущество определения типа прослушивателя как общего заключается в том, что Независимо от того, какая таблица используется для импорта функции Требуется только этот прослушиватель, а конкретные бизнес-методы передаются Сервису. Уведомление:RuntimeException Исключения — это исключения времени выполнения Java, если в компании есть специально определенный класс исключений. Просто замените его

Код класса сущности

Язык кода:javascript
копировать
@Data
@TableName("sys_test")
public class SysTestEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId(type = IdType.ASSIGN_ID)
    private String id;

    /**
     * Имя
     */
    @ExcelProperty("Имя")
    private String name;

    /**
     * возраст
     */
    @ExcelProperty("возраст")
    private Integer age;

    /**
     * Номер телефона
     */
    @ExcelProperty("Номер телефона")
    private Integer phone;

    /**
     * зарплата
     */
    @ExcelProperty("зарплата")
    private BigDecimal salary;

    /**
     * День рождения
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelProperty("День рождения")
    private Date birthday;

}

код контроллера

Язык кода:javascript
копировать
@RestController
@RequestMapping("test/systest")
public class SysTestController {
    @Autowired
    private SysTestService sysTestService;
    /**
 * Импорт шаблона
 * @param file
 * @return
 * @throws IOException
 */
    @PostMapping("upload")
    @ResponseBody
    public Result upload(MultipartFile file) throws IOException {
            //Используем дженерики для указания классов сущностей
            ExcelListener<SysTestEntity> excelListener = new ExcelListener<>();
            //читатьданные           EasyExcel.read(file.getInputStream(),SysTestEntity.class,excelListener).headRowNumber(1).sheet(0).doRead();
            //Получаем прочитанные данные
            List<SysTestEntity> list = excelListener.getDatas();
             //Используем метод пакетного добавления
            sysTestService.saveBatch(list);
            return ResultUtil.success("Импорт успешен");
    }
}

Внедрить ненулевую проверку

Идеи реализации непустой проверки:

  1. Пользовательские аннотации, определение сообщения об ошибке
  2. Пользовательский парсер,Получить информацию о классе посредством отражения,Проверьте по аннотации,Выдает аномальный результат, если ввод пуст.

Пользовательские аннотации

Язык кода:javascript
копировать
/**
 * @author : Подметающий монах
 * @date :2023/08/29 0029 15:00
 * @version: V1.0
 * @slogan: В моём поколении мир неспокойный, и как только я ввожу код, годы мчат меня
 * @description: ExcelValid ненулевая проверка аннотация
 **/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelValid {
    String message() default «Импорт имеет незаполненные поля»;
}

Пользовательский валидатор

Язык кода:javascript
копировать
/**
 * @author : Подметающий монах
 * @date :2023/08/29 0029 15:02
 * @version: V1.0
 * @slogan: В моём поколении мир неспокойный, и как только я ввожу код, годы мчат меня
 * @description:
 **/
public class ExcelImportValid {
    /**
     * Проверка поля импорта Excel
     *
     * @param object Проверенные JavaBeans Его атрибуты должны иметь Пользовательские аннотации
     */
    public static void valid(Object object) {
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            //Установить доступный
            field.setAccessible(true);
            //значение атрибута
            Object fieldValue = null;
            try {
                fieldValue = field.get(object);
            } catch (IllegalAccessException e) {
                throw new RuntimeException("Проверка параметров импорта не удалась");
            }
            //Содержит ли он требуемую аннотацию проверки
            boolean isExcelValid = field.isAnnotationPresent(ExcelValid.class);
            if (isExcelValid && Objects.isNull(fieldValue)) {
                System.out.println("Ошибка импорта");
                System.out.println(field.getAnnotation(ExcelValid.class).message());
                throw new RuntimeException("NULL"+field.getAnnotation(ExcelValid.class).message());
            }
        }
    }



}

Добавление аннотаций к классам сущностей

Язык кода:javascript
копировать
@Data
@TableName("sys_test")
public class SysTestEntity implements Serializable {
    private static final long serialVersionUID = 1L;


    /**
     * id
     */
    @TableId(type = IdType.ASSIGN_ID)
    private String id;

    /**
     * Имя
     */
    @ExcelProperty("Имя")
    @ExcelValid(message = "Имя不能для空")
    private String name;

    /**
     * возраст
     */
    @ExcelProperty("возраст")
    private Integer age;

    /**
     * Номер телефона
     */
    @ExcelProperty("Номер телефона")
    private Integer phone;

    /**
     * зарплата
     */
    @ExcelProperty("зарплата")
    private BigDecimal salary;

    /**
     * День рождения
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelProperty("День рождения")
    private Date birthday;

}

Код прослушивателя ExcelListener

Язык кода:javascript
копировать
/**
 * @author : Подметающий монах
 * @date :2023/08/29 0029 13:35
 * @version: V1.0
 * @slogan: В моём поколении мир неспокойный, и как только я ввожу код, годы мчат меня
 * @description: Универсальный EasyExcel слушатель
 **/
@Slf4j
public final class ExcelListener<T> extends AnalysisEventListener<T> {

    /**
     * Настроено для временного хранения данных
     * Значение можно получить через экземпляр
     */
    private List<T> datas = new ArrayList<>();

    /**
     * Метод вызова() будет вызываться каждый раз при анализе строки.
     * @param data  объект данных после чтения
     * @param context содержание
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
        //данные сохраняются в списке для пакетной обработки или последующей обработки бизнес-логики.
        try {
            ExcelImportValid.valid(data);
            datas.add(data);
        } catch (Exception e) {
            // Проверка не удалась, процесс аномальный
            System.out.println("Проверка не удалась:" + e.getMessage());
            // Другие меры обработки могут быть приняты по мере необходимости.
            throw new ApiException(e.getMessage());
        }
    }

    /**
     * Действия после прочтения
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
     log.info("Чтение всех данных завершено");
    }

    /**
     * аномальныйметод (Преобразование типа аномальный также будет выполнять этот метод)  (Чтение аномальной строки также выполнит этот метод)
     *
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        log.info("иметьаномальный");        // Если это преобразование определенной ячейки аномальное Можно получить конкретный номер строки
        // Если вы хотите получить информацию заголовка Используется с ignoreHeadMap.
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            log.error("Нет.{}ХОРОШО,Нет.{}анализ столбцааномальный,данныедля:{}", excelDataConvertException.getRowIndex(),
                    excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData());
            throw new ApiException("Нет."+excelDataConvertException.getRowIndex()+"ХОРОШО" +
                    "," + (excelDataConvertException.getColumnIndex() + 1) + «Ошибка чтения столбца»);
        }
        //Выдаем аномальную проверку на ненулевое значение
        throw new ApiException(exception.getMessage());
    }

    /**
     * возвращатьсяданные     * @return Возвращает прочитанную коллекцию данных.
     **/
    public List<T> getDatas() {
        return datas;
    }
}

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

boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]