package com.syq.autotest.utils;
import org.apache.poi.ss.usermodel.*;
import org.testng.log4testng.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* @description
* @author: Admin
* @create: 2024/1/29 16:33
*/
public class ExcelUtil {
public static Logger logger = Logger.getLogger(ExcelUtil.class);
// 解析指定excel表单的数据,封装到对象中【对象类型使用泛型】
public static <T> List<T> loadExcel(String excelPath, String sheetName, Class<T> clazz){
logger.info("===================开始读取sheet: " + sheetName);
// 创建一个list
List<T> list = new ArrayList<T>();
InputStream in = null;
// 创建WorkBook对象
try {
File file = new File(excelPath);
in = new FileInputStream(file);
// 获取workbook对象
Workbook workbook = WorkbookFactory.create(in);
// 获取sheet对象
Sheet sheet = workbook.getSheet(sheetName);
// 获取第一行,Row是行对象类型,通过行对象可以操作列
Row firstRow = sheet.getRow(0);
// 获取最后一列的列号
int lastCellNum = firstRow.getLastCellNum();
// System.out.println(lastCellNum);
// 定义存放表头的数组
String[] titles = new String[lastCellNum];
// 将表头放入数组
for (int i = 0; i < lastCellNum; i++) {
// 通过行对象和列索引,获取单元格对象
Cell cell = firstRow.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
// 设置列的类型为字符串
// cell.setCellType(CellType.STRING);
// 获取单元格的值
String title = cell.getStringCellValue();
// title = title.substring(0,title.indexOf(":"));
// 值保存到数组
titles[i] = title;
}
// 打印解析出来的标题
// logger.info("解析出来的首行标题:" + Arrays.toString(titles));
// 获取sheet最后一行的行号
int lastRowNum = sheet.getLastRowNum();
// System.out.println(lastRowNum);
// 循环处理每一行数据,从2行开始是数据行
for (int i = 1; i <= lastRowNum ; i++) {
// 每行数据一个对象
T obj = clazz.newInstance();
// 获取一行数据
Row rowData = sheet.getRow(i);
if (rowData==null || rowDataIsEmpty(rowData)){
continue;
}
// 获取此行的列数据,封装到caseObject对象中
for (int j = 0; j < lastCellNum ; j++) {
Cell cell = rowData.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String cellValue = cell.getStringCellValue();
// 打印获取到的值
// System.out.print("【"+ titles[j] + "="+ cellValue+"】");
// 获取要反射的方法名
String methodName = "set" + titles[j];
// 获取要反射的方法对象
Method method = clazz.getMethod(methodName, String.class);
// 反射调用
method.invoke(obj, cellValue);
}
// logger.info("封装的第【"+i+"】个对象(也就是第"+i+"行数据):" + obj);
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
logger.info("===================读取sheet完成: " + sheetName);
return list;
}
// 判断行的单元格数据是否都是空
public static boolean rowDataIsEmpty(Row rowData) {
int lastCellNum = rowData.getLastCellNum();
for (int i = 0; i < lastCellNum; i++) {
Cell cell = rowData.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String cellValue = cell.getStringCellValue();
if (cellValue!=null && cellValue.trim().length()>0){
return false;
}
}
return true;
}
}