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

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

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

Начать курс

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

Java — один из самых популярных языков для корпоративной разработки, где часто возникает необходимость взаимодействовать с электронными таблицами Microsoft Excel (форматы .xls и .xlsx). Будь то выгрузка отчётов, импорт данных из CRM или автоматизация бухгалтерской отчётности — без надёжного инструмента для работы с Excel не обойтись. В этой статье мы рассмотрим основные библиотеки для Java, их возможности, преимущества и недостатки, а также приведём практические примеры кода.

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

На сегодняшний день существует несколько зрелых решений. Выбор конкретной библиотеки зависит от версии Excel, объёма данных и требуемой функциональности.

  • Apache POI — де-факто стандарт. Поддерживает оба формата (.xls и .xlsx), позволяет читать, писать, форматировать ячейки, работать с формулами, графиками и макросами. Тяжёлая, но самая мощная библиотека.
  • JExcelApi (jxl) — более лёгкая альтернатива, но поддерживает только старый формат .xls. Подходит для простых задач, где не нужна поддержка .xlsx.
  • EasyExcel (Alibaba) — облегчённая версия на основе POI, оптимизированная для работы с большими файлами и потоковой обработки. Отлично подходит для импорта/экспорта миллионов строк.
  • OpenCSV — не для Excel напрямую, но для работы с CSV (которые Excel открывает). Идеален для простого обмена табличными данными без форматирования.

Пример 1: Чтение Excel-файла с помощью Apache POI

Рассмотрим базовый сценарий: открыть файл data.xlsx и вывести содержимое первой страницы в консоль.

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

public class ReadExcelExample {
    public static void main(String[] args) {
        String filePath = "data.xlsx";

        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0); // первая страница

            for (Row row : sheet) {
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            System.out.print(cell.getNumericCellValue() + "\t");
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        default:
                            System.out.print("?\t");
                    }
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Пример 2: Запись данных в Excel с форматированием

Создадим новый файл report.xlsx с заголовками и данными, выделив заголовки жирным шрифтом.

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

public class WriteExcelExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Отчёт");

            // Стиль для заголовков
            CellStyle headerStyle = workbook.createCellStyle();
            Font headerFont = workbook.createFont();
            headerFont.setBold(true);
            headerFont.setFontHeightInPoints((short) 12);
            headerStyle.setFont(headerFont);

            // Заголовки
            String[] headers = {"Имя", "Возраст", "Город"};
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(headerStyle);
            }

            // Данные
            Object[][] data = {
                {"Анна", 25, "Москва"},
                {"Иван", 30, "Санкт-Петербург"},
                {"Мария", 28, "Казань"}
            };

            for (int i = 0; i < data.length; i++) {
                Row row = sheet.createRow(i + 1);
                for (int j = 0; j < data[i].length; j++) {
                    Cell cell = row.createCell(j);
                    if (data[i][j] instanceof String) {
                        cell.setCellValue((String) data[i][j]);
                    } else if (data[i][j] instanceof Integer) {
                        cell.setCellValue((Integer) data[i][j]);
                    }
                }
            }

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

            try (FileOutputStream fos = new FileOutputStream("report.xlsx")) {
                workbook.write(fos);
            }
            System.out.println("Файл report.xlsx успешно создан!");

        } catch (                    

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