java-version jitpack-last-release Unit tests Coverage
Предоставляет единый удобный API для доступа к табличным данным из файлов в форматах excel, xml, csv и др.
Разберем доступ к данным на примере. Пусть на листе excel (xml или csv) имеется несколько таблиц.
- Таблица с ценой товаров:
Таблица товаров
| Товар | Цена (опт), руб/кг | Цена розничная, руб/кг |
|---|---|---|
| Яблоко | 50 | 90.5 |
| Груша | 120 | 180.0 |
- Таблица с заголовком из 2-х строк:
Таблица продаж
| Покупатель | Категория | Объем, | |
|---|---|---|---|
| Страна | Компания | покупателя | кг |
| Россия | "Шестерочка" | опт | 100000 |
| Беларусь | "Фруктелла" | опт | 50000 |
| Итого | 150000 |
- Пусть также иногда встречается следующий вариант заголовка предыдущей таблицы (причем заранее не известно какой вариант встретится в файле):
| Покупатель | Категория | Вес, | |
|---|---|---|---|
| Страна | Компания | покупателя | кг |
Для представленного выше примера объявляются описания столбцов вне зависимости от формата файла (excel, xml, csv и др.):
enum ProductTableHeader implements TableHeaderColumn { 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 TableHeaderColumn { 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; } }
В зависимости от формата исходных данных подготавливаются объекты ReportPage. Например, для excel файла потребуются
зависимость table-wrapper-excel-impl или Spring Boot Starter
и код:
TableFactoryRegistry.add(new ExcelTableFactory()); // регистрируем фабрику Workbook book = new XSSFWorkbook(xlsFileinputStream); // открываем Excel файл ReportPage reportPage = new ExcelSheet(book.getSheetAt(0)); // используем 1-ый лист Excel файла для поиска таблиц
Используем API для доступа к данным таблиц
// Регистронезависимо найдет ячейку с текстом "Таблица товаров" - это имя таблицы. // Имя таблицы описано в единственной строке (2ой аргумент). // Парсит следующую 1 строку (5ый аргумент) как заголовок таблицы (заголовок описан с помощью enum ProductTableHeader). // Последующие строки парсятся как данные до пустой строки или конца файла (3ий аргумент 'null') Table productTable = reportPage.createTable("таблица товаров", 1, null, ProductTableHeader.class, 1); // Регистронезависимо найдет ячейку с текстом "Таблица продаж" - это имя таблицы. // Имя таблицы описано в единственной строке (2ой аргумент). // Парсит следующие 2 строки (5ый аргумент) как заголовок таблицы (заголовок описан с помощью enum SalesTableHeader). // Последующие строки парсятся как данные таблицы до строки, содержащей ячейку с текстом "Итого" (3ий аргумент) Table salesTable = reportPage.createTable("таблица продаж", 1, "итого", SalesTableHeader.class, 2); for (TableRow row : productTable) { // Извлечет наименования товаров "Яблоко", "Груша" из "Таблицы товаров" String product = row.getStringCellValueOrDefault(PRODUCT, "Неизвестный товар"); // Извлечет оптовые цены 50 и 120 из "Таблицы товаров" BigDecimal price = row.getBigDecimalCellValue(PRICE_TRADE); } // Список будет содержать ["Россия", "Беларусь"] из "Таблицы продаж" Set<String> countries = salesTable.stream() .map(row -> row.getStringCellValue(BUYER_COUNTRY)) .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>
- table-wrapper-xml-impl для работы с xml файлами
<dependency> <groupId>com.github.spacious-team</groupId> <artifactId>table-wrapper-xml-impl</artifactId> <version>master-SNAPSHOT</version> </dependency>
- table-wrapper-csv-impl для работы с csv (tsv) файлами
<dependency> <groupId>com.github.spacious-team</groupId> <artifactId>table-wrapper-csv-impl</artifactId> <version>master-SNAPSHOT</version> </dependency>
Или напишите реализацию для своего формата представления таблицы по аналогии с существующими.
Существует также Spring Boot Starter
для работы со Spring Boot проектами, который поставляет нужные зависимости и создает бины фабрик
ExcelTableFactory, XmlTableFactory, CsvTableFactory.