<>强实现工具类强>
利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及一行,这行些属性了。
定义注解:
@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.FIELD) 公共@ interface Excel { 字符串名称(); } >之前由于本例中只涉及根据Excel表头部分对Excel进行解析,只定义了一个名称作为和Excel表头的隐射。
工具类完整代码如下:
公开课ExcelUtil{ Class clazz; 公共ExcelUtil (Class clazz) { 这一点。clazz=clazz; } 公共List importExcel (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){ List allFields=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 */私人List getMappedFiled(类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数据读取