通用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());     
    }     
  
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值