Apache POI и easyExcel: углубленный технический анализ импорта и экспорта файлов Excel
Apache POI и easyExcel: углубленный технический анализ импорта и экспорта файлов Excel

1. Apache POI: комплексное, но тяжеловесное решение.

  • Apache POI — это давний и полнофункциональный проект с открытым исходным кодом для обработки файлов формата Microsoft Office, включая Excel. Он обеспечивает комплексную поддержку операций чтения и записи файлов Excel. При обработке файлов Excel POI поддерживает форматы .xls и .xlsx через два подпроекта: HSSF и XSSF. HSSF предназначен для старого двоичного формата Excel, а XSSF предназначен для нового формата Excel на основе XML.
  • При импорте файла Excel Apache POI Воля загрузит весь файл в Память.,Затем предоставьте API для доступа к отдельным элементам файла и управления ими.,Например, ячейки, строки, столбцы и т. д. Этот метод обработки существует очень эффективен при обработке небольших файлов.,Потому что это позволяет разработчикам получать доступ к содержимому файла любым способом. Однако,По мере увеличения размера файла,Потребление Память также резко увеличится,Это может привести к снижению производительности или даже переполнению Память.
  • При экспорте файла Excel Apache POI также требует, чтобы все данные Воли были загружены в Память.,Затем запишите файл за один раз. Такой способ существования может стать очень медленным при обработке больших объемов данных.,А это требует много ресурсов Память.
1.1 POI реализует чтение Excel

Ниже приведена демонстрация того, как импортировать (читать) и экспортировать (записывать) файлы Excel (формат .xlsx) с использованием Apache POI.

Язык кода:javascript
копировать
<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi</artifactId>  
    <version>5.2.0</version>  
</dependency>  
<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi-ooxml</artifactId>  
    <version>5.2.0</version>  
</dependency>

Откройте файл Excel, прочитайте данные и распечатайте содержимое на консоль:

Язык кода:javascript
копировать
import org.apache.poi.ss.usermodel.*;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
  
public class ExcelReaderExample {  
  
    public static void main(String[] args) {  
        // Укажите путь к файлу Excel для чтения  
        String filePath = "path/to/your/excel/file.xlsx";  
  
        // Открыть файл с помощью FileInputStream  
        try (FileInputStream fis = new FileInputStream(new File(filePath))) {  
  
            // Создать объект рабочей книги  
            Workbook workbook = new XSSFWorkbook(fis);  
  
            // Получите первый рабочий лист (Sheet), индекс начинается с 0.  
            Sheet sheet = workbook.getSheetAt(0);  
  
            // Перебрать каждую строку рабочего листа  
            for (Row row : sheet) {  
                // Перебирать каждую ячейку в строке  
                for (Cell cell : row) {  
                    // Прочитайте содержимое ячейки и распечатайте на консоли.  
                    System.out.print(getCellValue(cell) + "\t");  
                }  
                // Разрыв строки после каждой прочитанной строки  
                System.out.println();  
            }  
  
            // Когда работа будет завершена, закройте книгу (фактически в этом примере это не требуется, поскольку используется попытка с ресурсами).  
            // workbook.close();  
  
        } catch (IOException e) {  
            // Обработка исключений, которые могут возникнуть при чтении файла  
            e.printStackTrace();  
        }  
    }  
  
    // Вспомогательный метод: получение значения ячейки на основе типа ячейки.  
    private static String getCellValue(Cell cell) {  
        DataFormatter formatter = new DataFormatter(); // Создайте объект форматирования для обработки различных типов данных.  
        return formatter.formatCellValue(cell); // Возвращает отформатированное содержимое ячейки  
    }  
}

Обратите внимание, что метод getCellValue использует класс DataFormatter, чтобы гарантировать, что независимо от типа данных, содержащихся в ячейке (например, число, дата или текст), ее строковое представление возвращается в соответствующем формате.

Poi 1.2 реализует запись в Excel

При использовании Apache POI для записи файла Excel в формате .xlsx вам необходимо создать объект XSSFWorkbook, представляющий всю книгу, а затем создать в нем объект XSSFSheet, представляющий рабочий лист. Затем вы создаете строки и ячейки на листе и устанавливаете их значения. Наконец, книга записывается в файловую систему.

