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 }