最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--列字段
入导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()); } }
文章结束给大家分享下程序员的一些笑话语录: 手机终究会变成PC,所以ip会比wm更加畅销,但是有一天手机强大到一定程度了就会发现只有wm的支持才能完美享受。就好比树和草,草长得再高也是草,时间到了条件成熟了树就会窜天高了。www.ishuo.cn