Язык кода:javascript
копировать
import org.apache.poi.ss.usermodel.*;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  
import java.io.FileOutputStream;  
import java.io.IOException;  
  
public class ExcelWriterExample {  
  
    public static void main(String[] args) {  
        // Создать новую книгу  
        Workbook workbook = new XSSFWorkbook();  
  
        // Создайте рабочий лист (Лист) с именем «MySheet».  
        Sheet sheet = workbook.createSheet("MySheet");  
  
        // Создайте строки в существующем рабочем листе (отсчет начинается с 0)  
        Row row = sheet.createRow(0);  
  
        // Создайте ячейки (считая от 0) в существующей строке и задайте значение  
        Cell cell = row.createCell(0);  
        cell.setCellValue("Hello");  
  
        // Создайте еще одну ячейку и установите значение  
        Cell cell2 = row.createCell(1);  
        cell2.setCellValue("World");  
  
        // Строки и ячейки также можно создавать в цепочке.  
        sheet.createRow(1).createCell(0).setCellValue("Apache");  
        sheet.getRow(1).createCell(1).setCellValue("POI");  
  
        // Запись в файловую систему  
        try (FileOutputStream fos = new FileOutputStream("path/to/your/excel/file.xlsx")) {  
            workbook.write(fos);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
        // Закройте книгу (в этом примере это не требуется, поскольку используется попытка с ресурсами).  
        // workbook.close();  
  
        System.out.println("Excel file written successfully.");  
    }  
}

2. easyExcel: легкий и эффективный инструмент обработки Excel.

  • easyExcelЭто легкий и эффективный продукт с открытым исходным кодом от Alibaba.Excelкадр обработки。Он нацелен на большиеExcelобработка файлов ХОРОШОоптимизированный,Использование потоковой обработки,Позволяет разработчикам читать и записывать данные построчно.,Тем самым значительно сокращая потребление Память. существуют при импорте файлов Excel,easyExcel использует модель, управляемую событиями. Он не загружает весь файл в Память,Вместо этого он анализирует файл построчно.,через функцию обратного вызова Воля Каждый ХОРОШОДанные передаются разработчику для ХОРОШОиметь дело с。
  • EasyExcel Он улучшен на основе механизма анализа POI, но не переписан полностью. Apache POI Весь механизм синтаксического анализа, особенно для XLSX формат файла (т. Excel 2007 Формат, используемый версиями выше и выше, POI Соответствующий XSSF реализации), он по-прежнему основан на POI некоторые базовые структуры и функции. Однако EasyExcel существовать POI прогресс на основе ХОРОШОМножество оптимизаций и рефакторингов.,Для достижения более высокой производительности и снижения потребления Память.
2.1 Оптимизация, выполненная EasyExcel

Одним из основных улучшений EasyExcel является внедрение стратегий «разделения чтения и записи» и «отложенной загрузки» при обработке больших данных. В частности, EasyExcel произвел следующие оптимизации:

