导入Excel对网上通用excel导入修改版:解决Excel中单元格为数字问题、可以连续读取多个sheet
package com.xl.common.excel;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import com.xl.news.domain.StuInfo;
public class ExcelImport {
@SuppressWarnings("unchecked")
public Collection importExcel(File file ,Class obj,String... pattern) {
Collection dist = new ArrayList();
try {
Field filed[] = obj.getDeclaredFields(); // 得到目标目标类的所有的字段列表
// 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中
Map<String,Method> fieldSetMap = new HashMap<String,Method>();
Map<String,Method> fieldSetConvertMap = new HashMap<String,Method>();
// 循环读取所有字段
for (int i = 0; i < filed.length; i++) {
Field f = filed[i];
// 得到单个字段上的Annotation
ExcelAnnotation excel = f.getAnnotation(ExcelAnnotation.class);
// 如果标识了Annotationd的话
if (excel != null) {
// 构造设置了Annotation的字段的Setter方法
String fieldname = f.getName();
String setMethodName = "set"
+ fieldname.substring(0, 1).toUpperCase()
+ fieldname.substring(1);
// 构造调用的method,
Method setMethod = obj.getMethod(setMethodName, new Class[] { f.getType() });
// 将这个method以Annotaion的名字为key来存入。
// 对于重名将导致 覆盖失败,对于此处的限制需要
fieldSetMap.put(excel.exportName(), setMethod);
if(excel.importConvertSign()==1)
{
StringBuffer setConvertMethodName = new StringBuffer("set");
setConvertMethodName.append(fieldname.substring(0, 1) .toUpperCase());
setConvertMethodName.append(fieldname.substring(1));
setConvertMethodName.append("Convert");
Method getConvertMethod = obj.getMethod(setConvertMethodName.toString(),new Class[] {String.class});
fieldSetConvertMap.put(excel.exportName(), getConvertMethod);
}
}
}
FileInputStream in = new FileInputStream(file); // 将传入的File构造为FileInputStream;
HSSFWorkbook book = new HSSFWorkbook(in); // 得到工作表
in.close();// 关闭流
for (int j = 0; j < book.getNumberOfSheets() - 1; j++ ) // book.getNumberOfSheets() - 1 获取工作表中页数
{
HSSFSheet sheet = book.getSheetAt(j); // 得到第j页
Iterator<Row> row = sheet.rowIterator(); // 得到第j页的所有行
//System.out.println(row.hasNext());
while (row.hasNext()){ //判断当前sheet是否为空
Row title = row.next(); // 得到第一行,也就是标题行
Iterator<Cell> cellTitle = title.cellIterator(); // 得到第一行的所有列
Map titlemap = new HashMap(); // 将标题的文字内容放入到一个map中。
int i = 0; // 从标题第一列开始
// 循环标题所有的列
while (cellTitle.hasNext()) {
Cell cell = cellTitle.next();
String value = cell.getStringCellValue();
titlemap.put(i, value);
i = i + 1;
}
//用来格式化日期的DateFormat
// SimpleDateFormat sf;
// if(pattern.length<1)
// {
// sf=new SimpleDateFormat("yyyy-MM-dd");
// }
// else {
// sf=new SimpleDateFormat(pattern[0]);
// }
while (row.hasNext()) {
Row rown = row.next();// 标题下的第一行
Iterator<Cell> cellbody = rown.cellIterator();// 行的所有列
Object tObject = obj.newInstance(); // 得到传入类的实例
int k = 0;
// 遍历一行的列
while (cellbody.hasNext()) {
Cell cell = cellbody.next();
String titleString = (String) titlemap.get(k); // 这里得到此列的对应的标题
// 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
if (fieldSetMap.containsKey(titleString)) {
Method setMethod = (Method) fieldSetMap.get(titleString);
Type[] ts = setMethod.getGenericParameterTypes(); // 得到setter方法的参数
String xclass = ts[0].toString(); // 只要一个参数
//System.out.println("类型: "+xclass); // 判断参数类型
if (fieldSetConvertMap.containsKey(titleString)) {
fieldSetConvertMap.get(titleString).invoke(tObject, cell.getStringCellValue());
} else {
if (xclass.equals("class java.lang.String")) {
if(cell.getCellType()==cell.CELL_TYPE_NUMERIC )
{
cell.setCellType(Cell.CELL_TYPE_STRING);
setMethod.invoke(tObject, cell.getStringCellValue());
}
else{
setMethod.invoke(tObject, cell.getStringCellValue());
}
}
else if (xclass.equals("class java.util.Date")) {
setMethod.invoke(tObject, cell.getDateCellValue());
}
else if (xclass.equals("class java.lang.Boolean")) {
setMethod.invoke(tObject, cell.getBooleanCellValue());
}
else if (xclass.equals("class java.lang.Integer")) {
setMethod.invoke(tObject, new Integer(cell.getStringCellValue()));
}else if(xclass. equals("class java.lang.Long"))
{
setMethod.invoke(tObject,new Long( cell.getStringCellValue()));
}
}
}
k = k + 1;// 下一列
}
dist.add(tObject);
}
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return dist;
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
ExcelImport test = new ExcelImport();
File file = new File("D://testOne.xls");
Long befor = System.currentTimeMillis();
List<StuInfo> result = (ArrayList) test.importExcel(file,StuInfo.class);
Long after = System.currentTimeMillis();
System.out.println("此次操作共耗时:" + (after - befor) + "毫秒");
for (int i = 0; i < result.size(); i++) {
StuInfo testpojo=result.get(i);
System.out.println("导入的信息为:"+testpojo.getStuName()+
"--"+testpojo.getStuID()+"-"+testpojo.getClassID()+"--"+testpojo.getIdentificationID());
}
System.out.println("共转化为List的行数为:" + result.size());
}
}