Java прочитать файл xls

Пример чтения файлов Excel

На странице описания библиотеки Apache POI представлены свойства и методы взаимодействия Java приложений с файлами Excel. Здесь рассматривается пример использования Apache POI для чтения файлов Excel 2007 или более поздней версии. Если необходимо обрабатывать Excel 1997-2003, то следует использовать классы, наименования которых начинаются с символа ‘H’ (см. наименование классов на странице описания Apache POI).

Открытие книги Excel

Чтобы «открыть» файл Excel как HSSFWorkbook (.xls), так и XSSFWorkbook (.xlsx) можно использовать либо File, либо InputStream. При использовании InputStream требуется больше памяти для загрузки файла в буффер.

Метод openBook демонстрирует использование WorkbookFactory для открытия Excel файла. Строки использования InputStream закомментированы.

private XSSFWorkbook book; . private void openBook(final String path) < try < File file = new File(path); book = (XSSFWorkbook) WorkbookFactory.create(file); // InputStream is = new FileInputStream(FILE); // book = (XSSFWorkbook) WorkbookFactory.create(is); // is.close(); >catch (FileNotFoundException e1) < e.printStackTrace(); >catch (EncryptedDocumentException e) < e.printStackTrace(); >catch (InvalidFormatException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >>

Если нужно обойти использование WorkbookFactory, т.е. использовать XSSFWorkbook (HSSFWorkbook) напрямую, то следует использовать OPCPackage (.xlsx) или NPOIFSFileSystem (.xls).

private XSSFWorkbook book; . private void openBookDirectly(final String path) < File file = new File(path); try < OPCPackage pkg = OPCPackage.open(file); book = new XSSFWorkbook(pkg); pkg.close(); >catch (InvalidFormatException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >>

Открытие страницы

При открытии страницы слеудет использовать метод getSheet с указанием в качестве параметра наименования страницы. Здесь необходимо быть внимательным, поскольку наименования страницы по умолчанию могут быть как «Sheet», так и «Лист», в зависимости от локализации операционной системы и Excel.

XSSFSheet sheet = book.getSheet("Лист1");

Перебор строк и ячеек

Чтобы «пройтись» по всем страницам книги и перебрать все значения в ячейках можно использовать итераторы. Следующий код показывает использование итераторов для перебора всех ячеек страницы.

import java.util.Iterator; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; . Iterator ri = sheet.rowIterator(); while(ri.hasNext()) < XSSFRow row = (XSSFRow) ri.next(); Iteratorci = row.cellIterator(); while(ci.hasNext()) < XSSFCell cell = (XSSFCell) ci.next(); // код >>

Итераторы доступны по вызовам workbook.sheetIterator(), sheet.rowIterator() и row.cellIterator(). Но необходимо помнить, что rowIterator и cellIterator перебирают только строки и ячейки, которые созданы, пропуская пустые строки и ячейки.

Читайте также:  Поле от кого php

Если необходимо проверить все строки и все ячейки определенной области, то можно воспользоваться следующим кодом.

private void readCells() < // Определение граничных строк обработки int rowStart = Math.min( 0, sheet.getFirstRowNum()); int rowEnd = Math.max(100, sheet.getLastRowNum ()); for (int rw = rowStart; rw < rowEnd; rw++) < XSSFRow row = sheet.getRow(rw); if (row == null) < // System.out.println( // "row '" + rw + "' is not created"); continue; >short minCol = row.getFirstCellNum(); short maxCol = row.getLastCellNum(); for(short col = minCol; col < maxCol; col++) < XSSFCell cell = row.getCell(col); if (cell == null) < // System.out.println( // "cell '" + col + "' is not created"); continue; >printCell(row, cell); > > >

В представленном коде для чтения ячейки был использован метод getCell(int). Можно использовать метод getCell(int, MissingCellPolicy), где MissingCellPolicy, определяет условие возвращения пустых и отсутствующих ячеек. Однако IDE Eclipse, где работоспособность кода проверялась, показывает, что MissingCellPolicy упразднена (deprecated), а метод getCell(int) для ячейки типа XSSFCell вернул правильные значения. Определение значений ячеек выполнялось в методе printCell(row, cell).

Чтение содержимого ячейки

Чтобы получить значение ячейки, необходимо знать тип её значения. Полагаю, что Вы не раз сталкивались с числовым представлением значения даты. Если у текстовой ячейки попытаться получить числовое значение, то будет вызвано NumberFormatException. Поэтому, необходимо первоначально определиться с типом, чтобы использовать соответствующий метод.

Следующий код в цикле проходит по ячейкам в строке и выводит в консоль ссылочную информацию на ячейку (например $A$3) и содержимое ячейки. Причем, сначала отображается значение, полученное методом formatCellValue класса DataFormatter, а после символа слеша ‘/’ отображается значение, получаемое методами getRichStringCellValue(), getDateCellValue(), getNumericCellValue(), getBooleanCellValue() и getCellFormula() класса XSSFCell.

private void printCell(XSSFRow row, XSSFCell cell) < DataFormatter formatter = new DataFormatter(); CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex()); System.out.print(cellRef.formatAsString()); System.out.print(" : "); // get the text that appears in the cell by getting // the cell value and applying any data formats // (Date, 0.00, 1.23e9, $1.23, etc) String text = formatter.formatCellValue(cell); System.out.print(text + " / "); // Вывод значения в консоль switch (cell.getCellTypeEnum()) < case STRING: System.out.println(cell.getRichStringCellValue() .getString()); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) System.out.println(cell.getDateCellValue()); else System.out.println(cell.getNumericCellValue()); break; case BOOLEAN: System.out.println(cell.getBooleanCellValue()); break; case FORMULA: System.out.println(cell.getCellFormula()); break; case BLANK: System.out.println(); break; default: System.out.println(); >>

