最近正在做OA,需求需要导入导出EXCEL ,功能和方法使用起来挺简单,做起来发现类型问题比较坑,自己稍微封装了一下,
大致功能就是 通过传入实体类的class对象和 Sheet 工作簿对象获取 从Excel文件中获取,实体类集合。
excel2003的.xls格式 对应是HSSFCell,而之后的xlsx对应的则是XSSFCell,但是他们都继承于Cell,所以使用Cell就可以使用两种格式的excel导入了
对于不想导入的字段
自定义一个注解,在实体类中的属性上标注,相应的Excel中也不该有该字段 有一点不好的是:excel中字段顺序需要和实体类中属性顺序一致,且有自定义注解的属性不应该出现在Excel中 有时间我会对扩展性和通用性做进一步封装和处理
这里 注解名为NoExport 是因为之前写导出的时候命名,额 就没有改了
自定义标签
/**
* 自定义标签 : 标注了的对象不导出导入
* @author huang
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @
interface NoExport {
}
使用
@RequestMapping("/XXXXX"
)
public String includeEmp(MultipartFile multfile )
throws Exception {
try {
//自己封装的 导入功能类
ImportExcel ie =
new ImportExcel();
POIFSFileSystem fs =
new POIFSFileSystem(multfile.getInputStream());
HSSFWorkbook wb =
new HSSFWorkbook(fs);
//获取导入的员工集合
List<Employee> emplist =
new ArrayList<>
();
if ( wb.getSheet("Employee表")!=
null ) {
emplist = (List<Employee>) ie.getListBySheet(wb.getSheet("Employee表"), Employee.
class);
}
List<Department> deplist =
new ArrayList<>
();
//获取导入的职工的集合
if ( wb.getSheet("Department表")!=
null ) {
deplist = (List<Department>) ie.getListBySheet(wb.getSheet("Department表"), Department.
class);
}
}
导入功能类
方式一:根据实体类的 Field 的类型来判断处理方式二:根据Cell 类型 判断处理
单元格类型 描述 CELL_TYPE_BLANK 代表空白单元格 CELL_TYPE_BOOLEAN 代表布尔单元(true或false) CELL_TYPE_ERROR 表示在单元的误差值 CELL_TYPE_FORMULA 表示一个单元格公式的结果 CELL_TYPE_NUMERIC 表示对一个单元的数字数据 CELL_TYPE_STRING 表示对一个单元串(文本)
public class ImportExcel {
//通过工作簿 Sheet 获取对象的List集合
public List<?> getListBySheet( Sheet sheet,Class<?>
clas ) {
List<Object> list =
new ArrayList<>
();
Row rowtitle = sheet.getRow(0);
//获得表头行
//列数
int colums =
rowtitle.getPhysicalNumberOfCells();
//表头信息
List<String> title =
new ArrayList<>
();
for (
int i = 0 ; i < colums ; i++
) {
title.add( rowtitle.getCell(i).toString() );
}
// 得到总行数
int rows =
sheet.getLastRowNum();
for (
int i = 1 ; i <= rows ; i ++
) {
try {
Row row =
sheet.getRow(i);
Object t =
clas.newInstance();
Field []fields =
clas.getDeclaredFields();
//通过 k 来处理Excel中对应属性和实体类中的不一致问题
for (
int j=0,k=0; j < fields.length ; j++,k++
) {
Field field =
fields[j];
field.setAccessible(true);
//有 NoExport 注解的 则让k-- ,保证不会有空列
if ( field.getAnnotation(NoExport.
class) !=
null ){
k--
;
continue;
}
if ( row ==
null ) {
break;
}
Cell cell =
row.getCell(k);
switch (cell.getCellType()) {
//数值类型
case Cell.CELL_TYPE_NUMERIC:{
// Date类型
if ( HSSFDateUtil.isCellDateFormatted(cell) ){
Date date =
HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
if ( field.getType()==Date.
class ) {
//Date 类型接收 Date类型
field.set ( t,date );
}else if ( field.getType()==String.
class ) {
//String 类型 接收 Date类型
field.set ( t ,
new SimpleDateFormat("yyyy-MM-dd"
).parse(cell.getStringCellValue() ) );
}
} else {
//纯数值
if ( field.getType()==Integer.
class ) {
//Integer 类型接收 纯数值
String str =
cell.toString();
//去掉 结尾为.0的情况 正常小数 不会去掉有精度意义的小数
if ( str!=
null && !""
.equals(str.trim()) ) {
String []strs = str.split("\\."
);
if ( strs.length > 1 && "0".equals(strs[1
]) ) {
str=strs[0
];
}
}
field.set(t, Integer.parseInt(str) ) ;
} else if ( field.getType()==String.
class ) {
//String 类型接收 纯数值
field.set(t, String.valueOf( cell.getNumericCellValue() ) ) ;
}
}
break;
}
// 字符串类型
case Cell.CELL_TYPE_STRING : {
if ( field.getType() == Date.
class ) {
//Data类型接收String
Date date =
new SimpleDateFormat("yyyy-MM-dd"
).parse(cell.getStringCellValue());
field.set(t,date);
} else if ( field.getType()==Integer.
class ) {
//Integer 类型接收 String
field.set(t,Integer.parseInt(cell.getStringCellValue()));
} else {
field.set(t,cell.getStringCellValue());
}
break;
}
//空值的情况 可以抛异常 也可以 设空值
case Cell.CELL_TYPE_BLANK : {
field.set(t,null);
break;
}
}
//以下 为 以实体类中 属性为基准
// if ( row.getCell(k)==null ){
// field.set(t, null);
// }else {
// if ( field.getType()==Integer.class ){
// if ( cell.getCellType()==HSSFCell.CELL_TYPE_STRING ) {
// field.set(t, Integer.parseInt( cell.getStringCellValue() ) ) ;
// }
// if ( cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC ) {
// field.set(t, Integer.valueOf((int) (cell.getNumericCellValue()) )) ;
// }
// }else if ( field.getType()==Date.class ) {
// if ( cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC ){
// field.set(t, HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
// }
// if ( cell.getCellType()==HSSFCell.CELL_TYPE_STRING ) {
// field.set(t, new SimpleDateFormat("yyyy-MM-dd").parse(cell.getStringCellValue()) );
// }
// }else {
// String str = cell.toString();
// //去掉 结尾为.0的情况 正常小数 不会去掉有精度意义的小数
// if ( str!=null && !"".equals(str.trim()) ) {
// String []strs = str.split("\\.");
// if ( strs.length > 1 && "0".equals(strs[1]) ) {
// str=strs[0];
// }
// }
// }
// }
}
list.add(t);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
}
转载于:https://www.cnblogs.com/huangjianlong/p/7861488.html