diff --git a/src/examples/src/org/apache/poi/ss/examples/DrawingBorders.java b/src/examples/src/org/apache/poi/ss/examples/DrawingBorders.java new file mode 100644 index 000000000..5add84266 --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/DrawingBorders.java @@ -0,0 +1,111 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.apache.poi.ss.examples; + +import java.io.FileOutputStream; +import java.io.IOException; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.IndexedColors; +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.PropertyTemplate; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +/** + * Excel Border Drawing - examples + * + *

+ * Partly based on the code snippets from + * org.apache.poi.ss.examples.ConditionalFormats + *

+ */ +public class DrawingBorders { + + public static void main(String[] args) throws IOException { + Workbook wb; + + if (args.length > 0 && args[0].equals("-xls")) { + wb = new HSSFWorkbook(); + } else { + wb = new XSSFWorkbook(); + } + + // add a sheet, and put some values into it + Sheet sh1 = wb.createSheet("Sheet1"); + Row r = sh1.createRow(0); + Cell c = r.createCell(1); + c.setCellValue("All Borders Medium Width"); + r = sh1.createRow(4); + c = r.createCell(1); + c.setCellValue("Medium Outside / Thin Inside Borders"); + r = sh1.createRow(8); + c = r.createCell(1); + c.setCellValue("Colored Borders"); + + // draw borders (three 3x3 grids) + PropertyTemplate pt = new PropertyTemplate(); + // #1) these borders will all be medium in default color + pt.drawBorders(new CellRangeAddress(1, 3, 1, 3), + CellStyle.BORDER_MEDIUM, PropertyTemplate.Extent.ALL); + // #2) these cells will have medium outside borders and thin inside borders + pt.drawBorders(new CellRangeAddress(5, 7, 1, 3), + CellStyle.BORDER_MEDIUM, PropertyTemplate.Extent.OUTSIDE); + pt.drawBorders(new CellRangeAddress(5, 7, 1, 3), CellStyle.BORDER_THIN, + PropertyTemplate.Extent.INSIDE); + // #3) these cells will all be medium weight with different colors for the + // outside, inside horizontal, and inside vertical borders. The center + // cell will have no borders. + pt.drawBorders(new CellRangeAddress(9, 11, 1, 3), + CellStyle.BORDER_MEDIUM, IndexedColors.RED.getIndex(), + PropertyTemplate.Extent.OUTSIDE); + pt.drawBorders(new CellRangeAddress(9, 11, 1, 3), + CellStyle.BORDER_MEDIUM, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.INSIDE_VERTICAL); + pt.drawBorders(new CellRangeAddress(9, 11, 1, 3), + CellStyle.BORDER_MEDIUM, IndexedColors.GREEN.getIndex(), + PropertyTemplate.Extent.INSIDE_HORIZONTAL); + pt.drawBorders(new CellRangeAddress(10, 10, 2, 2), + CellStyle.BORDER_NONE, + PropertyTemplate.Extent.ALL); + + // apply borders to sheet + pt.applyBorders(sh1); + + // add another sheet and apply the borders to it + Sheet sh2 = wb.createSheet("Sheet2"); + pt.applyBorders(sh2); + + // Write the output to a file + String file = "db-poi.xls"; + if (wb instanceof XSSFWorkbook) + file += "x"; + FileOutputStream out = new FileOutputStream(file); + wb.write(out); + out.close(); + wb.close(); + System.out.println("Generated: " + file); + } + +} diff --git a/src/java/org/apache/poi/ss/util/PropertyTemplate.java b/src/java/org/apache/poi/ss/util/PropertyTemplate.java new file mode 100644 index 000000000..3f9d38877 --- /dev/null +++ b/src/java/org/apache/poi/ss/util/PropertyTemplate.java @@ -0,0 +1,989 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.util; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.SpreadsheetVersion; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; + +/** + *

+ * A {@link PropertyTemplate} is a template that can be applied to any sheet in + * a project. It contains all the border type and color attributes needed to + * draw all the borders for a single sheet. That template can be applied to any + * sheet in any workbook. + * + * This class requires the full spreadsheet to be in memory so + * {@link SWorkbook} Spreadsheets are not supported. The same + * {@link PropertyTemplate} can, however, be applied to both + * {@link org.apache.poi.hssf.usermodel.HSSFWorkbook}, and Workbook objects + * if necessary. Portions of the border that fall outside the max range of the + * {@link HSSFWorkbook} sheet are ignored. + *

+ * + *

+ * This would replace {@link RegionUtil}. + *

+ */ +public final class PropertyTemplate { + + /** + * Provides various extents of the properties being added to the template + */ + public enum Extent { + /** + * No properties defined. This can be used to remove existing + * properties. + */ + NONE, + + /** + * All borders, that is top, bottom, left and right, including interior + * borders for the range. Does not include diagonals which are different + * and not implemented here. + */ + ALL, + + /** + * All inside borders. This is top, bottom, left, and right borders, but + * restricted to the interior borders for the range. For a range of one + * cell, this will produce no borders. + */ + INSIDE, + + /** + * All outside borders. That is top, bottom, left and right borders that + * bound the range only. + */ + OUTSIDE, + + /** + * This is just the top border for the range. No interior borders will + * be produced. + */ + TOP, + + /** + * This is just the bottom border for the range. No interior borders + * will be produced. + */ + BOTTOM, + + /** + * This is just the left border for the range, no interior borders will + * be produced. + */ + LEFT, + + /** + * This is just the right border for the range, no interior borders will + * be produced. + */ + RIGHT, + + /** + * This is all horizontal borders for the range, including interior and + * outside borders. + */ + HORIZONTAL, + + /** + * This is just the interior horizontal borders for the range. + */ + INSIDE_HORIZONTAL, + + /** + * This is just the outside horizontal borders for the range. + */ + OUTSIDE_HORIZONTAL, + + /** + * This is all vertical borders for the range, including interior and + * outside borders. + */ + VERTICAL, + + /** + * This is just the interior vertical borders for the range. + */ + INSIDE_VERTICAL, + + /** + * This is just the outside vertical borders for the range. + */ + OUTSIDE_VERTICAL + } + + /** + * This is a list of cell properties for one shot application to a range of + * cells at a later time. + */ + private Map> _propertyTemplate; + + /** + * + */ + public PropertyTemplate() { + _propertyTemplate = new HashMap>(); + } + + /** + * Draws a group of cell borders for a cell range. The borders are not + * applied to the cells at this time, just the template is drawn. To apply + * the drawn borders to a sheet, use {@link #applyBorders}. + * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders to be + * applied. + */ + public void drawBorders(CellRangeAddress range, short borderType, + Extent extent) { + switch (extent) { + case NONE: + removeBorders(range); + break; + case ALL: + drawHorizontalBorders(range, borderType, Extent.ALL); + drawVerticalBorders(range, borderType, Extent.ALL); + break; + case INSIDE: + drawHorizontalBorders(range, borderType, Extent.INSIDE); + drawVerticalBorders(range, borderType, Extent.INSIDE); + break; + case OUTSIDE: + drawOutsideBorders(range, borderType, Extent.ALL); + break; + case TOP: + drawTopBorder(range, borderType); + break; + case BOTTOM: + drawBottomBorder(range, borderType); + break; + case LEFT: + drawLeftBorder(range, borderType); + break; + case RIGHT: + drawRightBorder(range, borderType); + break; + case HORIZONTAL: + drawHorizontalBorders(range, borderType, Extent.ALL); + break; + case INSIDE_HORIZONTAL: + drawHorizontalBorders(range, borderType, Extent.INSIDE); + break; + case OUTSIDE_HORIZONTAL: + drawOutsideBorders(range, borderType, Extent.HORIZONTAL); + break; + case VERTICAL: + drawVerticalBorders(range, borderType, Extent.ALL); + break; + case INSIDE_VERTICAL: + drawVerticalBorders(range, borderType, Extent.INSIDE); + break; + case OUTSIDE_VERTICAL: + drawOutsideBorders(range, borderType, Extent.VERTICAL); + break; + } + } + + /** + * Draws a group of cell borders for a cell range. The borders are not + * applied to the cells at this time, just the template is drawn. To apply + * the drawn borders to a sheet, use {@link #applyBorders}. + * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders to be + * applied. + */ + public void drawBorders(CellRangeAddress range, short borderType, + short color, Extent extent) { + drawBorders(range, borderType, extent); + if (borderType != CellStyle.BORDER_NONE) { + drawBorderColors(range, color, extent); + } + } + + /** + *

+ * Draws the top border for a range of cells + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + */ + private void drawTopBorder(CellRangeAddress range, short borderType) { + int row = range.getFirstRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstCol; i <= lastCol; i++) { + addProperty(row, i, CellUtil.BORDER_TOP, borderType); + if (borderType == CellStyle.BORDER_NONE && row > 0) { + addProperty(row - 1, i, CellUtil.BORDER_BOTTOM, borderType); + } + } + } + + /** + *

+ * Draws the bottom border for a range of cells + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + */ + private void drawBottomBorder(CellRangeAddress range, short borderType) { + int row = range.getLastRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstCol; i <= lastCol; i++) { + addProperty(row, i, CellUtil.BORDER_BOTTOM, borderType); + if (borderType == CellStyle.BORDER_NONE + && row < SpreadsheetVersion.EXCEL2007.getMaxRows() - 1) { + addProperty(row + 1, i, CellUtil.BORDER_TOP, borderType); + } + } + } + + /** + *

+ * Draws the left border for a range of cells + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + */ + private void drawLeftBorder(CellRangeAddress range, short borderType) { + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int col = range.getFirstColumn(); + for (int i = firstRow; i <= lastRow; i++) { + addProperty(i, col, CellUtil.BORDER_LEFT, borderType); + if (borderType == CellStyle.BORDER_NONE && col > 0) { + addProperty(i, col - 1, CellUtil.BORDER_RIGHT, borderType); + } + } + } + + /** + *

+ * Draws the right border for a range of cells + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + */ + private void drawRightBorder(CellRangeAddress range, short borderType) { + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int col = range.getLastColumn(); + for (int i = firstRow; i <= lastRow; i++) { + addProperty(i, col, CellUtil.BORDER_RIGHT, borderType); + if (borderType == CellStyle.BORDER_NONE + && col < SpreadsheetVersion.EXCEL2007.getMaxColumns() - 1) { + addProperty(i, col + 1, CellUtil.BORDER_LEFT, borderType); + } + } + } + + /** + *

+ * Draws the outside borders for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders to be + * applied. Valid Values are: + * + */ + private void drawOutsideBorders(CellRangeAddress range, short borderType, + Extent extent) { + switch (extent) { + case ALL: + case HORIZONTAL: + case VERTICAL: + if (extent == Extent.ALL || extent == Extent.HORIZONTAL) { + drawTopBorder(range, borderType); + drawBottomBorder(range, borderType); + } + if (extent == Extent.ALL || extent == Extent.VERTICAL) { + drawLeftBorder(range, borderType); + drawRightBorder(range, borderType); + } + break; + default: + throw new IllegalArgumentException( + "Unsupported PropertyTemplate.Extent, valid Extents are ALL, HORIZONTAL, and VERTICAL"); + } + } + + /** + *

+ * Draws the horizontal borders for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders to be + * applied. Valid Values are: + * + */ + private void drawHorizontalBorders(CellRangeAddress range, short borderType, + Extent extent) { + switch (extent) { + case ALL: + case INSIDE: + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstRow; i <= lastRow; i++) { + CellRangeAddress row = new CellRangeAddress(i, i, firstCol, + lastCol); + if (extent == Extent.ALL || i > firstRow) { + drawTopBorder(row, borderType); + } + if (extent == Extent.ALL || i < lastRow) { + drawBottomBorder(row, borderType); + } + } + break; + default: + throw new IllegalArgumentException( + "Unsupported PropertyTemplate.Extent, valid Extents are ALL and INSIDE"); + } + } + + /** + *

+ * Draws the vertical borders for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which borders are + * drawn. + * @param borderType + * - Type of border to draw. Use BORDER_XXX constants in + * {@link CellStyle}. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders to be + * applied. Valid Values are: + * + */ + private void drawVerticalBorders(CellRangeAddress range, short borderType, + Extent extent) { + switch (extent) { + case ALL: + case INSIDE: + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstCol; i <= lastCol; i++) { + CellRangeAddress row = new CellRangeAddress(firstRow, lastRow, + i, i); + if (extent == Extent.ALL || i > firstCol) { + drawLeftBorder(row, borderType); + } + if (extent == Extent.ALL || i < lastCol) { + drawRightBorder(row, borderType); + } + } + break; + default: + throw new IllegalArgumentException( + "Unsupported PropertyTemplate.Extent, valid Extents are ALL and INSIDE"); + } + } + + /** + * Removes all border properties from this {@link PropertyTemplate} for the + * specified range. + * + * @parm range - {@link CellRangeAddress} range of cells to remove borders. + */ + private void removeBorders(CellRangeAddress range) { + Set properties = new HashSet(); + properties.add(CellUtil.BORDER_TOP); + properties.add(CellUtil.BORDER_BOTTOM); + properties.add(CellUtil.BORDER_LEFT); + properties.add(CellUtil.BORDER_RIGHT); + for (int row = range.getFirstRow(); row <= range.getLastRow(); row++) { + for (int col = range.getFirstColumn(); col <= range + .getLastColumn(); col++) { + removeProperties(row, col, properties); + } + } + removeBorderColors(range); + } + + /** + * Applies the drawn borders to a Sheet. The borders that are applied are + * the ones that have been drawn by the {@link #drawBorders} and + * {@link #drawBorderColors} methods. + * + * @param sheet + * - {@link Sheet} on which to apply borders + */ + public void applyBorders(Sheet sheet) { + Workbook wb = sheet.getWorkbook(); + for (Map.Entry> entry : _propertyTemplate + .entrySet()) { + CellAddress cellAddress = entry.getKey(); + if (cellAddress.getRow() < wb.getSpreadsheetVersion().getMaxRows() + && cellAddress.getColumn() < wb.getSpreadsheetVersion() + .getMaxColumns()) { + Map properties = entry.getValue(); + Row row = CellUtil.getRow(cellAddress.getRow(), sheet); + Cell cell = CellUtil.getCell(row, cellAddress.getColumn()); + CellUtil.setCellStyleProperties(cell, properties); + } + } + } + + /** + * Sets the color for a group of cell borders for a cell range. The borders + * are not applied to the cells at this time, just the template is drawn. If + * the borders do not exist, a BORDER_THIN border is used. To apply the + * drawn borders to a sheet, use {@link #applyBorders}. + * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders for which + * colors are set. + */ + public void drawBorderColors(CellRangeAddress range, short color, + Extent extent) { + switch (extent) { + case NONE: + removeBorderColors(range); + break; + case ALL: + drawHorizontalBorderColors(range, color, Extent.ALL); + drawVerticalBorderColors(range, color, Extent.ALL); + break; + case INSIDE: + drawHorizontalBorderColors(range, color, Extent.INSIDE); + drawVerticalBorderColors(range, color, Extent.INSIDE); + break; + case OUTSIDE: + drawOutsideBorderColors(range, color, Extent.ALL); + break; + case TOP: + drawTopBorderColor(range, color); + break; + case BOTTOM: + drawBottomBorderColor(range, color); + break; + case LEFT: + drawLeftBorderColor(range, color); + break; + case RIGHT: + drawRightBorderColor(range, color); + break; + case HORIZONTAL: + drawHorizontalBorderColors(range, color, Extent.ALL); + break; + case INSIDE_HORIZONTAL: + drawHorizontalBorderColors(range, color, Extent.INSIDE); + break; + case OUTSIDE_HORIZONTAL: + drawOutsideBorderColors(range, color, Extent.HORIZONTAL); + break; + case VERTICAL: + drawVerticalBorderColors(range, color, Extent.ALL); + break; + case INSIDE_VERTICAL: + drawVerticalBorderColors(range, color, Extent.INSIDE); + break; + case OUTSIDE_VERTICAL: + drawOutsideBorderColors(range, color, Extent.VERTICAL); + break; + } + } + + /** + *

+ * Sets the color of the top border for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + */ + private void drawTopBorderColor(CellRangeAddress range, short color) { + int row = range.getFirstRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstCol; i <= lastCol; i++) { + if (getTemplateProperty(row, i, CellUtil.BORDER_TOP) == 0) { + drawTopBorder(new CellRangeAddress(row, row, i, i), + CellStyle.BORDER_THIN); + } + addProperty(row, i, CellUtil.TOP_BORDER_COLOR, color); + } + } + + /** + *

+ * Sets the color of the bottom border for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + */ + private void drawBottomBorderColor(CellRangeAddress range, short color) { + int row = range.getLastRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstCol; i <= lastCol; i++) { + if (getTemplateProperty(row, i, CellUtil.BORDER_BOTTOM) == 0) { + drawBottomBorder(new CellRangeAddress(row, row, i, i), + CellStyle.BORDER_THIN); + } + addProperty(row, i, CellUtil.BOTTOM_BORDER_COLOR, color); + } + } + + /** + *

+ * Sets the color of the left border for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + */ + private void drawLeftBorderColor(CellRangeAddress range, short color) { + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int col = range.getFirstColumn(); + for (int i = firstRow; i <= lastRow; i++) { + if (getTemplateProperty(i, col, CellUtil.BORDER_LEFT) == 0) { + drawLeftBorder(new CellRangeAddress(i, i, col, col), + CellStyle.BORDER_THIN); + } + addProperty(i, col, CellUtil.LEFT_BORDER_COLOR, color); + } + } + + /** + *

+ * Sets the color of the right border for a range of cells. If the border is + * not drawn, it defaults to BORDER_THIN + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + */ + private void drawRightBorderColor(CellRangeAddress range, short color) { + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int col = range.getLastColumn(); + for (int i = firstRow; i <= lastRow; i++) { + if (getTemplateProperty(i, col, CellUtil.BORDER_RIGHT) == 0) { + drawRightBorder(new CellRangeAddress(i, i, col, col), + CellStyle.BORDER_THIN); + } + addProperty(i, col, CellUtil.RIGHT_BORDER_COLOR, color); + } + } + + /** + *

+ * Sets the color of the outside borders for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders for which + * colors are set. Valid Values are: + *
    + *
  • CellBorder.Extent.ALL
  • + *
  • CellBorder.Extent.HORIZONTAL
  • + *
  • CellBorder.Extent.VERTICAL
  • + *
+ */ + private void drawOutsideBorderColors(CellRangeAddress range, short color, + Extent extent) { + switch (extent) { + case ALL: + case HORIZONTAL: + case VERTICAL: + if (extent == Extent.ALL || extent == Extent.HORIZONTAL) { + drawTopBorderColor(range, color); + drawBottomBorderColor(range, color); + } + if (extent == Extent.ALL || extent == Extent.VERTICAL) { + drawLeftBorderColor(range, color); + drawRightBorderColor(range, color); + } + break; + default: + throw new IllegalArgumentException( + "Unsupported PropertyTemplate.Extent, valid Extents are ALL, HORIZONTAL, and VERTICAL"); + } + } + + /** + *

+ * Sets the color of the horizontal borders for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders for which + * colors are set. Valid Values are: + *
    + *
  • CellBorder.Extent.ALL
  • + *
  • CellBorder.Extent.INSIDE
  • + *
+ */ + private void drawHorizontalBorderColors(CellRangeAddress range, short color, + Extent extent) { + switch (extent) { + case ALL: + case INSIDE: + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstRow; i <= lastRow; i++) { + CellRangeAddress row = new CellRangeAddress(i, i, firstCol, + lastCol); + if (extent == Extent.ALL || i > firstRow) { + drawTopBorderColor(row, color); + } + if (extent == Extent.ALL || i < lastRow) { + drawBottomBorderColor(row, color); + } + } + break; + default: + throw new IllegalArgumentException( + "Unsupported PropertyTemplate.Extent, valid Extents are ALL and INSIDE"); + } + } + + /** + *

+ * Sets the color of the vertical borders for a range of cells. + *

+ * + * @param range + * - {@link CellRangeAddress} range of cells on which colors are + * set. + * @param color + * - Color index from {@link IndexedColors} used to draw the + * borders. + * @param extent + * - {@link PropertyTemplate.Extent} of the borders for which + * colors are set. Valid Values are: + *
    + *
  • CellBorder.Extent.ALL
  • + *
  • CellBorder.Extent.INSIDE
  • + *
+ */ + private void drawVerticalBorderColors(CellRangeAddress range, short color, + Extent extent) { + switch (extent) { + case ALL: + case INSIDE: + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + int firstCol = range.getFirstColumn(); + int lastCol = range.getLastColumn(); + for (int i = firstCol; i <= lastCol; i++) { + CellRangeAddress row = new CellRangeAddress(firstRow, lastRow, + i, i); + if (extent == Extent.ALL || i > firstCol) { + drawLeftBorderColor(row, color); + } + if (extent == Extent.ALL || i < lastCol) { + drawRightBorderColor(row, color); + } + } + break; + default: + throw new IllegalArgumentException( + "Unsupported PropertyTemplate.Extent, valid Extents are ALL and INSIDE"); + } + } + + /** + * Removes all border properties from this {@link PropertyTemplate} for the + * specified range. + * + * @parm range - {@link CellRangeAddress} range of cells to remove borders. + */ + private void removeBorderColors(CellRangeAddress range) { + Set properties = new HashSet(); + properties.add(CellUtil.TOP_BORDER_COLOR); + properties.add(CellUtil.BOTTOM_BORDER_COLOR); + properties.add(CellUtil.LEFT_BORDER_COLOR); + properties.add(CellUtil.RIGHT_BORDER_COLOR); + for (int row = range.getFirstRow(); row <= range.getLastRow(); row++) { + for (int col = range.getFirstColumn(); col <= range + .getLastColumn(); col++) { + removeProperties(row, col, properties); + } + } + } + + /** + * Adds a property to this {@link PropertyTemplate} for a given cell + * + * @param row + * @param col + * @param property + * @param value + */ + private void addProperty(int row, int col, String property, short value) { + CellAddress cell = new CellAddress(row, col); + Map cellProperties = _propertyTemplate.get(cell); + if (cellProperties == null) { + cellProperties = new HashMap(); + } + cellProperties.put(property, Short.valueOf(value)); + _propertyTemplate.put(cell, cellProperties); + } + + /** + * Removes a set of properties from this {@link PropertyTemplate} for a + * given cell + * + * @param row + * @param col + * @param properties + */ + private void removeProperties(int row, int col, Set properties) { + CellAddress cell = new CellAddress(row, col); + Map cellProperties = _propertyTemplate.get(cell); + if (cellProperties != null) { + cellProperties.keySet().removeAll(properties); + if (cellProperties.isEmpty()) { + _propertyTemplate.remove(cell); + } else { + _propertyTemplate.put(cell, cellProperties); + } + } + } + + /** + * Retrieves the number of borders assigned to a cell + * + * @param cell + */ + public int getNumBorders(CellAddress cell) { + Map cellProperties = _propertyTemplate.get(cell); + if (cellProperties == null) { + return 0; + } + + int count = 0; + for (String property : cellProperties.keySet()) { + if (property.equals(CellUtil.BORDER_TOP)) + count += 1; + if (property.equals(CellUtil.BORDER_BOTTOM)) + count += 1; + if (property.equals(CellUtil.BORDER_LEFT)) + count += 1; + if (property.equals(CellUtil.BORDER_RIGHT)) + count += 1; + } + return count; + } + + /** + * Retrieves the number of borders assigned to a cell + * + * @param row + * @param col + */ + public int getNumBorders(int row, int col) { + return getNumBorders(new CellAddress(row, col)); + } + + /** + * Retrieves the number of border colors assigned to a cell + * + * @param cell + */ + public int getNumBorderColors(CellAddress cell) { + Map cellProperties = _propertyTemplate.get(cell); + if (cellProperties == null) { + return 0; + } + + int count = 0; + for (String property : cellProperties.keySet()) { + if (property.equals(CellUtil.TOP_BORDER_COLOR)) + count += 1; + if (property.equals(CellUtil.BOTTOM_BORDER_COLOR)) + count += 1; + if (property.equals(CellUtil.LEFT_BORDER_COLOR)) + count += 1; + if (property.equals(CellUtil.RIGHT_BORDER_COLOR)) + count += 1; + } + return count; + } + + /** + * Retrieves the number of border colors assigned to a cell + * + * @param row + * @param col + */ + public int getNumBorderColors(int row, int col) { + return getNumBorderColors(new CellAddress(row, col)); + } + + /** + * Retrieves the border style for a given cell + * + * @param cell + * @param property + */ + public short getTemplateProperty(CellAddress cell, String property) { + short value = 0; + Map cellProperties = _propertyTemplate.get(cell); + if (cellProperties != null) { + Object obj = cellProperties.get(property); + if (obj != null) { + value = getShort(obj); + } + } + return value; + } + + /** + * Retrieves the border style for a given cell + * + * @param row + * @param col + * @param property + */ + public short getTemplateProperty(int row, int col, String property) { + return getTemplateProperty(new CellAddress(row, col), property); + } + + /** + * Converts a Short object to a short value or 0 if the object is not a + * Short + * + * @param value + * @return + */ + private static short getShort(Object value) { + if (value instanceof Short) { + return ((Short) value).shortValue(); + } + return 0; + } +} diff --git a/src/testcases/org/apache/poi/ss/util/TestPropertyTemplate.java b/src/testcases/org/apache/poi/ss/util/TestPropertyTemplate.java new file mode 100644 index 000000000..6c3f0c78d --- /dev/null +++ b/src/testcases/org/apache/poi/ss/util/TestPropertyTemplate.java @@ -0,0 +1,910 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.util; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.IndexedColors; +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.PropertyTemplate.Extent; +import org.junit.Test; + +/** + * Tests Spreadsheet PropertyTemplate + * + * @see org.apache.poi.ss.util.PropertyTemplate + */ +public final class TestPropertyTemplate { + @Test + public void getNumBorders() throws IOException { + CellRangeAddress a1 = new CellRangeAddress(0, 0, 0, 0); + PropertyTemplate pt = new PropertyTemplate(); + pt.drawBorders(a1, CellStyle.BORDER_THIN, Extent.TOP); + assertEquals(1, pt.getNumBorders(0, 0)); + pt.drawBorders(a1, CellStyle.BORDER_MEDIUM, Extent.BOTTOM); + assertEquals(2, pt.getNumBorders(0, 0)); + pt.drawBorders(a1, CellStyle.BORDER_MEDIUM, Extent.NONE); + assertEquals(0, pt.getNumBorders(0, 0)); + } + + @Test + public void getNumBorderColors() throws IOException { + CellRangeAddress a1 = new CellRangeAddress(0, 0, 0, 0); + PropertyTemplate pt = new PropertyTemplate(); + pt.drawBorderColors(a1, IndexedColors.RED.getIndex(), Extent.TOP); + assertEquals(1, pt.getNumBorderColors(0, 0)); + pt.drawBorderColors(a1, IndexedColors.RED.getIndex(), Extent.BOTTOM); + assertEquals(2, pt.getNumBorderColors(0, 0)); + pt.drawBorderColors(a1, IndexedColors.RED.getIndex(), Extent.NONE); + assertEquals(0, pt.getNumBorderColors(0, 0)); + } + + @Test + public void getTemplateProperties() throws IOException { + CellRangeAddress a1 = new CellRangeAddress(0, 0, 0, 0); + PropertyTemplate pt = new PropertyTemplate(); + pt.drawBorders(a1, CellStyle.BORDER_THIN, Extent.TOP); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(0, 0, CellUtil.BORDER_TOP)); + pt.drawBorders(a1, CellStyle.BORDER_MEDIUM, Extent.BOTTOM); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(0, 0, CellUtil.BORDER_BOTTOM)); + pt.drawBorderColors(a1, IndexedColors.RED.getIndex(), Extent.TOP); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(0, 0, CellUtil.TOP_BORDER_COLOR)); + pt.drawBorderColors(a1, IndexedColors.BLUE.getIndex(), Extent.BOTTOM); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(0, 0, CellUtil.BOTTOM_BORDER_COLOR)); + } + + @Test + public void drawBorders() throws IOException { + CellRangeAddress a1c3 = new CellRangeAddress(0, 2, 0, 2); + PropertyTemplate pt = new PropertyTemplate(); + pt.drawBorders(a1c3, CellStyle.BORDER_THIN, + PropertyTemplate.Extent.ALL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(4, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.OUTSIDE); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(4, pt.getNumBorders(i, j)); + if (i == 0) { + if (j == 0) { + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } else if (j == 2) { + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } else { + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } + } else if (i == 2) { + if (j == 0) { + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } else if (j == 2) { + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } else { + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } + } else { + if (j == 0) { + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } else if (j == 2) { + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } else { + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_THIN, + pt.getTemplateProperty(i, j, + CellUtil.BORDER_RIGHT)); + } + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.TOP); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.BOTTOM); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.LEFT); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.RIGHT); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.HORIZONTAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.INSIDE_HORIZONTAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + } else if (i == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + } else { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.OUTSIDE_HORIZONTAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + } else if (i == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.VERTICAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.INSIDE_VERTICAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } else if (j == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + } else { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, + PropertyTemplate.Extent.OUTSIDE_VERTICAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + } else if (j == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, pt + .getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + } + } + } + } + + @Test + public void drawBorderColors() throws IOException { + CellRangeAddress a1c3 = new CellRangeAddress(0, 2, 0, 2); + PropertyTemplate pt = new PropertyTemplate(); + pt.drawBorderColors(a1c3, IndexedColors.RED.getIndex(), + PropertyTemplate.Extent.ALL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(4, pt.getNumBorders(i, j)); + assertEquals(4, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.RED.getIndex(), pt + .getTemplateProperty(i, j, CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), pt + .getTemplateProperty(i, j, CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.OUTSIDE); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(4, pt.getNumBorders(i, j)); + assertEquals(4, pt.getNumBorderColors(i, j)); + if (i == 0) { + if (j == 0) { + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else if (j == 2) { + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else { + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } else if (i == 2) { + if (j == 0) { + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else if (j == 2) { + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else { + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } else { + if (j == 0) { + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else if (j == 2) { + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else { + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.TOP); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.BOTTOM); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.LEFT); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.RIGHT); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.HORIZONTAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(2, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), pt + .getTemplateProperty(i, j, CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.INSIDE_HORIZONTAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + } else if (i == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + } else { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(2, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.OUTSIDE_HORIZONTAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (i == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.TOP_BORDER_COLOR)); + } else if (i == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.VERTICAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(2, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), pt + .getTemplateProperty(i, j, CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.INSIDE_VERTICAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else if (j == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + } else { + assertEquals(2, pt.getNumBorders(i, j)); + assertEquals(2, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.AUTOMATIC.getIndex(), + PropertyTemplate.Extent.NONE); + pt.drawBorderColors(a1c3, IndexedColors.BLUE.getIndex(), + PropertyTemplate.Extent.OUTSIDE_VERTICAL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (j == 0) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.LEFT_BORDER_COLOR)); + } else if (j == 2) { + assertEquals(1, pt.getNumBorders(i, j)); + assertEquals(1, pt.getNumBorderColors(i, j)); + assertEquals(IndexedColors.BLUE.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } else { + assertEquals(0, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + } + } + } + } + + @Test + public void drawBordersWithColors() throws IOException { + CellRangeAddress a1c3 = new CellRangeAddress(0, 2, 0, 2); + PropertyTemplate pt = new PropertyTemplate(); + + pt.drawBorders(a1c3, CellStyle.BORDER_MEDIUM, IndexedColors.RED.getIndex(), Extent.ALL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(4, pt.getNumBorders(i, j)); + assertEquals(4, pt.getNumBorderColors(i, j)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_MEDIUM, + pt.getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + assertEquals(IndexedColors.RED.getIndex(), pt + .getTemplateProperty(i, j, CellUtil.TOP_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.BOTTOM_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), pt + .getTemplateProperty(i, j, CellUtil.LEFT_BORDER_COLOR)); + assertEquals(IndexedColors.RED.getIndex(), + pt.getTemplateProperty(i, j, + CellUtil.RIGHT_BORDER_COLOR)); + } + } + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, Extent.NONE); + pt.drawBorders(a1c3, CellStyle.BORDER_NONE, IndexedColors.RED.getIndex(), Extent.ALL); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + assertEquals(4, pt.getNumBorders(i, j)); + assertEquals(0, pt.getNumBorderColors(i, j)); + assertEquals(CellStyle.BORDER_NONE, + pt.getTemplateProperty(i, j, CellUtil.BORDER_TOP)); + assertEquals(CellStyle.BORDER_NONE, + pt.getTemplateProperty(i, j, CellUtil.BORDER_BOTTOM)); + assertEquals(CellStyle.BORDER_NONE, + pt.getTemplateProperty(i, j, CellUtil.BORDER_LEFT)); + assertEquals(CellStyle.BORDER_NONE, + pt.getTemplateProperty(i, j, CellUtil.BORDER_RIGHT)); + } + } + } + + @Test + public void applyBorders() throws IOException { + CellRangeAddress a1c3 = new CellRangeAddress(0, 2, 0, 2); + CellRangeAddress b2 = new CellRangeAddress(1, 1, 1, 1); + PropertyTemplate pt = new PropertyTemplate(); + Workbook wb = new HSSFWorkbook(); + Sheet sheet = wb.createSheet(); + + pt.drawBorders(a1c3, CellStyle.BORDER_THIN, IndexedColors.RED.getIndex(), Extent.ALL); + pt.applyBorders(sheet); + + for (Row row: sheet) { + for (Cell cell: row) { + CellStyle cs = cell.getCellStyle(); + assertEquals(BorderStyle.THIN, cs.getBorderTop()); + assertEquals(IndexedColors.RED.getIndex(), cs.getTopBorderColor()); + assertEquals(BorderStyle.THIN, cs.getBorderBottom()); + assertEquals(IndexedColors.RED.getIndex(), cs.getBottomBorderColor()); + assertEquals(BorderStyle.THIN, cs.getBorderLeft()); + assertEquals(IndexedColors.RED.getIndex(), cs.getLeftBorderColor()); + assertEquals(BorderStyle.THIN, cs.getBorderRight()); + assertEquals(IndexedColors.RED.getIndex(), cs.getRightBorderColor()); + } + } + + pt.drawBorders(b2, CellStyle.BORDER_NONE, Extent.ALL); + pt.applyBorders(sheet); + + for (Row row: sheet) { + for (Cell cell: row) { + CellStyle cs = cell.getCellStyle(); + if (cell.getColumnIndex() != 1 || row.getRowNum() == 0) { + assertEquals(BorderStyle.THIN, cs.getBorderTop()); + assertEquals(IndexedColors.RED.getIndex(), cs.getTopBorderColor()); + } else { + assertEquals(BorderStyle.NONE, cs.getBorderTop()); + } + if (cell.getColumnIndex() != 1 || row.getRowNum() == 2) { + assertEquals(BorderStyle.THIN, cs.getBorderBottom()); + assertEquals(IndexedColors.RED.getIndex(), cs.getBottomBorderColor()); + } else { + assertEquals(BorderStyle.NONE, cs.getBorderBottom()); + } + if (cell.getColumnIndex() == 0 || row.getRowNum() != 1) { + assertEquals(BorderStyle.THIN, cs.getBorderLeft()); + assertEquals(IndexedColors.RED.getIndex(), cs.getLeftBorderColor()); + } else { + assertEquals(BorderStyle.NONE, cs.getBorderLeft()); + } + if (cell.getColumnIndex() == 2 || row.getRowNum() != 1) { + assertEquals(BorderStyle.THIN, cs.getBorderRight()); + assertEquals(IndexedColors.RED.getIndex(), cs.getRightBorderColor()); + } else { + assertEquals(BorderStyle.NONE, cs.getBorderRight()); + } + } + } + + wb.close(); + } +}