一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java利用注解實現簡單的excel數據讀取

java利用注解實現簡單的excel數據讀取

2020-11-26 13:38aheizi Java教程

這篇文章主要為大家詳細介紹了java利用注解實現簡單的excel數據讀取,具有一定的參考價值,感興趣的小伙伴們可以參考一下

實現工具類

利用注解實現簡單的excel數據讀取,利用注解對類的屬性和excel中的表頭映射,使用Apache的poi就不用在業務代碼中涉及row,rows這些屬性了。

定義注解:

java" id="highlighter_485959">
?
1
2
3
4
5
6
7
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
 
 String name();
 
}

由于本例中只涉及根據Excel表頭部分對Excel進行解析,只定義了一個name作為和Excel表頭的隱射。

工具類完整代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
public class ExcelUtil<T> {
 
 Class<T> clazz;
 
 public ExcelUtil(Class<T> clazz) {
  this.clazz = clazz;
 }
 
 public List<T> importExcel(String sheetName, InputStream input) {
  int maxCol = 0;
  List<T> list = new ArrayList<T>();
  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<Field> allFields = getMappedFiled(clazz, null);
    // 定義一個map用于存放列的序號和field.
    Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
    // 第一行為表頭
    Row rowHead = sheet.getRow(0);
    Map<String, Integer> cellMap = new HashMap<>();
    int cellNum = rowHead.getPhysicalNumberOfCells();
    for (int i = 0; i < cellNum; i++){
     cellMap.put(rowHead.getCell(i).getStringCellValue().toLowerCase(), i);
    }
    for (Field field : allFields) {
     // 將有注解的field存放到map中.
     if (field.isAnnotationPresent(Excel.class)) {
      Excel attr = field.getAnnotation(Excel.class);
      // 根據Name來獲取相應的failed
      int col = cellMap.get(attr.name().toLowerCase());
      field.setAccessible(true);
      fieldsMap.put(col, field);
     }
    }
    // 從第2行開始取數據
    for (int i = 1; i < rows; i++) {
     Row row = sheet.getRow(i);
     T entity = null;
     for (int j = 0; j < cellNum; j++) {
      Cell cell = row.getCell(j);
      if (cell == null) {
       continue;
      }
      int cellType = cell.getCellType();
      String c = "";
      if (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());
      } else {
       c = cell.getStringCellValue();
      }
      if (c == null || c.equals("")) {
       continue;
      }
      entity = (entity == null ? clazz.newInstance() : entity);
      // 從map中得到對應列的field.
      Field field = fieldsMap.get(j);
      if (field == null) {
       continue;
      }
      // 取得類型,并根據對象類型設置值.
      Class<?> 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<Field> getMappedFiled(Class clazz, List<Field> fields) {
  if (fields == null) {
   fields = new ArrayList<Field>();
  }
  // 得到所有定義字段
  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到對應字段。

基本使用

待解析表格如下:

java利用注解實現簡單的excel數據讀取

定義實體類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
}

使用工具類:

?
1
2
3
4
5
6
7
8
9
10
11
public static void main (String[] args) {
 FileInputStream fileInputStream = null;
 try {
  fileInputStream = new FileInputStream("D://data.xlsx");
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 ExcelUtil<User> util = new ExcelUtil<>(User.class);
 List<User> jalanHotelList = util.importExcel("user", fileInputStream);
 // do something
}

利用這個思路可以擴展出導出excel功能,利用注解指定導出的excel表頭,甚至可以輕松控制excel表頭的顏色,合并屬性等等,在xdemo中有詳細復雜的示例,可以研究下。由于我的需求很簡單,就不整那么復雜啦。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 大陆国产精品视频 | a毛片免费全部在线播放毛 a级在线看 | 99国产精品热久久久久久夜夜嗨 | 爆操美女在线观看 | 欧美精选欧美极品 | 99久久精品免费观看区一 | 欧美一区二区视频 | 高清毛片aaaaaaaaa片 | 91传媒制片厂果冻有限公司 | 亚洲精品九色在线网站 | 免费看一区二区三区 | 欧美日韩一区二区三在线 | 3d动漫h在线观看网站蜜芽 | 大ji巴好好爽好深网站 | 污漫日本E同人 | 办公室恋情在线 | 91国内精品 | 免费真实播放国产乱子伦 | 99热精品成人免费观看 | 小仙夜晚慰自催眠mp3护士篇 | 亚洲午夜久久久 | 日本日日黄 | www.好吊操| 色综合视频一区二区三区 | 色综合国产| 亚洲一区二区三区深夜天堂 | sp啪啪调教打屁股网站 | 日本美女xx| 亚洲第一成年免费网站 | 福利片福利一区二区三区 | 精品国语对白精品自拍视 | 任我行视频在线观看国语 | 国产高清在线看 | 99精品在线免费 | 91国内精品久久久久怡红院 | 顶级尤物极品女神福利视频 | 调教老师肉色丝袜的故事 | 四虎网站在线 | 成年人免费在线视频 | 国产精品密播放国产免费看 | 亚洲国产欧美目韩成人综合 |