in extensions/core/excel/applib/src/main/java/org/apache/causeway/extensions/excel/applib/service/_CellMarshaller.java [329:482]
private <T> T getCellValue(final Cell cell, final Class<T> requiredType) {
final CellType cellType = cell.getCellType();
if(requiredType == boolean.class || requiredType == Boolean.class) {
if(cellType == CellType.BOOLEAN) {
boolean booleanCellValue = cell.getBooleanCellValue();
return (T) Boolean.valueOf(booleanCellValue);
} else {
return null;
}
}
// enum
if(Enum.class.isAssignableFrom(requiredType)) {
String stringCellValue = cell.getStringCellValue();
@SuppressWarnings("rawtypes")
Class rawType = requiredType;
return (T) Enum.valueOf(rawType, stringCellValue);
}
// date
if(requiredType == java.util.Date.class) {
java.util.Date dateCellValue = cell.getDateCellValue();
return (T) dateCellValue;
}
// if(requiredType == org.apache.causeway.applib.value.Date.class) {
// java.util.Date dateCellValue = cell.getDateCellValue();
// return (T)new org.apache.causeway.applib.value.Date(dateCellValue);
// }
// if(requiredType == org.apache.causeway.applib.value.DateTime.class) {
// java.util.Date dateCellValue = cell.getDateCellValue();
// return (T)new org.apache.causeway.applib.value.DateTime(dateCellValue);
// }
if(requiredType == LocalDate.class) {
java.util.Date dateCellValue = cell.getDateCellValue();
return (T) new LocalDate(dateCellValue.getTime());
}
if(requiredType == LocalDateTime.class) {
java.util.Date dateCellValue = cell.getDateCellValue();
return (T) new LocalDateTime(dateCellValue.getTime());
}
if(requiredType == DateTime.class) {
java.util.Date dateCellValue = cell.getDateCellValue();
return (T) new DateTime(dateCellValue.getTime());
}
// number
if(requiredType == double.class || requiredType == Double.class) {
if(cellType == CellType.NUMERIC) {
double doubleValue = cell.getNumericCellValue();
return (T) Double.valueOf(doubleValue);
} else {
return null;
}
}
if(requiredType == float.class || requiredType == Float.class) {
if(cellType == CellType.NUMERIC) {
float floatValue = (float)cell.getNumericCellValue();
return (T) Float.valueOf(floatValue);
} else {
return null;
}
}
if(requiredType == BigDecimal.class) {
if(cellType == CellType.NUMERIC) {
double doubleValue = cell.getNumericCellValue();
return (T) BigDecimal.valueOf(doubleValue);
} else {
return null;
}
}
if(requiredType == BigInteger.class) {
if(cellType == CellType.NUMERIC) {
long longValue = (long)cell.getNumericCellValue();
return (T) BigInteger.valueOf(longValue);
} else {
return null;
}
}
if(requiredType == long.class || requiredType == Long.class) {
if(cellType == CellType.NUMERIC) {
long longValue = (long) cell.getNumericCellValue();
return (T) Long.valueOf(longValue);
} else {
return null;
}
}
if(requiredType == int.class || requiredType == Integer.class) {
if(cellType == CellType.NUMERIC) {
int intValue = (int) cell.getNumericCellValue();
return (T) Integer.valueOf(intValue);
} else {
return null;
}
}
if(requiredType == short.class || requiredType == Short.class) {
if(cellType == CellType.NUMERIC) {
short shortValue = (short) cell.getNumericCellValue();
return (T) Short.valueOf(shortValue);
} else {
return null;
}
}
if(requiredType == byte.class || requiredType == Byte.class) {
if(cellType == CellType.NUMERIC) {
byte byteValue = (byte) cell.getNumericCellValue();
return (T) Byte.valueOf(byteValue);
} else {
return null;
}
}
if(requiredType == String.class) {
if(cellType == CellType.STRING) {
return (T) cell.getStringCellValue();
} else if(cellType == CellType.NUMERIC) {
/*
* In some cases, when editing a string type cell in excel and
* when the cell content is just a number excel will silently
* convert the cell type to numeric. To remedy unexpected
* behavior we check whether we can recover numeric cells as
* text, accounting for the fact that an integer number is
* also stored with a floating point in excel, whereby
* a textual representation as such may be undesired.
*
* @ see https://stackoverflow.com/questions/9898512/how-to-test-if-a-double-is-an-integer
* @see https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#floor-double-
* - If the argument value is already equal to a mathematical integer, then the result is the same as the argument.
* - If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument.
*/
double val = cell.getNumericCellValue();
if((val == Math.floor(val)) && !Double.isInfinite(val)) {
return (T) Integer.toString((int) val);
}
return (T) Double.toString(val);
} else {
return null;
}
}
return null;
}