poi 导入Excel封装 并处理数据类型

来源:互联网 发布:mac安装win10镜像 编辑:程序博客网 时间:2024/06/05 02:23

最近正在做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;    }}
原创粉丝点击