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()); } }
相关文章推荐
- java Excel的导入导出学习(1)
- Java基础学习总结(49)——Excel导入导出工具类
- java学习之--导入导出excel文件 通过poi
- java Excel的导入导出学习(1)
- Java基础学习总结(49)——Excel导入导出工具类
- Java基础学习总结(49)——Excel导入导出工具类
- [学习笔记]EXCEL导入功能java代码实现
- java之于c#学习心得
- Java数组学习心得
- Java容器类学习心得
- 关于poi导入excel数据的一些心得
- [导入]WebService Behavior 学习心得
- JAVA学习心得--类与对象
- Java容器类学习心得,欢迎拍砖
- Java异常学习心得
- think in java3学习心得之——Reusing class
- Java学习心得
- 学习心得:Java为什么支持反射机制?
- 用Java POI操作Excel,读取数据导入DB2数据库
- java学习心得