国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - java利用注解實現(xiàn)簡單的excel數(shù)據(jù)讀取

java利用注解實現(xiàn)簡單的excel數(shù)據(jù)讀取

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

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

實現(xiàn)工具類

利用注解實現(xiàn)簡單的excel數(shù)據(jù)讀取,利用注解對類的屬性和excel中的表頭映射,使用Apache的poi就不用在業(yè)務(wù)代碼中涉及row,rows這些屬性了。

定義注解:

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

由于本例中只涉及根據(jù)Excel表頭部分對Excel進(jìn)行解析,只定義了一個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中的內(nèi)容.
   if (!sheetName.trim().equals("")) {
    sheet = workbook.getSheet(sheetName);
   }
   // 如果傳入的sheet名不存在則默認(rèn)指向第1個sheet.
   if (sheet == null) {
    sheet = workbook.getSheetAt(0);
   }
   int rows = sheet.getPhysicalNumberOfRows();
   // 有數(shù)據(jù)時才處理
   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);
      // 根據(jù)Name來獲取相應(yīng)的failed
      int col = cellMap.get(attr.name().toLowerCase());
      field.setAccessible(true);
      fieldsMap.put(col, field);
     }
    }
    // 從第2行開始取數(shù)據(jù)
    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中得到對應(yīng)列的field.
      Field field = fieldsMap.get(j);
      if (field == null) {
       continue;
      }
      // 取得類型,并根據(jù)對象類型設(shè)置值.
      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;
 }
 
 
 /**
  * 得到實體類所有通過注解映射了數(shù)據(jù)表的字段
  *
  * @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,解析第一行,并和實體類標(biāo)有注解的字段一一對應(yīng),用hashMap記錄下來,然后循環(huán)取得Excel中剩下所有的數(shù)據(jù),根據(jù)map的對應(yīng)關(guān)系將值set到對應(yīng)字段。

基本使用

待解析表格如下:

java利用注解實現(xiàn)簡單的excel數(shù)據(jù)讀取

定義實體類:

?
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
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 搞黄免费视频 | 国产成人精品亚洲日本在线观看 | 青青久久av北条麻妃黑人 | 激情视频日本 | 丝袜+亚洲+另类+欧美+变态 | 久久精品久久综合 | 国产精品自拍系列 | 欧美在线观看一区 | 国产精品福利视频 | 欧美精品一区二区三区在线播放 | 91夜夜操| 欧美一级欧美三级在线观看 | 欧美三区二区一区 | 九九porny88av| 成人国产精品久久久 | 久久久综合网 | 久久网站热最新地址 | 中国大陆高清aⅴ毛片 | 91天堂| 日韩精品一区二区三区在线观看 | 精品一级| 国产福利在线播放 | 亚洲精品二三区 | 成人妇女免费播放久久久 | 免费的av电影| 国产美女视频网站 | 国产精品美女久久久久久久久久久 | 亚洲欧美一区二区视频 | 久久久久久国产精品高清 | 在线视频三级 | 亚洲精品视频一区二区三区 | 91精品国产综合久久久久久 | 伊人亚洲| 国产情侣一区二区三区 | 精品一区二区三区中文字幕 | 无码日韩精品一区二区免费 | 午夜私人影院在线观看 | 国产91精品一区二区绿帽 | 国产成人高清 | 国产精品美女久久久久av麻豆 | 在线黄色网 |