package com.yoursway.commons.excelexport; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; public class Range { private final Cell start; private final Cell end; public Range(Cell start, Cell end) { if (start == null) throw new NullPointerException("start is null"); if (end == null) throw new NullPointerException("end is null"); this.start = start; this.end = end; } // public Cell start() { // return start; // } // // public Cell end() { // return end; // } public String name() { return start.name() + ":" + end.name(); } public Range reduceToColumn(int column) { return new Range(start.siblingInColumn(column), end.siblingInColumn(column)); } public Range reduceToColumn(Column column) { return new Range(start.siblingInColumn(column), end.siblingInColumn(column)); } public Range reduceToRow(int row) { return new Range(start.siblingInRow(row), end.siblingInRow(row)); } public Range reduceToRow(Row row) { return new Range(start.siblingInRow(row), end.siblingInRow(row)); } public Range startingAtColumn(int column) { return startingAtColumn(start.siblingInColumn(column).column()); } public Range startingAtColumn(Column column) { return new Range(start.siblingInColumn(column), end); } public Range startingAtRow(int row) { return new Range(start.siblingInRow(row), end); } public Range startingAtRow(Row row) { return new Range(start.siblingInRow(row), end); } public List<Cell> cells() { List<Cell> result = new ArrayList<Cell>(); for (Row row = start.row(), lastRow = end.row();; row = row.next()) { for (Column column = start.column(), lastColumn = end.column();; column = column.next()) { result.add(row.cell(column)); if (column == lastColumn) break; } if (row == lastRow) break; } return result; } public List<Column> columns() { List<Column> result = new ArrayList<Column>(); for (Column current = start.column(), lastColumn = end.column();; current = current.next()) { result.add(current); if (current == lastColumn) break; } return result; } public int columnCount() { return end.column().ordinal() - start.column().ordinal() + 1; } public Range columnWidth(int widthInChars) { for (Column column : columns()) column.width(widthInChars); return this; } public Range fill(Fill fill) { for (Cell cell : cells()) cell._fill(fill); return this; } public Cell merge() { start.hspan(columnCount()); return start; } public Range align(Alignment alignment) { for (Cell cell : cells()) cell.align(alignment); return this; } public Range center() { return align(Alignment.CENTER); } public Range outerBorder(Border border) { return outerBorder(border, Edge.OUTER); } public Range outerBorder(Border border, Edge edge) { return outerBorder(border, EnumSet.of(edge)); } public Range outerBorder(Border border, EnumSet<Edge> edges) { if (edges.contains(Edge.LEFT)) for (Cell cell : reduceToColumn(start.column()).cells()) cell.border(border, Edge.LEFT); if (edges.contains(Edge.TOP)) for (Cell cell : reduceToRow(start.row()).cells()) cell.border(border, Edge.TOP); if (edges.contains(Edge.RIGHT)) for (Cell cell : reduceToColumn(end.column()).cells()) cell.border(border, Edge.RIGHT); if (edges.contains(Edge.BOTTOM)) for (Cell cell : reduceToRow(end.row()).cells()) cell.border(border, Edge.BOTTOM); return this; } public Range innerBorder(Border border) { return innerBorder(border, true, true); } public Range innerBorder(Border border, boolean horizonal, boolean vertical) { if (horizonal) for (Cell cell : cells()) { if (cell.row() != start.row()) cell.border(border, Edge.TOP); if (cell.row() != end.row()) cell.border(border, Edge.BOTTOM); } if (vertical) for (Cell cell : cells()) { if (cell.column() != start.column()) cell.border(border, Edge.LEFT); if (cell.column() != end.column()) cell.border(border, Edge.RIGHT); } return this; } }