importExcel运用注解实现EXCEL导入poi类
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
importExcel运⽤注解实现EXCEL导⼊poi类JAVA报表
package mon.excel;
import java.io.File;
import java.io.FileInputStream;
import ng.reflect.Field;
import ng.reflect.Method;
import ng.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 ermodel.HSSFCell;
import ermodel.HSSFDateUtil;
import ermodel.HSSFRow;
import ermodel.HSSFSheet;
import ermodel.HSSFWorkbook;
import mon.excel.annotation.ExcelAnnotation;
import mon.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 ng.String")) {
setMethod.invoke(tObject, cons);
} else if (xclass.equals("class java.util.Date")) {
setMethod.invoke(tObject, sf.parse(cons));
} else if (xclass.equals("class ng.Boolean")) {
Boolean boolname = true;
if (cell.getStringCellValue().equals("否")) {
boolname = false;
}
setMethod.invoke(tObject, boolname);
} else if (xclass.equals("class ng.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 ng.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⼀致就可以⾃动识别导⼊。