  • Анализ по программе: EasyExcel не загрузит весь файл в Память сразу.,Вместо этого он считывает и анализирует данные по требованию.,Через скользящие окна обрабатываются только необходимые в данный момент строки данных.,Тем самым значительно уменьшая заполняемость Память.
  • Написать оптимизацию:существовать Запись данныхчас,EasyExcel также использует стратегию потоковой записи.,Воля данные записываются на диск пакетно,Это позволяет избежать проблемы переполнения при большом объеме данных.
  • Памятьуправлять:EasyExcel верно Память Использование ХОРОШО了精细化的управлять,Уменьшите частоту выделения памяти и сборки мусора с помощью таких технологий, как пул объектов и оптимизация кэша.,Улучшена скорость обработки.
  • Сопоставление модели: с помощью аннотаций и механизмов отражения EasyExcel может напрямую сопоставлять строки данных Excel с объектами Java, упрощая процесс преобразования данных.
  • Обработка исключений: EasyExcel предоставляет более удобный механизм обработки исключений, который помогает разработчикам быстро находить и устранять проблемы, которые могут возникнуть в процессе чтения и записи.
  • Расширяемость: EasyExcel разработал более гибкую и расширяемую архитектуру, позволяющую разработчикам настраивать и расширять функции путем реализации определенных интерфейсов.

Хотя EasyExcel выполнил множество оптимизаций на основе POI, он по-прежнему использует некоторые основные компоненты POI для обработки основных деталей файлов XLSX. Таким образом, при использовании EasyExcel вы все равно можете видеть тень POI, особенно при работе с некоторыми сложными функциями Excel. Однако EasyExcel предоставляет более эффективное и лаконичное решение для большинства распространенных задач чтения и записи Excel.

2.2 easyExcel реализует пакетное чтение Excel

В ваш проект добавлена ​​зависимость easyExcel. Если вы используете Maven, вы можете добавить в файл pom.xml следующие зависимости:

Язык кода:javascript
копировать
<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>easyexcel</artifactId>  
    <version>последняя версия</version> <!-- Пожалуйста, замените фактический номер последней версии. -->  
</dependency>

Используйте API чтения easyExcel и укажите индекс листа для чтения (отсчет начинается с 0, индекс второго листа равен 1).

Реализуйте прослушиватель для обработки считанных строк данных и пакетной записи данных в базу данных в этом прослушивателе.

Язык кода:javascript
копировать
import com.alibaba.excel.EasyExcel;  
import com.alibaba.excel.context.AnalysisContext;  
import com.alibaba.excel.event.AnalysisEventListener;  
import com.alibaba.excel.read.builder.ExcelReaderBuilder;  
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;  
import com.alibaba.excel.read.metadata.ReadSheet;  
  
import java.util.ArrayList;  
import java.util.List;  
  
// Класс модели данных  
class DataModel {  
    private String column1;  
    private String column2;  
    // ... Другие поля  
  
    // Опустить методы получения и установки  
}  
  
// Класс для чтения Excel и записи в базу данных  
public class ExcelReaderToDB {  
  
    // Имитированный метод пакетной записи в базу данных  
    private void batchInsertToDB(List<DataModel> dataList) {  
        // Это должен быть код, который фактически записывает данные Воли в базу данных.  
        // Здесь мы делаем только моделирование распечатки  
        System.out.println("Inserting batch of " + dataList.size() + " rows to DB...");  
        for (DataModel data : dataList) {  
            System.out.println(data);  
        }  
    }  
  
    // Как читать файлы Excel  
    public void readExcelFile(String filePath) {  
        // Индекс второго листа равен 1.  
        int sheetIndex = 1;  
  
        // Чтение файла Excel  
        ExcelReaderBuilder readerBuilder = EasyExcel.read(filePath);  
        ExcelReaderSheetBuilder sheetBuilder = readerBuilder.sheet(sheetIndex);  
  
        // Чтение данных и регистрация прослушивателей  
        sheetBuilder.registerReadListener(new AnalysisEventListener<DataModel>() {  
            // Используется для кэширования считанных данных  
            private List<DataModel> cachedDataList = new ArrayList<>();  
  
            // Этот метод вызывается при чтении каждой строки данных  
            @Override  
            public void invoke(DataModel dataModel, AnalysisContext analysisContext) {  
                cachedDataList.add(dataModel);  
                // При считывании определенного объема данных можно выполнить пакетную запись в базу данных.  
                // Здесь предполагается, что мы записываем в базу данных каждый раз, когда читаем 100 строк данных.  
                if (cachedDataList.size() >= 100) {  
                    batchInsertToDB(cachedDataList);  
                    // Очистить кеш  
                    cachedDataList.clear();  
                }  
            }  
  
            // Этот метод будет вызван после завершения всего анализа данных.  
            @Override  
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {  
                // Воля Остальные данные записываются в базу данных  
                if (!cachedDataList.isEmpty()) {  
                    batchInsertToDB(cachedDataList);  
                    cachedDataList.clear();  
                }  
            }  
        });  
  
        // Начать читать  
        sheetBuilder.build();  
        readerBuilder.build().read();  
    }  
  
