Все знакомы с табличным процессором Excel, который входит в стандартный пакет Microsoft Office. Напрямую в Excel очень удобно и приятно работать, но мало кто знает, что в Java этот процесс не менее приятный и увлекательный.
Последнее время мне приходилось программно парсить файлы формата .xls и .xlsx. Чтобы осуществить парсинг Excel-файла, понадобилась библиотека Apache POI. С помощью этой библиотеки можно парсить не только файлы в формате .xls, но и DOC, PPT, а также форматы, которые появились в версии Microsoft Office 2007.
В этой статье мы познакомимся с чтением данных из xls
или xlsx
файла в Java с помощью библиотеки Apache POI. Как всегда, немного теории по основам и практика на примере чтения простого xls
файла. Пример создания нового Excel файла представлен здесь.
Подключаем библиотеку для работы с Excel в Java
Для начала нужно создать Maven-проект и в файле pom.xml прописать следующий код зависимостей
1 2 3 4 5 |
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency> |
Чтение Excel файла на Java
Библиотека Apache POI предоставляет простой в использовании API для чтения любого xls файла. Ниже мы рассмотрим наиболее используемые классы для чтения содержимого Excel таблиц:
Код для чтения Excel документов в формате xls
В листинге ниже приведен типичный пример инициализации HSSFWorkbook
и HSSFSheet
для считывания данных из .xls
файлов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// получаем файл в формате xls FileInputStream file = new FileInputStream(new File("C:\\simplexcel.xls")); // формируем из файла экземпляр HSSFWorkbook HSSFWorkbook workbook = new HSSFWorkbook(file); // выбираем первый лист для обработки // нумерация начинается с 0 HSSFSheet sheet = workbook.getSheetAt(0); // получаем Iterator по всем строкам в листе Iterator<Row> rowIterator = sheet.iterator(); // получаем Iterator по всем ячейкам в строке Iterator<Cell> cellIterator = row.cellIterator(); |
Код для чтения Excel документов в формате .xlsx
Ниже приведен фрагмент кода для инициализации работы с Excel файлами в формате .xlsx
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// получаем файл в формате xlsx FileInputStream file = new FileInputStream(new File("C:\\simplexcelx.xlsx")); // получаем экземпляр XSSFWorkbook для обработки xlsx файла XSSFWorkbook workbook = new XSSFWorkbook (file); // выбираем первый лист для обработки // нумерация начинается из 0 XSSFSheet sheet = workbook.getSheetAt(0); // получаем Iterator по всем строкам в листе Iterator<Row> rowIterator = sheet.iterator(); // получаем Iterator по всем ячейкам в строке Iterator<Cell> cellIterator = row.cellIterator(); |
Практика. Создаем простой Excel для работы
Пишем парсер на Java
Назовем класс ExcelParser.java с методом parse, который принимает текстовый параметр fileName
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package ua.com.prologistic.excel; 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; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; public class ExcelParser { public static String parse(String fileName) { //инициализируем потоки String result = ""; InputStream inputStream = null; HSSFWorkbook workBook = null; try { inputStream = new FileInputStream(fileName); workBook = new HSSFWorkbook(inputStream); } catch (IOException e) { e.printStackTrace(); } //разбираем первый лист входного файла на объектную модель Sheet sheet = workBook.getSheetAt(0); Iterator<Row> it = sheet.iterator(); //проходим по всему листу while (it.hasNext()) { Row row = it.next(); Iterator<Cell> cells = row.iterator(); while (cells.hasNext()) { Cell cell = cells.next(); int cellType = cell.getCellType(); //перебираем возможные типы ячеек switch (cellType) { case Cell.CELL_TYPE_STRING: result += cell.getStringCellValue() + "="; break; case Cell.CELL_TYPE_NUMERIC: result += "[" + cell.getNumericCellValue() + "]"; break; case Cell.CELL_TYPE_FORMULA: result += "[" + cell.getNumericCellValue() + "]"; break; default: result += "|"; break; } } result += "\n"; } return result; } } |
Создаем главный класс-ранер, где и запустим парсер:
1 2 3 4 5 6 7 8 9 10 11 |
package ua.com.prologistic; import ua.com.prologistic.excel.ExcelParser; public class MainClass { public static void main(String[] args){ System.out.println(Parser.parse("excel.xls")); } } |
Результат выполнения парсера Excel
1 2 3 4 5 |
Бонька=[4.0] Баюн=[2.0] Полкан=[6.0] Барон=[3.0] Общий вес=[15.0] |
Работа с запароленным Excel файлом
В Apache POI с каждой новой версией добавляются новые возможности по работе с закрытыми/запароленными файлами. Например, мы может работать с защищенными файлами XLS (используя org.apache.poi.hssf.record.crypt
) и защищенными файлами XLSX (с помощью org.apache.poi.poifs.crypt
).
Если вы используете HSSF (для файла XLS), то проверить является ли он запаролленым нам поможет метод isWriteProtected(). А для работы с ним необходимо указать пароль перед самым открытием файла:
1 2 |
... org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword("здесь пароль"); |
После этого можем работать с файлом.
Для XSSF
нам понадобится что-то вроде такого:
1 2 3 4 5 |
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("protected.xlsx")); EncryptionInfo info = new EncryptionInfo(fs); Decryptor d = new Decryptor(info); d.verifyPassword(Decryptor.DEFAULT_PASSWORD); XSSFWorkbook wb = new XSSFWorkbook(d.getDataStream(fs)); |
При работе с более новыми версиями Apache POI, можно просто указать пароль при создании Workbook
:
1 |
Workbook wb = WorkbookFactory.create(new File("protected.xls"), "здесь пароль")); |
Этот код будет работать как для HSSF, так и для XSSF.
Также смотрите примеры чтения Word документа и создания нового документа Word с помощью Apache POI.
Подписывайтесь на обновления!
public class MainClass {
public static void main(String[] args){
System.out.println(Parser.parse(«excel.xls»));
}
}
вот это дело не работает. Не понятно какой импорт нужен
Поменяй «Parser» на «ExcelParser»