使用poi导入excel并封装成JavaBean
因为需求原因,最近在做一个excel导入并封装成JavaBean 来实现批量导入的功能。并实现字段的对应,不多废话,直接上代码。
1、所需依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.8</version>
</dependency>
2、工具类
in是导入的excel的流,clazz是要封装的JavaBean的了类型,execlHeads里key的值为excel里的表头名,value的值为JavaBean的字段,dataString为日期的格式
public static <T>List<T> excelToList(InputStream in,Class<T> clazz,Map<String,String> excelHeads,String dateString) throws Exception {
List<T> list = new ArrayList<>();
XSSFWorkbook sheets = new XSSFWorkbook(in);
Row head = null;
for (XSSFSheet sheet : sheets) {
for (Row row : sheet) {
if (row.getRowNum()==0){
head = row;
continue;
}
int number = row.getPhysicalNumberOfCells();
T t = clazz.getConstructor().newInstance();
for (int i = 0; i <number; i++) {
String stringCellValue = head.getCell(i).getStringCellValue();
String beanFieldName = excelHeads.get(stringCellValue);//获得对应的字段名
Field field = t.getClass().getDeclaredField(beanFieldName);//获取字段
field.setAccessible(true);
Cell cell = row.getCell(i);//获取单元格
if (cell==null){
number++;
continue;
}
Class<?> type = field.getType();//
if (type.equals(String.class)){
field.set(t, getCellValue(cell));
}else if (type.equals(Integer.class)){
field.set(t, Integer.valueOf(getCellValue(cell)));
}else if (type.equals(Long.class.getName())){
field.set(t,Long.valueOf(getCellValue(cell)));
}else if (type.equals(Float.class)){
field.set(t, Float.valueOf(getCellValue(cell)));
}else if (type.equals(Double.class)){
field.set(t, Double.valueOf(getCellValue(cell)));
}else if (type.equals(Byte.class)){
field.set(t, Byte.valueOf(getCellValue(cell)));
}else if (type.equals(Boolean.class)){
field.set(t, Boolean.valueOf(getCellValue(cell)));
}else if (type.equals(Date.class)){
SimpleDateFormat sdf = new SimpleDateFormat(dateString);
Date date=null;
try {
date=sdf.parse(getCellValue(cell));
} catch (Exception e) {
e.printStackTrace();
}
field.set(t, date);
}else {
field.set(t, getCellValue(cell));
}
}
list.add(t);
}
}
return list;
}
private static String getCellValue(Cell cell) {
Object result = "";
if (cell != null) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
result = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date theDate = cell.getDateCellValue();
SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
result = dff.format(theDate);
}else{
DecimalFormat df = new DecimalFormat("0");
result = df.format(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
result = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_FORMULA:
result = cell.getCellFormula();
break;
case Cell.CELL_TYPE_ERROR:
result = cell.getErrorCellValue();
break;
case Cell.CELL_TYPE_BLANK:
break;
default:
break;
}
}
return result.toString();
}
测试结果