Предоставляет удобный API для доступа к табличным данным из файлов в форматах excel, xml и др. Пусть на листе excel имеется несколько таблиц.
- Таблица с ценой товаров:
Таблица товаров
Товар | Цена (опт), руб/кг | Цена розничная, руб/кг |
---|---|---|
Яблоко | 50 | 90.5 |
Груша | 120 | 180.0 |
- Таблица с заголовком из 2-х строк:
Таблица продаж
Покупатель | Категория | Объем, | |
---|---|---|---|
Страна | Компания | покупателя | кг |
Россия | "Шестерочка" | опт | 100000 |
Беларусь | "Фруктелла" | опт | 50000 |
Итого | 150000 |
- Пусть также иногда встречается следующий вариант заголовка предыдущей таблицы (причем заранее не известно какой вариант встретится в файле):
Покупатель | Категория | Вес, | |
---|---|---|---|
Страна | Компания | покупателя | кг |
Для представленного выше примера объявляются описания столбцов:
enum ProductTableHeader implements TableColumnDescription {
PRODUCT(0),
PRICE_TRADE("цена", "опт"),
PRICE("цена", "розничная");
private final TableColumn column;
ProductTableHeader(int columnIndex) {
this.column = ConstantPositionTableColumn.of(columnIndex);
}
ProductTableHeader(String... words) {
this.column = PatternTableColumn.of(words);
}
public TableColumn getColumn() {
return column;
}
}
enum SalesTableHeader implements TableColumnDescription {
BUYER_COUNTRY(MultiLineTableColumn.of("покупатель", "страна")),
BUYER_COMPANY(MultiLineTableColumn.of("покупатель", "компания")),
TYPE(MultiLineTableColumn.of("категория", "покупателя")),
VOLUME(AnyOfTableColumn.of(
MultiLineTableColumn.of("объем", "кг"),
MultiLineTableColumn.of("вес", "кг")));
private final TableColumn column;
CellTableHeader(TableColumn column) {
this.column = column;
}
public TableColumn getColumn() {
return column;
}
}
В зависимости от формата исходных данных подготавливаются объекты. Например, для excel файла потребуются
// table wrapper excel impl dependency required
Workbook book = new XSSFWorkbook(xlsFileinputStream); // open Excel file
ReportPage reportPage = new ExcelSheet(book.getSheetAt(0)); // select first Excel sheet
Используем API для доступа к данным таблиц
// finding row with "таблица товаров" content, parsing next row as header and
// counting next rows as table data rows till empty line
Table productTable = reportPage.create("таблица товаров", ProductTableHeader.class);
// finding row with "таблица продаж" content, parsing next 2 rows as header and
// counting next rows as table data rows till row containing "итого" in any cell
Table salesTable = reportPage.create("таблица продаж", "итого", SalesTableHeader.class, 2);
for (TableRow row : productTable) {
String product = row.getStringCellValueOrDefault(PRICE_TRADE, "Неизвестный товар");
BigDecimal price = row.getBigDecimalCellValue(PRICE_TRADE);
}
Set<String> countries = salesTable.stream()
.map(row -> row.getStringCelValueOrDefault(BUYER_COUNTRY, "unknown"))
.collect(toSet())
API предоставляет и другие удобные интерфейсы для работы с таблицами.
Необходимо подключить репозиторий open source библиотек github jitpack, например для Apache Maven проекта
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Далее следует добавить зависимость table-wrapper-api
<dependency>
<groupId>com.github.spacious-team</groupId>
<artifactId>table-wrapper-api</artifactId>
<version>master-SNAPSHOT</version>
</dependency>
В качестве версии можно использовать:
- версию релиза на github;
- паттерн
<branch>-SNAPSHOT
для сборки зависимости с последнего коммита выбранной ветки; - короткий десяти значный номер коммита для сборки зависимости с указанного коммита.
Вам также потребуется реализация парсера, например table-wrapper-excel-impl для работы с excel файлами
<dependency>
<groupId>com.github.spacious-team</groupId>
<artifactId>table-wrapper-excel-impl</artifactId>
<version>master-SNAPSHOT</version>
</dependency>