В сегодняшнем уроке мы продолжим рассматривать интересные фреймворки для решения тех или иных прикладных задач. Сегодня мы займемся парсингом файлов в форматах .xls и .xlsx популярного табличного процессора из пакета Microsoft Office.
На практике задача импорта в свою программу табличных данных довольно актуальна. Поэтому разберем одно из возможных решений для тех, кто использует для написания своих программ, работающих с табличными данными, язык Java.
Библиотека Apache POI – это специализированный API, с помощью которого вы можете получать данные из форматов Microsoft Office(на самом деле не только .xls, .xlsx, но и .doc, .ppt). Но в данном уроке мы рассмотрим именно взаимодействие с Excel.
Итак, что нам понадобится?
Для начала работы вам необходимо скачать библиотеку с официального сайта Apache , а затем добавить библиотеку в CLASSPATH. После подключения библиотеки можно начинать работу.
Традиционно, для тех, кто использует Maven, достаточно прописать в файле конфигурации следующие зависимости:
1 2 3 4 5 6 7 8 9 10 11 12 |
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.12</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.12</version> </dependency> </dependencies> |
Предположим, что у нас есть таблица следующего содержания: имя человека, адрес и номер телефона. Напишем метод, реализующий чтение данных из файла Excel. Перед этим определим три константы, соответствующие номерам наших столбцов в Excel-документе.
1 2 3 |
public static final int NAME_COLUMN_NUMBER = 0; public static final int ADDRESS_COLUMN_NUMBER = 1; public static final int PHONE_COLUMN_NUMBER = 2; |
Теперь реализуем сам метод чтения из Excel-файла. Перед этим файл необходимо подготовить!
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 |
public static void readFromExcel(String fileName) throws IOException { HSSFWorkbook workBook = new HSSFWorkbook(new FileInputStream(fileName)); HSSFSheet sheet = workBook.getSheetAt(0); Iterator<Row> rows = sheet.rowIterator(); if(rows.hasNext()) { rows.next(); } while(rows.hasNext()) { HSSFRow row = (HSSFRow) rows.next(); //получаем значение ячеек по номерам столбцов HSSFCell nameCell = row.getCell(NAME_COLUMN_NUMBER); //получаем строковое значение из ячейки String name = nameCell.getStringCellValue(); System.out.println("Имя: " + name); HSSFCell addressCell = row.getCell(ADDRESS_COLUMN_NUMBER); String address = addressCell.getStringCellValue(); System.out.println("Адрес: " + address); HSSFCell phoneNumberCell = row.getCell(PHONE_COLUMN_NUMBER); String phoneNumber = phoneNumberCell.getStringCellValue(); System.out.println("Номер телефона: " + phoneNumber); } } |
Теперь перейдем к разбору самого метода. Для начала мы создаем экземпляр класса HSSFWorkbook, представляющий наш файл. В качестве параметра ему надо передать путь к файлу. Следом получаем первый рабочий лист. Это можно было сделать и по имени листа.
Далее мы начинаем построчно считывать значения столбцов и последовательно выводить их на экран.
Запись выполняется аналогичным образом. Давайте реализуем метод writeToExcel() для записи нескольких строк в файл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public void writeToExcel() throws IOException { HSSFWorkbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("Новый лист"); Row row = sheet.createRow(0); Cell name = row.createCell(NAME_COLUMN_NUMBER); name.setCellValue("Mike"); Cell address = row.createCell(ADDRESS_COLUMN_NUMBER); address.setCellValue("Moscow"); Cell phone = row.createCell(PHONE_COLUMN_NUMBER); phone.setCellValue("89217217332"); //записываем в файл workbook.write(new FileOutputStream(new File("test.xls"))); workbook.close(); } |
Вот таким образом можно производить импорт и экспорт данных Excel. Табличные данные очень важны для статистической обработки и такая задача у вас может возникнуть в самых различных случаях. Также, возможно, что таким образом вы храните данные для решения каких-то задач машинного обучения или экономических задач.
Apache POI – удобный, свободно распространяемый фреймворк, который отлично выполняет свои задачи и не требует много времени на то, чтобы в нем разобраться.
На этом все! Спасибо за внимание! До встречи в следующих статьях!
Кто знает почему при обращении к sheet компилятор указывает на null exception?