java利用注解实现简单的excel数据读取

  

<>强实现工具类
  

  

利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及一行,这行些属性了。

  

定义注解:

        @Retention (RetentionPolicy.RUNTIME)   @Target (ElementType.FIELD)   公共@ interface Excel {      字符串名称();      }      之前      

由于本例中只涉及根据Excel表头部分对Excel进行解析,只定义了一个名称作为和Excel表头的隐射。

  

工具类完整代码如下:

        公开课ExcelUtil{      Classclazz;      公共ExcelUtil (Classclazz) {   这一点。clazz=clazz;   }      公共ListimportExcel (String sheetName, InputStream输入){   int maxCol=0;   List列表=new ArrayList ();   尝试{   工作簿工作簿=WorkbookFactory.create(输入);   单表=workbook.getSheet (sheetName);//如果指定表名,则取指定表中的内容。   如果(! sheetName.trim () .equals (" ")) {   表=workbook.getSheet (sheetName);   }//如果传入的表名不存在则默认指向第1个表。   如果(表==null) {   表=workbook.getSheetAt (0);   }   int行=sheet.getPhysicalNumberOfRows ();//有数据时才处理   如果(行比;0){   ListallFields=getMappedFiled (clazz, null);//定义一个地图用于存放列的序号和字段。   Field> Map<整数;fieldsMap=new HashMap<整数,Field> ();//第一行为表头   行rowHead=sheet.getRow (0);   Integer> Map<字符串;,cellMap=new HashMap<的在();   int cellNum=rowHead.getPhysicalNumberOfCells ();   for (int i=0;我& lt;cellNum;我+ +){   .toLowerCase cellMap.put (rowHead.getCell (i) .getStringCellValue () (), i);   }   字段(字段:allFields) {//将有注解的领域存放到映射中。   如果(field.isAnnotationPresent (Excel.class)) {   Excel attr=field.getAnnotation (Excel.class);//根据名字来获取相应的失败   .toLowerCase int坳=cellMap.get (attr.name () ());   field.setAccessible(真正的);   fieldsMap。把(坳、字段);   }   }//从第2行开始取数据   for (int i=1;我& lt;行;我+ +){   行一行=sheet.getRow(我);   T实体=零;   for (int j=0;j & lt;cellNum;j + +) {   细胞细胞=row.getCell (j);   如果(细胞==null) {   继续;   }   int cellType=cell.getCellType ();   字符串c=" ";   如果(cellType==HSSFCell.CELL_TYPE_NUMERIC) {   DecimalFormat df=new DecimalFormat (“0”);   c=df.format (cell.getNumericCellValue ());   }else if (cellType==HSSFCell.CELL_TYPE_BOOLEAN) {   c=String.valueOf (cell.getBooleanCellValue ());   其他}{   c=cell.getStringCellValue ();   }   如果(c==null | | c.equals (" ")) {   继续;   }   实体=(实体==null & # 63;clazz.newInstance():实体);//从地图中得到对应列的字段。   字段字段=fieldsMap.get (j);   如果(字段==null) {   继续;   }//取得类型,并根据对象类型设置值。   Class<& # 63;比;fieldType=field.getType ();   如果字符串。类==fieldType) {   字段。集(实体,String.valueOf (c));   }如果(整数。类型==fieldType)   | |(整数。类==fieldType)) {   字段。集(实体,Integer.valueOf (c));   }else if(长。类型==fieldType)   | |(长。类==fieldType)) {   字段。集(实体,Long.valueOf (c));   }else if(浮动。类型==fieldType)   | |(浮动。类==fieldType)) {   字段。集(实体,Float.valueOf (c));   }else if(短。类型==fieldType)   | |(短。类==fieldType)) {   字段。集(实体,Short.valueOf (c));   }else if(翻倍。类型==fieldType)   | |(双。类==fieldType)) {   字段。集(实体,Double.valueOf (c));   }如果(字符。类型==fieldType) {   如果(c.length()在0){   字段。集(实体,c.charAt (0));   }   }   }   如果(实体!=null) {   list.add(实体);   }   }   }   }捕捉(异常e) {   e.printStackTrace ();   }   返回列表;   }/* *   *得到实体类所有通过注解映射了数据表的字段   *   * @param clazz   * @param字段   * @return   */私人ListgetMappedFiled(类clazz List字段){   如果(字段==null) {   字段=new ArrayList ();   }//得到所有定义字段   场[]allFields=clazz.getDeclaredFields ();//得到所有字段并存放到一个列表中。   字段(字段:allFields) {   如果(field.isAnnotationPresent (Excel.class)) {   fields.add(领域);   }   }   如果(clazz.getSuperclass () !=null   ,,! clazz.getSuperclass () .equals (Object.class)) {   getMappedFiled (clazz.getSuperclass()、字段);   }      返回字段;   }         }      

java利用注解实现简单的excel数据读取