importExcel运用注解实现EXCEL导入poi类

JAVA报表

package com.app.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.DecimalFormat;



import java.text.SimpleDateFormat;



import java.util.ArrayList;



import java.util.Collection;



import java.util.Date;



import java.util.HashMap;



import java.util.Iterator;



import java.util.Map;







import org.apache.poi.hssf.usermodel.HSSFCell;



import org.apache.poi.hssf.usermodel.HSSFDateUtil;



import org.apache.poi.hssf.usermodel.HSSFRow;



import org.apache.poi.hssf.usermodel.HSSFSheet;



import org.apache.poi.hssf.usermodel.HSSFWorkbook;







import com.app.common.excel.annotation.ExcelAnnotation;



import com.app.common.utils.StringUtils;







/**



 * EXCEL通用导入(根据annotation判断导入字段)



 * 



 * @author ZhouBo



 * 



 * @param <T>,Model对象



 * @since 2011-07-12



 */



public class ExcelImport<T> {







Class<T> clazz;







public ExcelImport(Class<T> clazz) {



this.clazz = clazz;



}







@SuppressWarnings("unchecked")



public Collection<T> importExcel(File file, String... pattern) {



Collection<T> dist = new ArrayList();



try {



/**



* 类反射得到调用方法



*/



// 得到目标目标类的所有的字段列表



Field filed[] = clazz.getDeclaredFields();



// 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中



Map fieldmap = new HashMap();



// 循环读取所有字段



for (int i = 0; i < filed.length; i++) {



Field f = filed[i];



// 得到单个字段上的Annotation



ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);



// 如果标识了Annotationd的话



if (exa != null) {



// 构造设置了Annotation的字段的Setter方法



String fieldname = f.getName();



String setMethodName = "set"



+ fieldname.substring(0, 1).toUpperCase()



+ fieldname.substring(1);



// 构造调用的method,



Method setMethod = clazz.getMethod(setMethodName,



new Class[] { f.getType() });



// 将这个method以Annotaion的名字为key来存入。



fieldmap.put(exa.exportName(), setMethod);



}



}



/**



* excel的解析开始



*/



// 将传入的File构造为FileInputStream;



FileInputStream in = new FileInputStream(file);



// // 得到工作表



HSSFWorkbook book = new HSSFWorkbook(in);



// // 得到第一页



HSSFSheet sheet = book.getSheetAt(0);



// // 得到第一面的所有行



Iterator<HSSFRow> row = sheet.rowIterator();



/**



* 标题解析



*/



// 得到第一行,也就是标题行



HSSFRow title = row.next();



// 得到第一行的所有列



Iterator<HSSFCell> cellTitle = title.cellIterator();



// 将标题的文字内容放入到一个map中。



Map titlemap = new HashMap();



// 从标题第一列开始



int i = 0;



// 循环标题所有的列



while (cellTitle.hasNext()) {



HSSFCell 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]);



int w = 0;



while (row.hasNext()) {



// 标题下的第一行



HSSFRow rown = row.next();



// 行的所有列



//Iterator<HSSFCell> cellbody = rown.cellIterator();



// 得到传入类的实例



T tObject = clazz.newInstance();



short k = 0;



// 遍历一行的列



w++;



//while (cellbody.hasNext()) {



for(k=0; k < title.getLastCellNum(); k++) {



//HSSFCell cell = cellbody.next();



HSSFCell cell = rown.getCell(k);



// 这里得到此列的对应的标题



String titleString = (String) titlemap.get((int)k);



// 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值



if (fieldmap.containsKey(titleString)) {



Method setMethod = (Method) fieldmap.get(titleString);



// 得到setter方法的参数



Type[] ts = setMethod.getGenericParameterTypes();



// 只要一个参数



String xclass = ts[0].toString();



String cons = null;



if (cell == null) {



cons = "";



continue;



}



else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {



cons = cell.getStringCellValue();



}



else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {



if(HSSFDateUtil.isCellDateFormatted(cell)) {



Date date = cell.getDateCellValue();



cons = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate();



} else {



// 是否为数值型



    double d = cell.getNumericCellValue();



    if (d - (int) d < Double.MIN_VALUE) { 



    // 是否为int型



   cons = Integer.toString((int) d);



    } else { 



   System.out.println("double.....");



     // 是否为double型



   DecimalFormat df = new DecimalFormat("#");



   cons = df.format(cell.getNumericCellValue());



    }



}



}



///



/*



if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {







 



DateFormat format = new SimpleDateFormat(DateUtil.YYYY_MM_DD);











if(HSSFDateUtil.isCellDateFormatted(cell)) {



   // 是否为日期型



    str = format.format(cell.getDateCellValue());



   } else {



   // 是否为数值型



    double d = cell.getNumericCellValue();



    if (d - (int) d < Double.MIN_VALUE) { 



    // 是否为int型



     str = Integer.toString((int) d);



    } else { 



   System.out.println("double.....");



     // 是否为double型



     str = Double.toString(cell.getNumericCellValue());



    }



   }



  System.out.println("type=="+cell.getCellType() );



  System.out.println("cell=="+str);







}else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {



str = cell.getRichStringCellValue().getString();



}else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {



str = cell.getCellFormula();



}else if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) {



str = " ";



}else if (cell.getCellType() == HSSFCell.CELL_TYPE_ERROR) {



str = " ";



}



*/



///



if (StringUtils.hasText(cons)



&& cons.indexOf(".0") != -1) {



cons = cons.substring(0, cons.indexOf(".0"));



}



// 判断参数类型



if (xclass.equals("class java.lang.String")) {



setMethod.invoke(tObject, cons);



} else if (xclass.equals("class java.util.Date")) {



setMethod.invoke(tObject, sf.parse(cons));



} else if (xclass.equals("class java.lang.Boolean")) {



Boolean boolname = true;



if (cell.getStringCellValue().equals("否")) {



boolname = false;



}



setMethod.invoke(tObject, boolname);



} else if (xclass.equals("class java.lang.Integer")) {



// 截取小数点



if (StringUtils.hasText(cons)) {



if (cons.indexOf(".") >= 0)



cons = cons.substring(0, cons.indexOf("."));



setMethod.invoke(tObject, new Integer(cons));



}



} else if (xclass.equals("class java.lang.Long")) {



setMethod.invoke(tObject, new Long(cons));



}



}



// 下一列



//k = k + 1;



}



//}



dist.add(tObject);



}



} catch (Exception e) {



e.printStackTrace();



return null;



}



return dist;



}







}

 

要导入的实体类

/** 贷款联系人 */

@ExcelAnnotation(exportName = "联系人", exportFieldWidth = 60, exportConvertSign = 0, importConvertSign = 0)

private String linkMan;

/** 贷款联系人电话 */

@ExcelAnnotation(exportName = "联系人电话", exportFieldWidth = 60, exportConvertSign = 0, importConvertSign = 0)

private String linkTel;

/** 联系人职务 */

@ExcelAnnotation(exportName = "联系人职务", exportFieldWidth = 60, exportConvertSign = 0, importConvertSign = 0)

private String linkJob;

/** 联系人邮箱 */

@ExcelAnnotation(exportName = "联系人邮箱", exportFieldWidth = 60, exportConvertSign = 0, importConvertSign = 0)

private String linkMail;

/** 添加人 */

@ExcelAnnotation(exportName = "跟踪人", exportFieldWidth = 60, exportConvertSign = 0, importConvertSign = 0)

需要导入的字段就加上@ExcelAnnotation
excel表头跟 exportName一致就可以自动识别导入

河南省豫资城乡投资发展有限公司

你可能感兴趣的:(import)