package net.sf.jxls; import junit.framework.Assert; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @author Leonid Vysochyn */ public class CellsChecker extends Assert { Map propertyMap = new HashMap(); public CellsChecker() { } boolean ignoreStyle = false; boolean ignoreFirstLastCellNums = false; public CellsChecker(Map propertyMap) { this.propertyMap = propertyMap; } public CellsChecker(Map propertyMap, boolean ignoreStyle) { this.propertyMap = propertyMap; this.ignoreStyle = ignoreStyle; } public boolean isIgnoreFirstLastCellNums() { return ignoreFirstLastCellNums; } public void setIgnoreFirstLastCellNums(boolean ignoreFirstLastCellNums) { this.ignoreFirstLastCellNums = ignoreFirstLastCellNums; } void checkSection(Sheet srcSheet, Sheet destSheet, int srcRowNum, int destRowNum, short fromCellNum, short toCellNum, int numberOfRows, boolean ignoreHeight, boolean ignoreNullRows) { for (int i = 0; i < numberOfRows; i++) { Row sourceRow = srcSheet.getRow(srcRowNum + i); Row destRow = destSheet.getRow(destRowNum + i); if (!ignoreNullRows) { assertTrue("Null Row problem found", (sourceRow != null && destRow != null) || (sourceRow == null && destRow == null)); if (sourceRow != null) { if (!ignoreHeight) { assertEquals("Row height is not the same", sourceRow.getHeight(), destRow.getHeight()); } checkCells(sourceRow, destRow, fromCellNum, toCellNum); } } else { if (!ignoreHeight) { assertEquals("Row height is not the same", sourceRow.getHeight(), destRow.getHeight()); } if (sourceRow == null && destRow != null) { checkEmptyCells(destRow, fromCellNum, toCellNum); } if (destRow == null && sourceRow != null) { checkEmptyCells(sourceRow, fromCellNum, toCellNum); } if (sourceRow != null && destRow != null) { checkCells(sourceRow, destRow, fromCellNum, toCellNum); } } } } void checkRow(Sheet sheet, int rowNum, int startCellNum, int endCellNum, Object[] values){ Row row = sheet.getRow(rowNum); if( row != null){ for(int i = startCellNum; i<=endCellNum; i++){ Cell cell = row.getCell(i); if( cell != null ){ Object cellValue = getCellValue(cell, values[i]); assertEquals("Result cell values incorrect in row=" + row + ", cell=" + i, values[i], cellValue); }else{ fail("Cell is null"); } } }else{ fail("Row is null"); } } void checkCell(Sheet sheet, int rowNum, int cellNum, Object value){ Row row = sheet.getRow(rowNum); if( row != null){ Cell cell = row.getCell(cellNum); if( cell != null ){ Object cellValue = getCellValue(cell, value); assertEquals("Result cell values incorrect in row=" + row + ", cell=" + cellNum, value, cellValue); }else{ fail("Cell is null"); } }else{ fail("Row is null"); } } private void checkEmptyCells(Row destRow, short fromCellNum, short toCellNum) { if (destRow != null) { for (short i = fromCellNum; i <= toCellNum; i++) { assertNull("Cell " + i + " in " + destRow.getRowNum() + " row is not null", destRow.getCell(i)); } } } void checkListCells(Sheet srcSheet, int srcRowNum, Sheet sheet, int startRowNum, short cellNum, Object[] values) { Row srcRow = srcSheet.getRow(srcRowNum); Cell srcCell = srcRow.getCell(cellNum); for (int i = 0; i < values.length; i++) { Row row = sheet.getRow(startRowNum + i); Cell cell = row.getCell(cellNum); Object cellValue = getCellValue(cell, values[i]); assertEquals("List property cell is incorrect", values[i], cellValue); checkCellStyle(srcCell.getCellStyle(), cell.getCellStyle()); } } void checkFixedListCells(Sheet srcSheet, int srcRowNum, Sheet destSheet, int startRowNum, short cellNum, Object[] values) { for (int i = 0; i < values.length; i++) { Row srcRow = srcSheet.getRow(srcRowNum); Cell srcCell = srcRow.getCell(cellNum); Row destRow = destSheet.getRow(startRowNum + i); Cell destCell = destRow.getCell(cellNum); Object cellValue = getCellValue(destCell, values[i]); assertEquals("List property cell is incorrect", values[i], cellValue); checkCellStyle(srcCell.getCellStyle(), destCell.getCellStyle()); } } void checkFormulaCell(Sheet sheet, int rowNum, int cellNum, String formula){ Row row = sheet.getRow(rowNum); Cell cell = row.getCell(cellNum); assertEquals("Result Cell is not a formula", cell.getCellType(), Cell.CELL_TYPE_FORMULA); assertEquals("Formula is incorrect", formula, cell.getCellFormula()); } void checkFormulaCell(Sheet srcSheet, int srcRowNum, Sheet destSheet, int destRowNum, short cellNum, String formula) { Row srcRow = srcSheet.getRow(srcRowNum); Cell srcCell = srcRow.getCell(cellNum); Row destRow = destSheet.getRow(destRowNum); Cell destCell = destRow.getCell(cellNum); checkCellStyle(srcCell.getCellStyle(), destCell.getCellStyle()); assertEquals("Result Cell is not a formula", destCell.getCellType(), Cell.CELL_TYPE_FORMULA); assertEquals("Formula is incorrect", formula, destCell.getCellFormula()); } void checkFormulaCell(Sheet srcSheet, int srcRowNum, Sheet destSheet, int destRowNum, short cellNum, String formula, boolean ignoreCellStyle) { Row srcRow = srcSheet.getRow(srcRowNum); Cell srcCell = srcRow.getCell(cellNum); Row destRow = destSheet.getRow(destRowNum); Cell destCell = destRow.getCell(cellNum); if (!ignoreCellStyle) { checkCellStyle(srcCell.getCellStyle(), destCell.getCellStyle()); } assertEquals("Result Cell is not a formula", destCell.getCellType(), Cell.CELL_TYPE_FORMULA); assertEquals("Formula is incorrect", formula, destCell.getCellFormula()); } void checkRows(Sheet sourceSheet, Sheet destSheet, int sourceRowNum, int destRowNum, int numberOfRows, boolean checkRowHeight) { for (int i = 0; i < numberOfRows; i++) { Row sourceRow = sourceSheet.getRow(sourceRowNum + i); Row destRow = destSheet.getRow(destRowNum + i); assertTrue("Null Row problem found", (sourceRow != null && destRow != null) || (sourceRow == null && destRow == null)); if (sourceRow != null && destRow != null) { if (!ignoreFirstLastCellNums) { assertEquals("First Cell Numbers differ in source and result row", sourceRow.getFirstCellNum(), destRow.getFirstCellNum()); } assertEquals("Physical Number Of Cells differ in source and result row", sourceRow.getPhysicalNumberOfCells(), destRow.getPhysicalNumberOfCells()); if( checkRowHeight ){ assertEquals("Row height is not the same for srcRow = " + sourceRow.getRowNum() + ", destRow = " + destRow.getRowNum(), sourceRow.getHeight(), destRow.getHeight()); } checkCells(sourceRow, destRow, sourceRow.getFirstCellNum(), sourceRow.getLastCellNum()); } } } private void checkCells(Row sourceRow, Row resultRow, short startCell, short endCell) { if (startCell >= 0 && endCell >= 0) { for (short i = startCell; i <= endCell; i++) { Cell sourceCell = sourceRow.getCell(i); Cell resultCell = resultRow.getCell(i); assertTrue("Null cell problem found", (sourceCell != null && resultCell != null) || (sourceCell == null && resultCell == null)); if (sourceCell != null) { checkCells(sourceCell, resultCell); } } } } void checkCells(Sheet srcSheet, Sheet destSheet, int srcRowNum, short srcCellNum, int destRowNum, short destCellNum, boolean checkCellWidth) { Row srcRow = srcSheet.getRow(srcRowNum); Row destRow = destSheet.getRow(destRowNum); assertEquals("Row height is not the same", srcRow.getHeight(), destRow.getHeight()); Cell srcCell = srcRow.getCell(srcCellNum); Cell destCell = destRow.getCell(destCellNum); assertTrue("Null cell problem found", (srcCell != null && destCell != null) || (srcCell == null && destCell == null)); if (srcCell != null && destCell != null) { checkCells(srcCell, destCell); } if (checkCellWidth) { assertEquals("Cell Widths are different", getWidth(srcSheet, srcCellNum), getWidth(destSheet, destCellNum)); } } static int getWidth(Sheet sheet, int col) { int width = sheet.getColumnWidth(col); if (width == sheet.getDefaultColumnWidth()) { width = (short) (width * 256); } return width; } private void checkCells(Cell sourceCell, Cell destCell) { checkCellValue(sourceCell, destCell); checkCellStyle(sourceCell.getCellStyle(), destCell.getCellStyle()); } private void checkCellStyle(CellStyle sourceStyle, CellStyle destStyle) { if (!ignoreStyle) { assertEquals(sourceStyle.getAlignment(), destStyle.getAlignment()); assertEquals(sourceStyle.getBorderBottom(), destStyle.getBorderBottom()); assertEquals(sourceStyle.getBorderLeft(), destStyle.getBorderLeft()); assertEquals(sourceStyle.getBorderRight(), destStyle.getBorderRight()); assertEquals(sourceStyle.getBorderTop(), destStyle.getBorderTop()); assertEquals(sourceStyle.getBottomBorderColor(), sourceStyle.getBottomBorderColor()); assertEquals(sourceStyle.getFillBackgroundColor(), destStyle.getFillBackgroundColor()); assertEquals(sourceStyle.getFillForegroundColor(), sourceStyle.getFillForegroundColor()); assertEquals(sourceStyle.getFillPattern(), destStyle.getFillPattern()); assertEquals(sourceStyle.getHidden(), destStyle.getHidden()); assertEquals(sourceStyle.getIndention(), destStyle.getIndention()); assertEquals(sourceStyle.getLeftBorderColor(), destStyle.getLeftBorderColor()); assertEquals(sourceStyle.getLocked(), destStyle.getLocked()); assertEquals(sourceStyle.getRightBorderColor(), destStyle.getRightBorderColor()); assertEquals(sourceStyle.getRotation(), destStyle.getRotation()); assertEquals(sourceStyle.getTopBorderColor(), destStyle.getTopBorderColor()); assertEquals(sourceStyle.getVerticalAlignment(), destStyle.getVerticalAlignment()); assertEquals(sourceStyle.getWrapText(), destStyle.getWrapText()); } } private void checkCellValue(Cell sourceCell, Cell destCell) { switch (sourceCell.getCellType()) { case Cell.CELL_TYPE_STRING: if (propertyMap.containsKey(sourceCell.getRichStringCellValue().getString())) { assertEquals("Property value was set incorrectly", propertyMap.get(sourceCell.getRichStringCellValue().getString()), getCellValue(destCell, propertyMap.get(sourceCell.getRichStringCellValue().getString()))); } else { assertEquals("Cell type is not the same", sourceCell.getCellType(), destCell.getCellType()); assertEquals("Cell values are not the same", sourceCell.getRichStringCellValue().getString(), destCell.getRichStringCellValue().getString()); } break; case Cell.CELL_TYPE_NUMERIC: assertEquals("Cell type is not the same", sourceCell.getCellType(), destCell.getCellType()); assertTrue("Cell values are not the same", sourceCell.getNumericCellValue() == destCell.getNumericCellValue()); break; case Cell.CELL_TYPE_BOOLEAN: assertEquals("Cell type is not the same", sourceCell.getCellType(), destCell.getCellType()); assertEquals("Cell values are not the same", sourceCell.getBooleanCellValue(), destCell.getBooleanCellValue()); break; case Cell.CELL_TYPE_ERROR: assertEquals("Cell type is not the same", sourceCell.getCellType(), destCell.getCellType()); assertEquals("Cell values are not the same", sourceCell.getErrorCellValue(), destCell.getErrorCellValue()); break; case Cell.CELL_TYPE_FORMULA: assertEquals("Cell type is not the same", sourceCell.getCellType(), destCell.getCellType()); assertEquals("Cell values are not the same", sourceCell.getCellFormula(), destCell.getCellFormula()); break; case Cell.CELL_TYPE_BLANK: assertEquals("Cell type is not the same", sourceCell.getCellType(), destCell.getCellType()); break; default: fail("Unknown cell type, code=" + sourceCell.getCellType() + ", value=" + sourceCell.getRichStringCellValue().getString()); break; } } private Object getCellValue(Cell cell, Object obj) { Object value = null; if (obj instanceof String) { value = cell.getRichStringCellValue().getString(); } else if (obj instanceof Double) { value = new Double(cell.getNumericCellValue()); } else if (obj instanceof BigDecimal) { value = new BigDecimal(cell.getNumericCellValue()); } else if (obj instanceof Integer) { value = new Integer((int) cell.getNumericCellValue()); } else if (obj instanceof Float) { value = new Float(cell.getNumericCellValue()); } else if (obj instanceof Date) { value = cell.getDateCellValue(); } else if (obj instanceof Calendar) { Calendar c = Calendar.getInstance(); c.setTime(cell.getDateCellValue()); value = c; } else if (obj instanceof Boolean) { if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { value = (cell.getBooleanCellValue()) ? Boolean.TRUE : Boolean.FALSE; } else if (cell.getCellType() == Cell.CELL_TYPE_STRING) { value = Boolean.valueOf(cell.getRichStringCellValue().getString()); } else { value = Boolean.FALSE; } } return value; } }