在做poi导出excel肯定会有这么一段代码如下:
public Cell addCell(Row row, int column, Object val, int align, Class<?> fieldType){
Cell cell = row.createCell(column);
CellStyle style1 = styles.get("data"+(align>=1&&align<=3?align:""));
CellStyle style = wb.createCellStyle();
style.cloneStyleFrom(style1);
try {
if (val == null){
cell.setCellValue("");
} else if (val instanceof String) {
cell.setCellValue((String) val);
} else if (val instanceof Integer) {
cell.setCellValue((Integer) val);
} else if (val instanceof Long) {
cell.setCellValue((Long) val);
} else if (val instanceof Double) {
cell.setCellValue((Double) val);
} else if (val instanceof Float) {
cell.setCellValue((Float) val);
} else if (val instanceof Date) {
DataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("yyyy/MM/dd"));
cell.setCellValue((Date) val);
} else if (val instanceof BigDecimal) {
double doubleVal = ((BigDecimal) val).doubleValue();
DataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("¥#,##0.00"));
cell.setCellValue(doubleVal);
}else {
if (fieldType != Class.class){
cell.setCellValue((String)fieldType.getMethod("setValue", Object.class).invoke(null, val));
}else{
cell.setCellValue((String)Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
"fieldtype."+val.getClass().getSimpleName()+"Type")).getMethod("setValue", Object.class).invoke(null, val));
}
}
} catch (Exception ex) {
log.info("Set cell value ["+row.getRowNum()+","+column+"] error: " + ex.toString());
cell.setCellValue(val.toString());
}
cell.setCellStyle(style);
return cell;
}
注意其中BigDecimal数据类型的转换方法
else if (val instanceof BigDecimal) {
/*
* 最初的val是没有类型的需要强转,既然强转为什么不直接转成Double类型,而是这样转成BigDecimal类型,
* 再用doubleValue方法转呢,完全可以这样做double doubleVal = (Double)val;在编译的时候不会报错,
* 运行时候会抱异常 java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Double
* 经实践还是用下面的代码才可以导出的数据上面没有小三角。
*/
double doubleVal = ((BigDecimal) val).doubleValue();
DataFormat format = wb.createDataFormat();
//此格式是货币格式
style.setDataFormat(format.getFormat("¥#,##0.00"));
//最终必须接收一个double类型的数据
cell.setCellValue(doubleVal);