package com.java.test.util;
import com.java.test.pojo.ExcelObect;
import com.java.test.pojo.GZInfo;
import org.apache.poi.ss.usermodel.*;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class ExcelReader {
//这里的泛型可以是继承excelobject类
public static List<? extends ExcelObect> readExcel(String excelPath, int sheetNum, Class<? extends ExcelObect> clazz) {
List<ExcelObect> objList = new ArrayList<>();
try {
InputStream inp = ExcelUtils.class.getResourceAsStream(excelPath);
//获取工作簿对象
Workbook workbook = WorkbookFactory.create(inp);
//获取第一个sheet页 0代表第一个sheet页面
Sheet sheet = workbook.getSheetAt(sheetNum-1);
//获取最大的行数
int lastRowNum = sheet.getLastRowNum();
//获得第一列-因为第一行是表头
Row firstRow = sheet.getRow(0);
//获得最大的列数 根据表达取最大的列数
int lastCellNum = firstRow.getLastCellNum();
//创建一个数组,存放表头
String[] columnNameArray =new String[lastCellNum];
//获得表头 --遍历表头
for (int k =0;k<lastCellNum;k++){
Cell cell = firstRow.getCell(k, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String colunmName = cell.getStringCellValue();
columnNameArray[k] = colunmName;
}
//遍历每一行 i对应着行号
for (int i=1;i<=lastRowNum;i++){
// 创建一个对象
ExcelObect obj = clazz.newInstance();
//设置行号 这是excelobject里面的set方法
obj.setRowNum(i+1);
//获得索引对应的行
Row row = sheet.getRow(i);
//遍历每一列
for (int j =0;j<lastCellNum;j++){
//获取当前行的每一列
Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
//设置列的类型
cell.setCellType(CellType.STRING);
//获得该列的值
String cellValue = cell.getStringCellValue();
String columnName = columnNameArray[j];
//得到set方法
String setterMethodName = "set"+columnName.substring(0,columnName.indexOf("("));
//得到get方法
Method setterMethod =clazz.getMethod(setterMethodName,String.class);
//原始字符串的参数替换
String commonStr = ParameterUtils.getCommonStr(cellValue);
//反射调用该方法(使用反射,增加或者减少excel的表头,只需要修改pojo容器就行)
setterMethod.invoke(obj,commonStr);
}
objList.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
return objList;
}
public static void main(String[] args) {
List<GZInfo> objectList = (List<GZInfo>) readExcel("/b.xlsx",1, GZInfo.class);
// System.out.print(objectList);
for (GZInfo obj:objectList){
System.out.print(" 工号:"+obj.getJobId()+" 姓名:"+obj.getName()+" 在职状态:"+obj.getStatus()+" 基本工资:"+obj.getAttendanceDays()+"\n");
}
}
}
poi读取excel数据
最新推荐文章于 2023-09-25 15:24:21 发布