Работа с 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 ( Также в библиотеке
Работа с датами в PHP: обзор библиотек и инструментов
openapi-typescript для TypeScript: полное руководство с примерами
NaturalLanguage для Swift: полное руководство с примерами