    public static void main(String[] args) {  
        String filePath = "path/to/your/excel/file.xlsx";  
        ExcelReaderToDB excelReader = new ExcelReaderToDB();  
        excelReader.readExcelFile(filePath);  
    }  
}
2.3 easyExcel реализует запись в Excel

Определите класс модели для представления данных, которые вы хотите записать. Создайте класс модели данных для сопоставления столбцов данных в таблице Excel и используйте аннотации easyExcel для определения связи заголовка таблицы и сопоставления полей.

Напишите метод для создания объекта записи Excel и заполнения данных в файл Excel.

Язык кода:javascript
копировать
import com.alibaba.excel.EasyExcel;  
import com.alibaba.excel.write.metadata.WriteSheet;  
import com.alibaba.excel.annotation.ExcelProperty;  
  
import java.util.ArrayList;  
import java.util.List;  
  
// Класс модели данных,Используйте аннотации для определения связей сопоставления заголовков и полей.  
public class DataModel {  
  
    // Сопоставление имен заголовков и полей  
    @ExcelProperty("имя")  
    private String name;  
  
    @ExcelProperty("возраст")  
    private Integer age;  
  
    // Опустить методы получения и установки  
  
    // Конструктор  
    public DataModel(String name, Integer age) {  
        this.name = name;  
        this.age = age;  
    }  
}  
  
// Класс для экспорта данных в Excel  
public class ExcelExporter {  
  
    // смоделированные данные  
    private List<DataModel> getData() {  
        List<DataModel> list = new ArrayList<>();  
        list.add(new DataModel("Чжан Сан", 20));  
        list.add(new DataModel("Ли Си", 22));  
        list.add(new DataModel("Оборудование", 24));  
        return list;  
    }  
  
    // Экспорт данных в файл Excel  
    public void exportToExcel(String filePath) {  
        // Создать объект записи  
        EasyExcel.write(filePath, DataModel.class)  
                .sheet("Sheet1") // Установить имя листа  
                .doWrite(getData()); // Запись данных  
    }  
  
    public static void main(String[] args) {  
        String filePath = "path/to/your/excel/file.xlsx";  
        ExcelExporter exporter = new ExcelExporter();  
        exporter.exportToExcel(filePath);  
    }  
}

3. Дизайн API и простота использования.

Apache POI предоставляет богатый и гибкий API, который позволяет разработчикам работать с файлами Excel различными способами. Однако из-за его обширных и сложных функций кривая обучения API относительно крутая, и новичкам может потребоваться некоторое время, чтобы ознакомиться с ним.

Для сравнения, дизайн API easyExcel более краток и интуитивно понятен. Он предоставляет упрощенные методы для решения распространенных задач, что позволяет разработчикам выполнять задачи быстрее. Кроме того, easyExcel также поддерживает расширенные функции, такие как пользовательские стратегии чтения и записи, асинхронная обработка и проверка данных. Эти функции доступны разработчикам через простые API, что повышает простоту использования.

4. Резюме

Apache POI и easyExcel — отличные библиотеки Java для обработки файлов Excel. Apache POI, известный своей полнотой и гибкостью, обеспечивает полную поддержку файлов Excel. Однако при обработке больших файлов могут возникнуть проблемы с производительностью и высокое потребление памяти. Напротив, easyExcel оптимизирован для обработки больших файлов, обеспечивая более высокую производительность и меньшее потребление памяти. Кроме того, API-интерфейс easyExcel проще и удобнее в использовании, что позволяет разработчикам более эффективно выполнять задачи.

Выбирая, какую библиотеку использовать, разработчики должны принимать решение, исходя из потребностей проекта и размера файла. Если вашему проекту необходимо обрабатывать большие файлы Excel и предъявляются высокие требования к производительности и потреблению памяти, easyExcel может оказаться лучшим выбором. А если проект требует комплексных функций обработки файлов Excel и не имеет высоких требований к производительности, то Apache POI также станет хорошим выбором.


Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт код тридцать пять , для получения дополнительной технической информации.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose