zoukankan      html  css  js  c++  java
  • 列字段通用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

  • 相关阅读:
    关于RAS加密中pfx格式提取字符串私钥 (转)
    Oracle冷备份和热备份的实践(原创)
    数据库的备份与恢复(oracle 11g) (转)
    Oracle安装-------实例化EM 配置文件时出错问题 ( 转 )
    oracle表空间维护常用命令
    使用Navicat for Oracle新建表空间、用户及权限赋予 (转)
    【JavaScript】JavaScript模块化编程
    【随笔】入行必读:互联网行业薪酬等级
    【JavaScript】JavaScript Promise 探微
    【Java】关于并发
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3050770.html
Copyright © 2011-2022 走看看