您的位置:首页 > 编程语言 > Java开发

java Excel导入学习心得

2014-07-17 09:50 253 查看
一直很想写些什么东西,可以留着今后将来看看,可以回顾一下,所以现在开始我的mark历程了!


java excel导入,相信网上已经一大推东西了,我只是想分享下自己最近学到的。

首先excel导入,需要一个实体类模板:

package cn.zonesea.framework.common.excel;

public class TxlWatchRfidMapping {
@Excel(exportName = "RFID编号", exportFieldWidth = 32, exportConvertSign = 0, importConvertSign = 0)
private String RFID;
@Excel(exportName = "RFID名称", exportFieldWidth = 100, exportConvertSign = 0, importConvertSign = 0)
private String RFIDNAME;
@Excel(exportName = "使用类型", exportFieldWidth = 18, exportConvertSign = 0, importConvertSign = 0)
private Integer USETYPE;

@Excel(exportName = "描述", exportFieldWidth = 500, exportConvertSign = 0, importConvertSign = 0)
private String REMARK;

@Excel(exportName = "经度", exportFieldWidth = 500, exportConvertSign = 0, importConvertSign = 0)
private String LONGITUDE;

@Excel(exportName = "纬度", exportFieldWidth = 500, exportConvertSign = 0, importConvertSign = 0)
private String LATITUDE;

@Excel(exportName = "高度", exportFieldWidth = 500, exportConvertSign = 0, importConvertSign = 0)
private String HEIGHT;

@Excel(exportName = "人员姓名", exportFieldWidth = 500, exportConvertSign = 0, importConvertSign = 0)
private String USERNAME;

@Excel(exportName = "人员编号", exportFieldWidth = 500, exportConvertSign = 0, importConvertSign = 0)
private Long USERID;

private Integer CREATEUSER;

public String getRFID() {
return RFID;
}

public void setRFID(String rFID) {
RFID = rFID;
}

public String getRFIDNAME() {
return RFIDNAME;
}

public void setRFIDNAME(String rFIDNAME) {
RFIDNAME = rFIDNAME;
}

public Integer getUSETYPE() {
return USETYPE;
}

public void setUSETYPE(Integer uSETYPE) {
USETYPE = uSETYPE;
}

public String getREMARK() {
return REMARK;
}

public void setREMARK(String rEMARK) {
REMARK = rEMARK;
}

public String getLONGITUDE() {
return LONGITUDE;
}

public void setLONGITUDE(String lONGITUDE) {
LONGITUDE = lONGITUDE;
}

public String getLATITUDE() {
return LATITUDE;
}

public void setLATITUDE(String lATITUDE) {
LATITUDE = lATITUDE;
}

public String getHEIGHT() {
return HEIGHT;
}

public void setHEIGHT(String hEIGHT) {
HEIGHT = hEIGHT;
}

public String getUSERNAME() {
return USERNAME;
}

public void setUSERNAME(String uSERNAME) {
USERNAME = uSERNAME;
}

public Long getUSERID() {
return USERID;
}

public void setUSERID(Long uSERID) {
USERID = uSERID;
}

public Integer getCREATEUSER() {
return CREATEUSER;
}

public void setCREATEUSER(Integer cREATEUSER) {
CREATEUSER = cREATEUSER;
}

}


接下来就是需要准备我们的excel处理的方法了(因为这个方法是比较通用的,如果想导入不同的模板的excel,只需要修改下实体类模板就可以了):

public Collection importExcel(InputStream is, Class pojoClass,
String... pattern) {
Collection dist = new ArrayList();
try {
// 得到目标目标类的所有的字段列表
Field filed[] = pojoClass.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
Excel excel = f.getAnnotation(Excel.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 = pojoClass.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 = pojoClass.getMethod(
setConvertMethodName.toString(),
new Class[] { String.class });
fieldSetConvertMap.put(excel.exportName(),
getConvertMethod);
}

}
}
int size = filed.length;

// 将传入的File构造为FileInputStream;
// FileInputStream in = new FileInputStream(file);
// // 得到工作表
HSSFWorkbook book = new HSSFWorkbook(is);
// // 得到第一页
HSSFSheet sheet = book.getSheetAt(0);
// // 得到第一面的所有行
Iterator<Row> row = sheet.rowIterator();

// 得到第一行,也就是标题行
Row title = row.next();
// 得到第一行的所有列
Iterator<Cell> cellTitle = title.cellIterator();
// 将标题的文字内容放入到一个map中。
Map titlemap = new HashMap();
// 从标题第一列开始
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();
if (rown.getCell(0) == null
|| rown.getCell(0).toString().equals("")) {
break;
}

// 行的所有列
// Iterator<Cell> cellbody = rown.cellIterator();

// 得到传入类的实例
Object tObject = pojoClass.newInstance();

int k = 0;

for (int j = 0; j < size; j++) {
Cell cell = rown.getCell(j);
// 这里得到此列的对应的标题
String titleString = (String) titlemap.get(k);
// 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
if (fieldSetMap.containsKey(titleString)) {

Method setMethod = (Method) fieldSetMap
.get(titleString);
// 得到setter方法的参数
Type[] ts = setMethod.getGenericParameterTypes();
// 只要一个参数
String xclass = ts[0].toString();
// 判断参数类型
if (fieldSetConvertMap.containsKey(titleString)) {

fieldSetConvertMap.get(titleString).invoke(tObject,
cell.toString());

} else {
if (xclass.equals("class java.lang.String")) {
if (cell != null) {
setMethod.invoke(tObject, cell.toString()
.toString());
}

} else if (xclass.equals("class java.util.Date")) {
if (cell != null) {
setMethod.invoke(tObject, cell.toString()
.toString());
}
} else if (xclass.equals("class java.lang.Boolean")) {
if (cell != null) {
setMethod.invoke(tObject, cell.toString()
.toString());
}
} else if (xclass.equals("class java.lang.Integer")) {
if (cell != null) {
setMethod.invoke(tObject,
new Integer(cell.toString()));
}
} else if (xclass.equals("class java.lang.Long")) {
if (cell != null) {
setMethod.invoke(tObject, new Long(cell
.toString().toString()));
}
}
}
}
// 下一列
k = k + 1;
}

// 遍历一行的列
// while (cellbody.hasNext()) {
//
// }
dist.add(tObject);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return dist;
}
最后我们做下测试,导入某个excel获取其里面的值试试:

public static void main(String[] args) throws IOException {
ExcelImport test = new ExcelImport();
// File file = new File("D://22.xls");
InputStream is = new FileInputStream("D://22.xls");
Long befor = System.currentTimeMillis();
List<TxlWatchRfidMapping> result = (ArrayList) test.importExce
4000
l(is,
TxlWatchRfidMapping .class);
Long after = System.currentTimeMillis();
System.out.println("此次操作共耗时:" + (after - befor) + "毫秒");

for (int i = 0; i < result.size(); i++) {
TxlWatchRfidMapping  testpojo = result.get(i);
System.out.println(testpojo.toString());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: