本篇文章采用的方法是用反射去注值的方式实现的,前提条件是excel表中有一行标题行用以存储实体类的变量名,因为是用标题栏去存储的变量,所以此方法中标题变量的顺序对功能也没有影响,然后读取数据采用的是xssf中的类,首先看一下excel表
标题行为实体类变量,注意这里应该是要区分大小写的,第二行开始是数据,再看看实体类:
public class UserInfo {
private String id;
private String name;
private String account;
private String pwd;
private String age;
private String sex;
}
因为用的是反射机制,所以也不需要set和get方法,这里重写一下toString()方法,方便用于测试
以下是实现映射的方法:
/**
* @Author JinX
* @Description excel数据映射为bean
* @Date 12:13 2022/11/10
* @Param [file, cls] excel文件, 实体类
* @return java.util.List<T>
**/
public static <T> List<T> excel2Bean(File file, Class<T> cls) {
List<T> beans = new ArrayList<>();
FileInputStream is;
XSSFWorkbook wb;
try {
is = new FileInputStream(file);
wb = new XSSFWorkbook(is);
// 默认加载第一页
XSSFSheet sheet = wb.getSheetAt(0);
// 存入标题
Map<Integer, String> titles = new HashMap<>();
XSSFRow titleRow = sheet.getRow(0);
short titleNums = titleRow.getLastCellNum();
for (Integer i = 0; i <= titleNums; i++) {
String title = getCellStringValue(titleRow, i);
titles.put(i, title);
}
// 开始存数据
XSSFRow row;
Integer rows = sheet.getLastRowNum();
// 跳过标题
for (int i = 1; i <= rows; i++) {
row = sheet.getRow(i);
T bean = cls.newInstance();
for (int j = 0; j < titleNums; j++) {
String value = getCellStringValue(row, j);
// 获取标题 即变量名
String tile = titles.get(j);
Field field = bean.getClass().getDeclaredField(tile);
// private变量
field.setAccessible(true);
field.set(bean, value);
}
// 如果有lineNumer, 存入excel行号, 这个可有可无
try {
Field field = bean.getClass().getDeclaredField("lineNumber");
field.setAccessible(true);
field.set(bean, String.valueOf(i));
} catch (Exception e) {
}
beans.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
}
return beans;
}
/**
* @Author JinX
* @Description 包装获取cell数据的方法
* @Date 12:14 2022/11/10
* @Param [row, index]
* @return java.lang.String
**/
public static String getCellStringValue(XSSFRow row, int index) {
if (row == null) {
return "";
}
XSSFCell cell = row.getCell(index);
if (null == cell) {
return "";
}
cell.setCellType(CellType.STRING);
return cell.getStringCellValue();
}
然后测试一下数据
String filePath = "C:\\Users\\Administrator\\Desktop\\UserInfo.xlsx";
File file = new File(filePath);
List<UserInfo> userInfos = ExcelUtil.excel2Bean(file, UserInfo.class);
for (UserInfo userInfo : userInfos) {
System.out.println(userInfo);
}
数据的话也没有问题,如果有什么不足或是需要改进的地方,欢迎大家评论