- Apache POI, взаимодействие с Excel
- Компоненты Apache POI
- Описание компонентов
- Список компонентов
- Подключение Apache POI к проекту
- Классы и методы Apache POI для работы с файлами Excel
- Рабочая книга HSSFWorkbook, XSSFWorkbook
- Конструкторы класса HSSFWorkbook
- Конструкторы класса XSSFWorkbook
- Основные методы HSSFWorkbook, XSSFWorkbook
- Классы листов книги, HSSFSheet, XSSFSheet
- Основные методы классов работы с листами
- Классы строк HSSFRow, XSSFRow
- Основные методы классов HSSFRow, XSSFRow
- Классы ячеек HSSFCell, XSSFCell
- Основные методы классов HSSFCell, XSSFCell
- Классы стилей ячеек HSSFCellStyle, XSSFCellStyle
- Классы шрифтов HSSFFont, XSSFFont
- Работа с таблицей Excel из Java
Apache POI, взаимодействие с Excel
Apache POI представляет собой API, который позволяет использовать файлы MS Office в Java приложениях. Данная библиотека разрабатывается и распространяется Apache Software Foundation и носит открытый характер. Apache POI включает классы и методы для чтения и записи информации в документы MS Office.
Компоненты Apache POI
Описание компонентов
HSSF | Horrible Spreadsheet Format | Компонент чтения и записи файлов MS-Excel, формат XLS |
XSSF | XML Spreadsheet Format | Компонент чтения и записи файлов MS-Excel, формат XLSX |
HPSF | Horrible Property Set Format | Компонент получения наборов свойств файлов MS-Office |
HWPF | Horrible Word Processor Format | Компонент чтения и записи файлов MS-Word, формат DOC |
XWPF | XML Word Processor Format | Компонент чтения и записи файлов MS-Word, формат DOCX |
HSLF | Horrible Slide Layout Format | Компонент чтения и записи файлов PowerPoint, формат PPT |
XSLF | XML Slide Layout Format | Компонент чтения и записи файлов PowerPoint, формат PPTX |
HDGF | Horrible DiaGram Format | Компонент работы с файлами MS-Visio, формат VSD |
XDGF | XML DiaGram Format | Компонент работы с файлами MS-Visio, формат VSDX |
Список компонентов
Наименование (артeфакт) | Необходимые компоненты |
---|---|
poi | commons-logging, commons-codec, commons-collections, log4j |
poi-scratchpad | poi |
poi-ooxml | poi, poi-ooxml-schemas |
poi-ooxml-schemas | xmlbeans |
poi-examples | poi, poi-scratchpad, poi-ooxml |
ooxml-schemas | xmlbeans |
ooxml-security | xmlbeans |
Подключение Apache POI к проекту
Для подключения Apache POI к проекту необходимо скачать соответствующие библиотеки с официального сайта https://poi.apache.org/download.html.
Если в проекте используется фреймворк maven, то необходимо установить одну из следующих зависимостей (версия может быть более новой) :
org.apache.poi poi 3.16 org.apache.poi poi-ooxml 3.16
На странице описания примера чтения файлов Excel приведен проект, включающий необходимый набор файлов библиотеки Apache POI (poi-3.16.jar, poi-ooxml-3.16.jar, poi-ooxml-schemas-3.16.jar) и сопутствующих библиотек.
На странице рассматриваются следующие классы, используемые для работы с файлами Excel из приложений Java.
- рабочая книга — HSSFWorkbook, XSSFWorkbook
- лист книги — HSSFSheet, XSSFSheet
- строка — HSSFRow, XSSFRow
- ячейка — HSSFCell, XSSFCell
- стиль — стили ячеек HSSFCellStyle, XSSFCellStyle
- шрифт — шрифт ячеек HSSFFont, XSSFFont
Поскольку описание всех классов и методов не разместить на одной странице, то ниже по тексту приводятся ссылки для перехода к исходной документации.
Классы и методы Apache POI для работы с файлами Excel
Рабочая книга HSSFWorkbook, XSSFWorkbook
- HSSFWorkbook
- org.apache.poi.hssf.usermodel
- класс чтения и записи файлов Microsoft Excel в формате .xls, совместим с версиями MS-Office 97-2003;
- org.apache.poi.xssf.usermodel
- класс чтения и записи файлов Microsoft Excel в формате .xlsx, совместим с MS-Office 2007 или более поздней версии.
Конструкторы класса HSSFWorkbook
HSSFWorkbook (); HSSFWorkbook (InternalWorkbook book); HSSFWorkbook (POIFSFileSystem fs); HSSFWorkbook (NPOIFSFileSystem fs); HSSFWorkbook (POIFSFileSystem fs, boolean preserveNodes); HSSFWorkbook (DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes); HSSFWorkbook (DirectoryNode directory, boolean preserveNodes); HSSFWorkbook (InputStream s); HSSFWorkbook (InputStream s, boolean preserveNodes);
preservenodes является необязательным параметром, который определяет необходимость сохранения узлов типа макросы.
Конструкторы класса XSSFWorkbook
XSSFWorkbook (); // workbookType создать .xlsx или .xlsm XSSFWorkbook (XSSFWorkbookType workbookType); XSSFWorkbook (OPCPackage pkg ); XSSFWorkbook (InputStream is ); XSSFWorkbook (File file); XSSFWorkbook (String path);
Основные методы HSSFWorkbook, XSSFWorkbook
Метод Описание createSheet () Создание страницы книги HSSFSheet, XSSFSheet createSheet (String name) Создание страницы с определенным наименованием CreateFont () Создание шрифта createCellStyle () Создание стиля С полным перечнем всех методов класса XSSFWorkbook можно познакомиться на странице http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html.
Классы листов книги, HSSFSheet, XSSFSheet
Классы HSSFSheet, XSSFSheet включают свойства и методы создания строк, определения размера колонок, слияния ячеек в одну область и т.д.
Основные методы классов работы с листами
Метод Описание addMergedRegion (CellRangeAddress) Определение области слияния ячеек страницы autoSizeColumn (int column) Автоматическая настройка ширины колонки column (отсчет от 0) setColumnWidth (int column, int width) Настройка ширины колонки column (отсчет от 0) createRow (int row) Создание строки row (отсчет от 0) getRow (int row) Получение ссылки на строку row (отсчет от 0) С полным перечнем всех методов класса XSSFSheet можно познакомиться на странице https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html
Классы строк HSSFRow, XSSFRow
Классы HSSFRow, XSSFRow включают свойства и методы работы со строками, создания ячеек в строке и т.д.
Основные методы классов HSSFRow, XSSFRow
Метод Описание setHeight (short) Определение высоты строки getHeight() Получение значения высоты в twips’ах (1/20) getHeightInPoints() Получение значение высоты createCell (int) Создание ячейки в строке (отсчет от 0) getCell(int) Получение ссылки на ячейку getFirstCellNum() Получение номера первой ячейки в строке setRowStyle(CellStyle) Определение стиля всей строки С полным перечнем всех методов класса XSSFRow можно познакомиться на странице http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html
Классы ячеек HSSFCell, XSSFCell
Ячейки электронной таблицы используются для размещения информации. В ячейке может быть представлено числовое значение, текст или формула. Также ячейка может содержать комментарий.
Классы HSSFCell, XSSFCell включают свойства и методы работы с ячейками таблицы.
Основные методы классов HSSFCell, XSSFCell
Метод Описание getBooleanCellValue() Чтение логического значения ячейки getDateCellValue() Чтение значения ячейки типа java.util.Date getNumericCellValue() Чтение числового значения ячейки типа double getStringCellValue() Чтение текстового значения ячейки (java.lang.String) setCellValue(boolean) Определение логического значения ячейки setCellValue(java.util.Calendar) Определение значения ячейки типа даты setCellValue(java.util.Date) Определение значения ячейки типа даты getCellTypeEnum() Чтение типа значения ячейки CellType setCellComment(Comment) Запись комментария в ячейку getCellComment() Чтение комментария ячейки removeCellComment() Удаление комментария ячейки setHyperlink(Hyperlink) Запись гиперссылки в ячейку getHyperlink() Чтение гиперссылки XSSFHyperlink в ячейке removeHyperlink() Удаления гиперссылки ячейки getCellFormula() Чтение формулы, например SUM(C4:E4) setCellFormula(String) Определение формулы, например =SUM(C4:E4) getCellStyle() Чтение стиля ячейки (XSSFCellStyle) setCellStyle(CellStyle) Определение стиля ячейки getColumnIndex() Определение индекса ячейки setAsActiveCell() Определение активности ячейки С полным перечнем всех методов класса XSSFCell можно познакомиться на странице http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html
Классы стилей ячеек HSSFCellStyle, XSSFCellStyle
С полным перечнем всех свойств и методов класса XSSFCellStyle можно познакомиться на странице http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/CellStyle.html
Ниже в качестве примера представлен метод, формирующий стиль ячейки, в которой :
- текст центрируется по вертикали и горизонтали;
- обрамление ячейки представляет тонкую черную линию по периметру;
- текст переносится на следующую строку (не ячейку), если не вмещается в размер ячейки.
private XSSFCellStyle createCellStyle(XSSFWorkbook book)
Метод setWrapText позволяет определить флаг переноса текста в ячейке согласно ее размеру (ширине). Чтобы перенести текст принудительно, можно в текстовой строке установить символы CRCL, например «Разделитель\r\nтекста».
Классы шрифтов HSSFFont, XSSFFont
С полным перечнем всех свойств и методов класса XSSFFont можно познакомиться на странице http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Font.html
Ниже в качестве примера представлен метод, формирующий шрифт типа «Times New Roman» :
private XSSFFont createCellFont(XSSFWorkbook book) < XSSFFont font = workBook.createFont(); font.setFontHeightInPoints((short) 12); font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); font.setFontName("Times New Roman"); return(font); >. . . HSSFCellStyle style = book.createCellStyle(); style.setFont(createCellFont(book));
Примеры создания файлов Excel и определение стилей ячеек рассмотрены здесь.
Работа с таблицей Excel из Java
Собственно возникла проблема — обработать данные из таблицы и на их основе получить другую таблицу.
- Макрос — единственной проблемой является VBA, на изучение которого времени нет совершенно, да и не нравится его синтаксис
- Приложение на C# тут вроде все хорошо, но к машине на которой будет выполняться данное приложение сразу предъявляется много дополнительных требований:
- .NET Framework
- Установленный офис
- установленная основная сборка взаимодействия (PIA) для приложения Office
- связка Java и библиотека Apache POI—на этом способе я и хочу остановиться подробнее
- 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 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.