Пример чтения файла Excel

Работоспособность представленного на странице кода (методов), была проверена в примере, структура которого изображена на следующем скриншоте. Это проект Eclipse, включающий перечень необходимых библиотек для чтения файла Excel. Основной класс ExcelRead реализует все представленные выше методы.

На следующем скриншоте представлена страница простенького файла Excel, содержащая ячейки со значениями типа Date, String, Numeric и ячейки с формулами.

Результат чтения файла

Значения ячеек книги Excel в примере отображаются в консоли. Обратите внимание на отличия значений до слеша и после него для типов Date и Numeric. При необходимости можно использовать в приложении переменные соответствующего типа (Date, Integer) и должным образом отформатировать значения.

Книга Excel открыта Страница открыта $A$1 : Закупки / Закупки $B$1 : 1/20/17 / Fri Jan 20 00:00:00 MSK 2017 $A$3 : Наименование / Наименование $B$3 : Цена / Цена $C$3 : Количество / Количество $D$3 : Стоимость / Стоимость $A$4 : Сахар / Сахар $B$4 : 50 / 50.0 $C$4 : 2 / 2.0 $D$4 : B4*C4 / B4*C4 $A$5 : Рис / Рис $B$5 : 45 / 45.0 $C$5 : 4 / 4.0 $D$5 : B5*C5 / B5*C5 $A$7 : Итого : / Итого : $D$7 : SUM(D4:D6) / SUM(D4:D6)

Скачать примеры

Исходный пример, рассмотренный в тексте страницы, можно скачать здесь (11.7 Мб).

Источник

Работа с Excel в Java через Apache POI

Обложка: Работа с Excel в Java через Apache POI

Из этой статьи вы сможете узнать о записи и чтении данных из Excel файлов в Java (будет рассмотрен как XLS , так и XLSX формат). Мы будем использовать библиотеку Apache POI и сосредоточимся на работе с типами String и Date , работа с последним происходит достаточно хитро. Напомню, что работу с числами мы уже рассмотрели в другой статье.

Библиотеку poi-XX.jar вы можете использовать для всех старых ( xls , doc , ppt ) файлов Microsoft Office, для новых ( xlsx , docx , pptx ) вам понадобится poi-ooxml-XX.jar . Очень важно понимать, что к чему относится, т.к. используемые классы тоже разные — для старых расширений это HSSFWorkbook , а для новых — XSSFWorkbook .

Подготовка: загрузка библиотек и зависимостей

Конечно, существует достаточно много открытых библиотек, которые позволяют работать с Excel файлами в Java, например, JXL, но мы будем использовать имеющую самый обширный API и самую популярную — Apache POI. Чтобы её использовать, вам нужно скачать jar файлы и добавить их через Eclipse вручную, или вы можете предоставить это Maven.

Во втором случае вам нужно просто добавить следующие две зависимости:

  org.apache.poi poi 3.12  org.apache.poi poi-ooxml 3.12   

Самое удобное в Maven — что он загрузит не только указанные poi.jar и poi-ooxml.jar , но и все jar файлы, которые используются внутри, то есть xmlbeans-2.6.0.jar , stax-api-1.0.1.jar , poi-ooxml-schemas-3.12.jar и commons-codec-1.9.jar .

Если вы будете добавлять библиотеки вручную — не забудьте о вышеназванных файлах. Скачать всё можно отсюда. Помните — если вы загрузите только poi-XX.jar , то ваш код скомпилируется без ошибок, но потом упадёт с java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject , так как внутри будет вызываться xmlbeans.jar .

Запись

В этом примере мы запишем в xls файл следующие данные: в первую ячейку — строку с именем, а во вторую — дату рождения. Вот пошаговая инструкция:

  • Создаём объект HSSFWorkBook ;
  • Создаём лист, используя на объекте, созданном в предыдущем шаге, createSheet() ;
  • Создаём на листе строку, используя createRow() ;
  • Создаём в строке ячейку — createCell() ;
  • Задаём значение ячейки через setCellValue();
  • Записываем workbook в File через FileOutputStream ;
  • Закрываем workbook , вызывая close() .

