С периодичностью раз в два-три года сталкиваюсь с проектами, в которых опять нужно работать с Excel файлами.
Наверно это у меня что-то кармическое…
Сейчас, в очередной раз приходиться реализовать полуавтоматический разбор сотен excel-файлов с прайсами.
В прошлых своих проектах использовал JExcelApi.
Ничего плохого про эту библиотеку сказать не могу, но хочется какого-то разнообразия в жизни поэтому в этот раз с товарищем решили попробовать Apache POI.
Apache POI поддерживает как формат для обычных *.xls файлов (HSSF) так и *.xlsx файлы (XSSF).
Кстати, формат для *.xls файлы в Apache POI они обзывают “HSSF – Horrible SpreadSheet Format”, то есть “Вселяющий ужас формат для электронных таблиц”.
Для того, чтобы приступить к работе, как обычно прописываем зависимости в pom.xml:
org.apache.poi
poi
3.7
Для примера, приведу очень простой файл – список ФИО, сумма + Итог:
Если нужно просто вытащить текст, можно использовать “класс-извелкатель”: ExcelExtractor
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
public class App {
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("/tmp/1.xls");
// Внимание InputStream будет закрыт
// Если нужно не закрывающий см. JavaDoc по POIFSFileSystem : http://goo.gl/1Auu7
HSSFWorkbook wb = new HSSFWorkbook(in);
ExcelExtractor extractor = new ExcelExtractor(wb);
extractor.setFormulasNotResults(false); // Считать формулы
extractor.setIncludeSheetNames(true);
String text = extractor.getText();
System.out.println(text);
}
}
Вывод на консоль:
Sheet1 &A Смирнов 40000.0 Иванов 40000.0 Кузнецов 50000.0 Попов 40000.0 Соколов 70000.0 Лебедев 70000.0 Козлов 50000.0 Новиков 50000.0 Морозов 50000.0 Петров 40000.0 Итого 500000.0 Page &P Sheet2 &A Page &P Sheet3 &A Page &P
Когда этого не достаточно (например нужно найти нужную ячейку и т.д.), без проблем можно использовать нормальное API:
Пример:
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
public class App {
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("/tmp/1.xls");
HSSFWorkbook wb = new HSSFWorkbook(in);
Sheet sheet = wb.getSheetAt(0);
Iterator it = sheet.iterator();
while (it.hasNext()) {
Row row = it.next();
Iterator cells = row.iterator();
while (cells.hasNext()) {
Cell cell = cells.next();
int cellType = cell.getCellType();
switch (cellType) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "=");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print("[" + cell.getNumericCellValue() + "]");
break;
case Cell.CELL_TYPE_FORMULA:
System.out.print("[" + cell.getNumericCellValue() + "]");
break;
default:
System.out.print("|");
break;
}
}
System.out.println();
}
}
}
|
Вывод на консоль:
Смирнов=[40000.0] Иванов=[40000.0] Кузнецов=[50000.0] Попов=[40000.0] Соколов=[70000.0] Лебедев=[70000.0] Козлов=[50000.0] Новиков=[50000.0] Морозов=[50000.0] Петров=[40000.0] Итого=[500000.0]
Конечно если у вас не такие “рафинированные” примеры, то код будет намного более сложным.
Скорее всего вам придется делать еще один уровень API, заточенный под ваши нужды или ваши файлы.
Например у меня товарищ сделал для этих целей: Парсер на Scala поверх Apache POI для разбора Excel-файлов.