package com.brightgenerous.poi.reader; import java.util.Iterator; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import com.brightgenerous.poi.reader.RowIterableSheetCollector.RowData; public abstract class RowIterableSheetCollector<T> extends AbstractSheetCollector<Iterable<RowData<T>>> { @Override protected Iterable<RowData<T>> getProcess() { final Sheet sheet = getSheet(); final int rows = sheet.getLastRowNum() + 1; return new Iterable<RowData<T>>() { @Override public Iterator<RowData<T>> iterator() { return new Iterator<RowData<T>>() { private int lastRow = -1; private int currentIndex; private T next; @Override public boolean hasNext() { if (next != null) { return true; } for (int i = lastRow + 1; i < rows; i++) { Row row = sheet.getRow(i); if ((next = rowToData(i, currentIndex, row)) != null) { lastRow = i; return true; } } lastRow = rows; return false; } @Override public RowData<T> next() { if (!hasNext()) { throw new IllegalStateException("does not have next."); } RowData<T> ret; { ret = new RowData<>(lastRow, currentIndex, next); currentIndex++; next = null; } return ret; } @Override public void remove() { throw new UnsupportedOperationException(); } }; } }; } protected abstract T rowToData(int r, int index, Row row); public static class RowData<T> { private final int row; private final int index; private final T object; public RowData(int row, int index, T object) { this.row = row; this.index = index; this.object = object; } public int getRow() { return row; } public int getIndex() { return index; } public T get() { return object; } } }