最近正在做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; } }