excel导入到处
- 很多项目中有读excel的处理,原来有些也没有提出来,这个事情没人做,just so
- 开源的有不少,代码写的并不好,功能不全面
- 花了两个小时写了fastexcel工具包
功能建议
excel读取到list中
- list中map,可以直接序列号成json,入库;类似补充信息,前端直接渲染json格式展示,非结构数据
- list中为java对象,需要添加注解
public class ExcelHelper {
/**
* 读取流 输出map类型[看用于excel转换直接入库json数据]
*
* @param in
* @return
*/
public static List<Map<String, String>> read(InputStream in) {
return ReadUtils.read(in);
}
/**
* 读取流 输出类
*
* @param in
* @param tClass
* @param <T>
* @return
*/
public static <T> List<T> read(InputStream in, Class<T> tClass) {
return ReadUtils.read(in, tClass);
}
- 小细节很多: 反射加缓存,值的判断,注释功能可多可少慢慢优化
- 反射setvalue
private static Object getValueByCell(TypeToken typeToken, Cell cell, FieldInfo fieldInfo) throws ParseException {
// 转包装类型
Class typeClass
= typeToken.isPrimitive() ? ClassUtils.primitiveToWrapper(typeToken.getRawType()) : typeToken.getRawType();
if (typeClass.isAssignableFrom(String.class)) {
return StringUtils.trimToEmpty(cell.getStringCellValue());
}
// 日期
if (typeClass.isAssignableFrom(Date.class)) {
// 日期格式
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
return cell.getDateCellValue();
}
cell.setCellType(Cell.CELL_TYPE_STRING);
return DateUtils.parseDate(cell.getStringCellValue(), fieldInfo.getFormat());
}
if (typeClass.isAssignableFrom(Boolean.class)) {
if (Cell.CELL_TYPE_BOOLEAN == cell.getCellType()) {
return cell.getBooleanCellValue();
}
return cell.getStringCellValue().equalsIgnoreCase("true") || (!cell.getStringCellValue().equals("0"));
}
if (typeClass.isAssignableFrom(Integer.class)) {
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
return Double.valueOf(cell.getNumericCellValue()).intValue();
}
return Integer.valueOf(cell.getStringCellValue());
}
if (typeClass.isAssignableFrom(Long.class)) {
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
return Double.valueOf(cell.getNumericCellValue()).longValue();
}
return Long.valueOf(cell.getStringCellValue());
}
if (typeClass.isAssignableFrom(Double.class)) {
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
return cell.getNumericCellValue();
}
return Double.valueOf(cell.getStringCellValue());
}
if (typeClass.isAssignableFrom(BigDecimal.class)) {
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
return new BigDecimal(cell.getNumericCellValue());
}
return new BigDecimal(cell.getStringCellValue());
}
cell.setCellType(Cell.CELL_TYPE_STRING);
String cellValue = cell.getStringCellValue();
return StringUtils.trimToEmpty(cellValue);
}
后期功能,导出到文件,导出到浏览器直接下载等
性能测试