列字段通用excel导入修改版

最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--列字段

入导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

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3050770.html