Для записи строк или чисел этого вполне достаточно, но чтобы записать дату, нам понадобится сделать ещё кое-что:

  • Создать DateFormat ;
  • Создать CellStyle ;
  • Записать DateFormat в CellStyle ;
  • Записать CellStyle в ячейку;
  • Теперь в эту ячейку можно записать объект Date через всё тот же setCellValue ;
  • Чтобы дата поместилась в ячейку, нам нужно добавить столбцу свойство автоматически менять размер: sheet.autoSizeColumn(1) .

Всё вместе это будет выглядеть так:

@SuppressWarnings("deprecation") public static void writeIntoExcel(String file) throws FileNotFoundException, IOException < Workbook book = new HSSFWorkbook(); Sheet sheet = book.createSheet("Birthdays"); // Нумерация начинается с нуля Row row = sheet.createRow(0); // Мы запишем имя и дату в два столбца // имя будет String, а дата рождения --- Date, // формата dd.mm.yyyy Cell name = row.createCell(0); name.setCellValue("John"); Cell birthdate = row.createCell(1); DataFormat format = book.createDataFormat(); CellStyle dateStyle = book.createCellStyle(); dateStyle.setDataFormat(format.getFormat("dd.mm.yyyy")); birthdate.setCellStyle(dateStyle); // Нумерация лет начинается с 1900-го birthdate.setCellValue(new Date(110, 10, 10)); // Меняем размер столбца sheet.autoSizeColumn(1); // Записываем всё в файл book.write(new FileOutputStream(file)); book.close(); >

Чтение

Теперь мы считаем из только что созданного файла то, что мы туда записали.

  • Для начала создадим HSSFWorkBook , передав в конструктор FileInputStream ;
  • Получаем лист, передавая в getSheet() его номер или название;
  • Получаем строку, используя getRow() ;
  • Получаем ячейку, используя getCell() ;
  • Узнаём тип ячейки, используя на ней getCellType() ;
  • В зависимости от типа ячейки, читаем её значения, используя getStringCellValue() , getNumericCellValue() или getDateCellValue() ;
  • Закрываем workbook используя close() .

Напомню, что дату Excel хранит как числа, т.е. тип ячейки всё равно будет CELL_TYPE_NUMERIC .

В виде кода это будет выглядеть следующим образом:

public static void readFromExcel(String file) throws IOException < HSSFWorkbook myExcelBook = new HSSFWorkbook(new FileInputStream(file)); HSSFSheet myExcelSheet = myExcelBook.getSheet("Birthdays"); HSSFRow row = myExcelSheet.getRow(0); if(row.getCell(0).getCellType() == HSSFCell.CELL_TYPE_STRING)< String name = row.getCell(0).getStringCellValue(); System.out.println("name : " + name); >if(row.getCell(1).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) < Date birthdate = row.getCell(1).getDateCellValue(); System.out.println("birthdate :" + birthdate); >myExcelBook.close(); > 

В заключение

Как уже упомналось выше, чтение из xlsx файлов ничем принципиально не отличается — нужно только вместо HSSFWorkBook , HSSFSheet , HSSFRow (и прочих) из poi-XX.jar использовать XSSFWorkBook , XSSFSheet , XSSFRow из poi-ooxml-XX.jar . Это всё, что вам нужно знать для чтения и записи в файлы Excel. Разумеется, с помощью библиотеки Apache POI вы можете сделать гораздо больше, но эта статья должна помочь вам быстрее в ней освоиться.

Источник

Работа с таблицей Excel из Java

Собственно возникла проблема — обработать данные из таблицы и на их основе получить другую таблицу.

  1. Макрос — единственной проблемой является VBA, на изучение которого времени нет совершенно, да и не нравится его синтаксис
  2. Приложение на C# тут вроде все хорошо, но к машине на которой будет выполняться данное приложение сразу предъявляется много дополнительных требований:
    • .NET Framework
    • Установленный офис
    • установленная основная сборка взаимодействия (PIA) для приложения Office

  3. связка Java и библиотека Apache POI—на этом способе я и хочу остановиться подробнее
  1. POI 3.5 beta 5, and Office Open XML Support (2009-02-19)—идет работа над поддержкой формата Office 2007
  2. 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 sheet= wb.getSheet(«Лист 3»)
  • По номеру (нумерация начинается с 0)
    HSSFSheet sheet= wb.getSheet(0)
  • Создание нового листа
    HSSFSheet sheet= wb.createSheet([«имя листа»])
  • По индексу (индексация начинается с 0)
    HSSFRow row = sheet.getRow(index)
  • Через итератор

Iterator rowIter = sheet.rowIterator(); while (rowIter.hasNext())

  • По индексу ячейки (индексация начинается с 0)
    HSSFCell cell = row.getCell(0);
  • Через итератор

Iterator cellIter = row.cellIterator(); while (cellIter.hasNext())

  • Логическое значение
    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.

Источник

Оцените статью