POI实现excel格式文件读取,转换成List<bean>对象列表

基本思路是使用POI的XSSFWorkbook对象解析文件,可以获取sheet页、行、列、单元格等一系列信息,然后利用对象反射Method.invoke()方法为对象赋值,把对象放入list里返回即可;

关于POI的API可以参考:http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html

注意需要引入POI的jar包;

以下是简单实现的demo:

 1 try {
 2             System.out.println("================读取excel文件===================");
 3             InputStream in = new FileInputStream(new File(excelFilePath));// 获取文件
 4             XSSFWorkbook xb = new XSSFWorkbook(in);// 获取poi对象
 5             
 6             int i = xb.getNumberOfSheets();
 7             System.out.println("该文件共有 " + i + " 个sheet页");
 8             List<Bean> list = null;// 返回对象
 9             for (int j = 0; j < i; j++) {
10                 XSSFSheet sheet = xb.getSheetAt(j);// 获取sheet列表
11                 XSSFRow columRow = sheet.getRow(1);// 字段名称行
12                 switch (sheet.getSheetName()) {
13                 case "sheetName": //需要对每个sheet页做不同的对象处理,因为每个sheet页对应不同的javabean
14                     list = new ArrayList<>(xb.getSheetAt(j).getLastRowNum() + 1);
15                     for (int k = 2; k <= xb.getSheetAt(j).getLastRowNum(); k++) {// 第三行是数据行(这个是我们自己的表格格式,第二行是字段名,从第三行开始才是数据行)
16                         XSSFRow row = sheet.getRow(k);
17                         Bean bean= (lc_appoint) dealExcelRow(row, columRow, new Bean());//将数据行转换成bean类型对象
18                         list.add(appoint);
19                     }
20                     break;
21 
22                 default:
23                     break;
24                 }
25             }
26             for (Bean k : list) {
27                 System.out.println(bean.get....);
28             }
29             System.out.println("================读取excel文件完毕===================");
30         } catch (Exception e) {
31             e.printStackTrace();
32         }

赋值方法就是反射然后赋值:

 1 public static Object dealExcelRow(XSSFRow row, XSSFRow columRow, Object obj) {// 传入表格列处理,row:数据列;columrow:字段行,obj:对象类型
 2         if (row.getLastCellNum() != columRow.getLastCellNum()) {// 行数不一致
 3             return null;
 4         }
 5         int n = row.getLastCellNum();
 6         Field[] fieldList = obj.getClass().getDeclaredFields(); // 获取实体类的所有属性,返回Field数组
 7         try {
 8             for (Field f : fieldList) { // 遍历所有属性
 9                 String name = f.getName(); // 获取属性的名字
10                 String name1 = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写,方便构造get,set方法
11                 String type = f.getGenericType().toString(); // 获取属性的类型
12                 for (int k = 0; k < n; k++) {
13                     XSSFCell cell = row.getCell(k);
14                     XSSFCell cell1 = columRow.getCell(k);
15                     String cellValue = ExcelDemo.getCellStringValue(cell1);// 字段行名字
16                     if (name.equals(cellValue)) {
17                         if (type.equals("class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名,现在只先处理string类型的数据
18                             Method m = obj.getClass().getMethod("set" + name1, String.class);
19                             m.invoke(obj, ExcelDemo.getCellStringValue(cell));// 赋值
20                         }
21                     }
22                 }
23             }
24         } catch (Exception e) {
25             e.printStackTrace();
26         }
27         return obj;

然后是取单元格内值的方法:

 1 public static String getCellStringValue(XSSFCell cell) {// 传入单元格返回单元格内容
 2         String cellValue = "";
 3         switch (cell.getCellType()) {
 4         case XSSFCell.CELL_TYPE_STRING:// 字符串类型
 5             cellValue = cell.getStringCellValue();
 6             if (cellValue.trim().equals("") || cellValue.trim().length() <= 0) cellValue = " ";
 7             break;
 8         case XSSFCell.CELL_TYPE_NUMERIC: // 数值类型
 9             cellValue = String.valueOf(cell.getNumericCellValue());
10             break;
11         case XSSFCell.CELL_TYPE_FORMULA: // 公式
12             cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);
13             cellValue = String.valueOf(cell.getNumericCellValue());
14             break;
15         case XSSFCell.CELL_TYPE_BLANK:
16             cellValue = " ";
17             break;
18         case XSSFCell.CELL_TYPE_BOOLEAN:
19             break;
20         case XSSFCell.CELL_TYPE_ERROR:
21             break;
22         default:
23             break;
24         }
25         return cellValue;
26     }

借鉴:http://blog.sina.com.cn/s/blog_91c0fdb50101kfd4.html

posted on 2017-02-21 15:35  ViiJay  阅读(1067)  评论(0编辑  收藏  举报

导航