package com.hh.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author
* 2016年11月21日上午10:59:49
* TODO 读取excel
*/
public class ReadExcelTool <T>{
private Logger logger = LoggerFactory.getLogger(getClass());
private File file;
private int sheetIndex;
private Class<T> clazz;
/**
* 构造方法
* @param file
* @param index
*/
public ReadExcelTool(File file, int index, Class<T> clazz){
this.file = file;
this.sheetIndex = index;
this.clazz= clazz;
}
/**
* 读取数据
*/
public List<T> read(){
FileInputStream fis = null;
HSSFWorkbook hw = null;
HSSFSheet sheet = null;
//检查数据
logger.info("检查数据...");
if(this.file == null){
logger.info("file为空,程序退出...");
return null;
}
List<T> list = new ArrayList<T>();
//新建文件流
try {
fis = new FileInputStream(this.file);
} catch (IOException e) {
logger.info("文件打开失败...");
e.printStackTrace();
}
//反射出方法名称
Field[] fs = clazz.getDeclaredFields();
List<String> ls = new ArrayList<String>();
for(Field f : fs){
if(!Modifier.isStatic(f.getModifiers())){
ls.add(f.getName());
}
}
String[] methods = new String[ls.size()];
for(int i=0; i<ls.size(); i++){
String m = "set" + ls.get(i).substring(0, 1).toUpperCase() + ls.get(i).substring(1);
methods[i] = m;
}
//新建HSSFWorkbook
try {
hw = new HSSFWorkbook(fis);
} catch (IOException e1) {
e1.printStackTrace();
}
sheet = hw.getSheet(hw.getSheetName(0));
//开始遍历excel
for(int i=0; i<=sheet.getLastRowNum(); i++){
//第一行是标题,过滤掉
if(i == 0){
continue;
}
HSSFRow row = sheet.getRow(i);
T t = null;
try {
t = clazz.newInstance();
} catch (InstantiationException e) {
logger.info("调用构造方法失败...");
e.printStackTrace();
} catch (IllegalAccessException e) {
logger.info("没有共有的构造方法...");
e.printStackTrace();
}
for(int j=0; j<row.getLastCellNum(); j++){
//第一列是标号,去掉
if(j == 0){
continue;
}
try {
this.clazz.getMethod(methods[j-1], String.class).invoke(t, row.getCell(j).getStringCellValue());
} catch (Exception e) {
e.printStackTrace();
}
}
list.add(t);
}
return list;
}
}