Работа с таблицей Excel из Java
Собственно возникла проблема — обработать данные из таблицы и на их основе получить другую таблицу.
Вариантов решения этой проблемы несколько:
- Макрос — единственной проблемой является VBA, на изучение которого времени нет совершенно, да и не нравится его синтаксис
- Приложение на C# тут вроде все хорошо, но к машине на которой будет выполняться данное приложение сразу предъявляется много дополнительных требований:
- .NET Framework
- Установленный офис
- установленная основная сборка взаимодействия (PIA) для приложения Office
- связка Java и библиотека Apache POI—на этом способе я и хочу остановиться подробнее
Apache POI — это Java API для доступа к документам формата Microsoft.
Собственно для работы с таблицами Excel предназначен проект POI-HSSF. На данный момент есть 2 варианта библиотеки:
- POI 3.5 beta 5, and Office Open XML Support (2009-02-19)—идет работа над поддержкой формата Office 2007
- POI 3.2-FINAL Released (2008-10-19) — последний стабильный релиз
Я расскажу о работе с версией 3.2
Основным классом для работы с таблицей Excel является класс HSSFWorkbook пакета org.apache.poi.hssf.usermodel, представляющий книгу Excel.
Для чтения книги из файла можно применить следующий код:
public static HSSFWorkbook readWorkbook(String filename) {
try {
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filename));
HSSFWorkbook wb = new HSSFWorkbook(fs);
return wb;
}
catch (Exception e) {
return null;
}
}
Метод возвращает объект класса HSSFWorkbook если все удачно и null в другом случае.
Для сохранения изменений можно применить следующий метод:
public static void writeWorkbook(HSSFWorkbook wb, String fileName) {
try {
FileOutputStream fileOut = new FileOutputStream(fileName);
wb.write(fileOut);
fileOut.close();
}
catch (Exception e) {
//Обработка ошибки
}
}
Метод записывает книгу wb в файл fileName
Для работы с листами рабочей книги предназначен класс HSSFSheet.
Объект класса HSSFSheet можно получить следующими способами:
- По имени
HSSFSheet sheet= wb.getSheet("Лист 3")
- По номеру (нумерация начинается с 0)
HSSFSheet sheet= wb.getSheet(0)
- Создание нового листа
HSSFSheet sheet= wb.createSheet(["имя листа"])
Следующим объектом является строка — HSSFRow.
Получить доступ к объекту строки можно также 3 способами:
- По индексу (индексация начинается с 0)
HSSFRow row = sheet.getRow(index)
- Через итератор
Iterator rowIter = sheet.rowIterator(); while (rowIter.hasNext()) { HSSFRow row = (HSSFRow) rowIter.next(); }
- Создание новой строки
HSSFRow row=sheet.createRow(0);
Ну и последним объектом на пути доступа к данным является объект класса HSSFCell — ячейка строки.
Получить доступ к ячейке можно из объекта строки следующими способами:
- По индексу ячейки (индексация начинается с 0)
HSSFCell cell = row.getCell(0);
- Через итератор
Iterator cellIter = row.cellIterator(); while (cellIter.hasNext()) { HSSFCell cell = (HSSFCell) cellIter.next(); }
- Создание новой ячейки
HSSFCell cell = row.createCell(0);
Из объекта ячейки можно уже получать и устанавливать непосредственно данные:
- Логическое значение
boolean b = cell.getBooleanCellValue();
cell.setCellValue(b);
- Дата
Date date = cell.getDateCellValue();
cell.setCellValue(date);
- Числовое значение
double d = cell.getNumericCellValue();
cell.setCellValue(d);
- Строковое значение
String str = cell.getRichStringCellValue().getString();
cell.setCellValue(new HSSFRichTextString(str));
- Формула
String formula = cell.getCellFormula();
cell.setCellFormula(formula);
Этих знаний достаточно чтобы обрабатывать простые таблицы.
Библиотека также предоставляет богатые возможности по форматированию ячеек, по их слиянию, заморозке и т.д.
Подробное описание функций можно найти на их сайте.
Данный способ прежде всего ценен тем, что не требует установки самого офиса и пакета PIA.