Работа с Excel в Java: Apache POI и альтернативы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с Excel в Java: обзор библиотек и практические примеры

В корпоративной разработке на Java часто возникает необходимость программного создания, чтения и модификации электронных таблиц Excel. Это может быть генерация отчётов, импорт данных из внешних систем или экспорт результатов расчётов. В данной статье мы рассмотрим основные библиотеки для работы с Excel в Java, их особенности, а также приведём наглядные примеры кода.

Почему Java, а не Python?

Несмотря на то, что наш сайт называется PythonLib, Java остаётся одним из самых популярных языков для enterprise-разработки. Многие компании активно используют Java для серверных приложений, и интеграция с Excel — востребованная задача. Понимание того, как работать с Excel в Java, будет полезно как начинающим, так и опытным разработчикам.

Основные библиотеки для работы с Excel в Java

Существует несколько зрелых библиотек, каждая из которых имеет свои сильные стороны:

  • Apache POI — самая популярная и функциональная библиотека. Поддерживает форматы .xls (HSSF) и .xlsx (XSSF). Позволяет создавать, читать и изменять файлы, поддерживает формулы, стили, диаграммы.
  • JExcelApi (jxl) — более лёгкая библиотека, поддерживает только старый формат .xls. Подходит для простых задач, но не развивается с 2009 года.
  • Apache POI + XSSF/SXSSF — продвинутые возможности для работы с большими файлами. SXSSF (Streaming) позволяет обрабатывать миллионы строк с низким потреблением памяти.
  • Docx4j — библиотека для работы с Office Open XML, может использоваться для .xlsx, но чаще применяется для Word.

Начало работы с Apache POI

Для подключения библиотеки к проекту Maven добавьте в pom.xml следующие зависимости:

<!-- Для работы с .xls (HSSF) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>

<!-- Для работы с .xlsx (XSSF) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>

Если вы используете Gradle, добавьте строки в build.gradle:

implementation 'org.apache.poi:poi:5.2.5'
implementation 'org.apache.poi:poi-ooxml:5.2.5'

Пример: создание Excel-файла с таблицей

Рассмотрим простой пример создания файла .xlsx с данными о сотрудниках.

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriter {
    public static void main(String[] args) {
        // Создаём новую книгу
        try (Workbook workbook = new XSSFWorkbook()) {
            // Создаём лист
            Sheet sheet = workbook.createSheet("Сотрудники");

            // Создаём строку заголовка
            Row headerRow = sheet.createRow(0);
            String[] columns = {"ID", "Имя", "Должность", "Зарплата"};
            for (int i = 0; i < columns.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(columns[i]);
                // Делаем заголовок жирным
                CellStyle style = workbook.createCellStyle();
                Font font = workbook.createFont();
                font.setBold(true);
                style.setFont(font);
                cell.setCellStyle(style);
            }

            // Заполняем данными
            Object[][] data = {
                {1, "Иван Иванов", "Разработчик", 150000},
                {2, "Петр Петров", "Аналитик", 120000},
                {3, "Сидор Сидоров", "Менеджер", 180000}
            };

            int rowNum = 1;
            for (Object[] rowData : data) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue((int) rowData[0]);
                row.createCell(1).setCellValue((String) rowData[1]);
                row.createCell(2).setCellValue((String) rowData[2]);
                row.createCell(3).setCellValue((double) (int) rowData[3]);
            }

            // Автоматическая ширина колонок
            for (int i = 0; i < columns.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // Запись в файл
            try (FileOutputStream out = new FileOutputStream("employees.xlsx")) {
                workbook.write(out);
            }
            System.out.println("Файл создан успешно!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Пример: чтение данных из Excel-фай

Рекомендаций