热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要为大家详细介绍了java利用注解实现简单的excel数据读取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

实现工具类

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

定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
 
 String name();

}

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

工具类完整代码如下:

public class ExcelUtil {

 Class clazz;

 public ExcelUtil(Class clazz) {
  this.clazz = clazz;
 }

 public List importExcel(String sheetName, InputStream input) {
  int maxCol = 0;
  List list = new ArrayList();
  try {
   Workbook workbook = WorkbookFactory.create(input);
   Sheet sheet = workbook.getSheet(sheetName);
   // 如果指定sheet名,则取指定sheet中的内容.
   if (!sheetName.trim().equals("")) {
    sheet = workbook.getSheet(sheetName);
   }
   // 如果传入的sheet名不存在则默认指向第1个sheet.
   if (sheet == null) {
    sheet = workbook.getSheetAt(0);
   }
   int rows = sheet.getPhysicalNumberOfRows();
   // 有数据时才处理
   if (rows > 0) {
    List allFields = getMappedFiled(clazz, null);
    // 定义一个map用于存放列的序号和field.
    Map fieldsMap = new HashMap();
    // 第一行为表头
    Row rowHead = sheet.getRow(0);
    Map cellMap = new HashMap<>();
    int cellNum = rowHead.getPhysicalNumberOfCells();
    for (int i = 0; i  fieldType = field.getType();
      if (String.class == fieldType) {
       field.set(entity, String.valueOf(c));
      } else if ((Integer.TYPE == fieldType)
        || (Integer.class == fieldType)) {
       field.set(entity, Integer.valueOf(c));
      } else if ((Long.TYPE == fieldType)
        || (Long.class == fieldType)) {
       field.set(entity, Long.valueOf(c));
      } else if ((Float.TYPE == fieldType)
        || (Float.class == fieldType)) {
       field.set(entity, Float.valueOf(c));
      } else if ((Short.TYPE == fieldType)
        || (Short.class == fieldType)) {
       field.set(entity, Short.valueOf(c));
      } else if ((Double.TYPE == fieldType)
        || (Double.class == fieldType)) {
       field.set(entity, Double.valueOf(c));
      } else if (Character.TYPE == fieldType) {
       if (c.length() > 0) {
        field.set(entity, c.charAt(0));
       }
      }
     }
     if (entity != null) {
      list.add(entity);
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return list;
 }


 /**
  * 得到实体类所有通过注解映射了数据表的字段
  *
  * @param clazz
  * @param fields
  * @return
  */
 private List getMappedFiled(Class clazz, List fields) {
  if (fields == null) {
   fields = new ArrayList();
  }
  // 得到所有定义字段
  Field[] allFields = clazz.getDeclaredFields();
  // 得到所有field并存放到一个list中.
  for (Field field : allFields) {
   if (field.isAnnotationPresent(Excel.class)) {
    fields.add(field);
   }
  }
  if (clazz.getSuperclass() != null
    && !clazz.getSuperclass().equals(Object.class)) {
   getMappedFiled(clazz.getSuperclass(), fields);
  }

  return fields;
 }


}

代码很简单,获取sheet,解析第一行,并和实体类标有注解的字段一一对应,用hashMap记录下来,然后循环取得Excel中剩下所有的数据,根据map的对应关系将值set到对应字段。

基本使用

待解析表格如下:

定义实体类:

public class User {

 @Excel(name = "filed1")
 private String name;
 @Excel(name = "filed2")
 private String nameEn;
 @Excel(name = "filed3")
 private Integer age;
 @Excel(name = "filed4")
 private String six;
 @Excel(name = "filed5")
 private String weight;

 // ...getter setter
}

使用工具类:

public static void main (String[] args) {
 FileInputStream fileInputStream = null;
 try {
  fileInputStream = new FileInputStream("D://data.xlsx");
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 ExcelUtil util = new ExcelUtil<>(User.class);
 List jalanHotelList = util.importExcel("user", fileInputStream);
 // do something
}

利用这个思路可以扩展出导出excel功能,利用注解指定导出的excel表头,甚至可以轻松控制excel表头的颜色,合并属性等等,在xdemo中有详细复杂的示例,可以研究下。由于我的需求很简单,就不整那么复杂啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
author-avatar
喵咘噜_783
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有