package fr.openwide.core.imports.excel.test.poi; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.util.Date; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.javatuples.Quartet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import fr.openwide.core.imports.table.apache.poi.mapping.ApachePoiImportColumnSet; import fr.openwide.core.imports.table.apache.poi.scanner.ApachePoiImportFileScanner; import fr.openwide.core.imports.table.common.event.ITableImportEventHandler; import fr.openwide.core.imports.table.common.event.LoggerTableImportEventHandler; import fr.openwide.core.imports.table.common.event.TableImportNonFatalErrorHandling; import fr.openwide.core.imports.table.common.event.exception.TableImportException; import fr.openwide.core.imports.table.common.excel.scanner.IExcelImportFileScanner.IExcelImportFileVisitor; import fr.openwide.core.imports.table.common.excel.scanner.IExcelImportFileScanner.SheetSelection; import fr.openwide.core.imports.table.common.location.ITableImportNavigator; import fr.openwide.core.imports.table.common.mapping.column.builder.MappingConstraint; public class TestApachePoiExcelImporter { private static final Logger LOGGER = LoggerFactory.getLogger(TestApachePoiExcelImporter.class); private static class Columns extends ApachePoiImportColumnSet { final Column<Date> dateColumn = withIndex(0).asDate().build(); final Column<Boolean> booleanColumn = withIndex(1).asString().toBoolean(new Function<String, Boolean>() { @Override public Boolean apply(String input) { return "true".equals(input) ? true : false; } }).build(); final Column<String> stringColumn = withHeader("StringColumn", 2, MappingConstraint.REQUIRED).asString().clean().build(); final Column<Integer> integerColumn = withHeader("IntegerColumn").asInteger().build(); final Column<Integer> missingColumn = withHeader("MissingColumn", MappingConstraint.OPTIONAL).asInteger().build(); } private static final Columns COLUMNS = new Columns(); private static final ApachePoiImportFileScanner SCANNER = new ApachePoiImportFileScanner(); public List<Quartet<Date, Boolean, String, Integer>> doImport(InputStream stream, String filename) throws TableImportException { final List<Quartet<Date, Boolean, String, Integer>> results = Lists.newArrayList(); SCANNER.scan(stream, filename, SheetSelection.ALL, new IExcelImportFileVisitor<Workbook, Sheet, Row, Cell, CellReference>() { @Override public void visitSheet(ITableImportNavigator<Sheet, Row, Cell, CellReference> navigator, Workbook workbook, Sheet sheet) throws TableImportException { ITableImportEventHandler eventHandler = new LoggerTableImportEventHandler(TableImportNonFatalErrorHandling.THROW_IMMEDIATELY, LOGGER); Columns.TableContext sheetContext = COLUMNS.map(sheet, navigator, eventHandler); assertTrue(sheetContext.column(COLUMNS.dateColumn).exists()); assertTrue(sheetContext.column(COLUMNS.integerColumn).exists()); assertTrue(sheetContext.column(COLUMNS.booleanColumn).exists()); assertFalse(sheetContext.column(COLUMNS.missingColumn).exists()); for (Columns.RowContext rowContext : Iterables.skip(sheetContext, 1)) { Quartet<Date, Boolean, String, Integer> result = Quartet.with( rowContext.cell(COLUMNS.dateColumn).get(), rowContext.cell(COLUMNS.booleanColumn).get(), rowContext.cell(COLUMNS.stringColumn).get(), rowContext.cell(COLUMNS.integerColumn).get() ); results.add(result); } } }); return results; } }