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

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

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

Начать курс

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

Несмотря на то, что PythonLib посвящён Python, Java остаётся одним из самых востребованных языков в корпоративной разработке, где работа с электронными таблицами Excel — повседневная задача. В этой статье мы рассмотрим основные библиотеки для работы с Excel в Java, их возможности и приведём практические примеры кода.

Зачем нужны библиотеки для Excel в Java?

Java не имеет встроенных средств для чтения и записи файлов Excel. Для этого используются сторонние библиотеки, которые позволяют:

  • Создавать новые книги Excel (XLS и XLSX форматы).
  • Читать и редактировать существующие файлы.
  • Форматировать ячейки, объединять их, задавать стили.
  • Работать с формулами, диаграммами и макросами.
  • Экспортировать данные из баз данных или других источников.

Основные библиотеки

1. Apache POI

Apache POI — самая популярная и мощная библиотека для работы с файлами Microsoft Office в Java. Поддерживает как старый формат XLS (HSSF), так и новый XLSX (XSSF).

Преимущества:

  • Полная поддержка всех возможностей Excel: формулы, стили, условное форматирование, диаграммы.
  • Активное сообщество и регулярные обновления.
  • Поддержка как чтения, так и записи.

Недостатки:

  • Высокое потребление памяти при работе с большими файлами.
  • Сложный API для новичков.

2. EasyExcel (Alibaba)

EasyExcel — облегчённая библиотека от Alibaba, созданная для работы с большими файлами XLSX. Она использует потоковую обработку, что значительно снижает потребление памяти.

Преимущества:

  • Минимальное потребление памяти (до 100 раз меньше, чем POI).
  • Простой и интуитивный API.
  • Поддержка аннотаций для маппинга данных.

Недостатки:

  • Не поддерживает старый формат XLS.
  • Ограниченная поддержка форматирования.

3. JExcelApi (jxl)

Старая библиотека, которая поддерживает только формат XLS. Подходит для простых задач, но давно не обновлялась и не работает с XLSX.

Примеры кода

Пример 1: Чтение Excel файла с Apache POI

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

public class ReadExcel {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("data.xlsx");
             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;
                    }
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Пример 2: Запись данных в Excel с Apache POI

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

public class WriteExcel {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook();
             FileOutputStream fos = new FileOutputStream("output.xlsx")) {
            
            Sheet sheet = workbook.createSheet("Данные");
            Row header = sheet.createRow(0);
            header.createCell(0).setCellValue("Имя");
            header.createCell(1).setCellValue("Возраст");
            
            Row row1 = sheet.createRow(1);
            row1.createCell(0).setCellValue("Анна");
            row1.createCell(1).setCellValue(25);
            
            Row row2 = sheet.createRow(2);
            row2.createCell(0).setCellValue("Иван");
            row2.createCell(1).setCellValue(30);
            
            workbook.write(fos);
            System.out.println("Файл создан успешно.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Пример 3: Работа с EasyExcel (чтение)

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;

import java.util.ArrayList;
import java.util                    

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