`
sunxboy
  • 浏览: 2870428 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

一个Excel转换Java集合的工具类

阅读更多
 import java.io.FileInputStream;  
 import java.lang.reflect.InvocationTargetException;  
 import java.util.ArrayList;  
 import java.util.Collection;  
 import java.util.Iterator;  
 import java.util.Properties;  
   
 import org.apache.commons.beanutils.BeanUtils;  
 import org.apache.log4j.Logger;  
 import org.apache.poi.hssf.usermodel.HSSFCell;  
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;  
 import org.apache.poi.hssf.usermodel.HSSFRow;  
 import org.apache.poi.hssf.usermodel.HSSFSheet;  
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
   
 import com.tarena.crm.entity.CustomerProxy;  
   
 public class ExcelToCollectionUtil {  
     /** 
      * Logger for this class 
      */  
     private static final Logger logger = Logger  
             .getLogger(ExcelToCollectionUtil.class);  
     /** 
      * Excel和对象成员的映射集合. 
      */  
     private Properties pro;   
     /** 
      * Excel封装对象. 
      */  
     private HSSFWorkbook hb;  
     /** 
      * 坏数据静态异常类. 
      */  
     public static class ExcelBadRecordException extends Exception{  
         private StringBuilder ms=new StringBuilder();  
         private boolean flag=false;  
         public void addMessage(String s){  
             flag=true;  
             ms.append(s+"\n");  
         }  
         public ExcelBadRecordException(){  
             super();  
         }  
         @Override  
         public String getMessage() {  
             return ms.toString();  
         }  
         public boolean hasError(){  
             return flag;  
         }  
           
     }  
     private ExcelBadRecordException exception=new ExcelBadRecordException();  
     /** 
      * 集合中所存储的对象类型. 
      */  
     private Class clazz;  
   
     public ExcelToCollectionUtil(Properties pro, HSSFWorkbook hb, Class clazz) {  
         super();  
         this.pro = pro;  
         this.hb = hb;  
         this.clazz = clazz;  
     }  
     /** 
      * 从Excel导入到Collection 
      */  
     public Collection toCollection() {  
         Collection table=new ArrayList();   //保存数据的集合  
         HSSFSheet sheet = hb.getSheetAt(0); //得到第一个sheet , 应该改进成可以选择的.  
         HSSFRow head = sheet.getRow(0); //得到第一行表头  
         for (int i = 1;; i++) {  
             HSSFRow row = sheet.getRow(i);  //得到一行记录  
             if(row==null)      //判断是否为最后记录, 应该判断记录是否有效.  
                 break;  
             Object object=null;  
             try {  
                 object = this.exchangObjectFromRow(head, row);  //通过一条记录产生一个对象  
             } catch (Exception e) {  
                 //遇到无效的数据跳过  
                 Exception ee=new Exception("第"+i+"条记录格式有错误!",e);  
                 exception.addMessage(ee.getMessage());  //将无效记录异常内容存在ExcelBadRecordException对象里  
                 continue;                                         
             }   
             table.add(object); //将产生的对象存入集合中  
         }  
         return table;  
     }  
     /** 
      * 抛出无效数据异常. 
      * @throws ExcelBadRecordException 
      */  
     public void showException() throws ExcelBadRecordException{  
         if(exception.hasError()){  
             throw exception;  
         }  
     }  
     /** 
      * 将一个row对象数据转换成javabean对象. 
      * @param head 
      * @param row 
      * @return 
      * @throws InvocationTargetException  
      * @throws IllegalAccessException  
      */  
     private Object exchangObjectFromRow(HSSFRow head,HSSFRow row) throws Exception{  
         StringBuilder sb = new StringBuilder();  
         Object object=this.newInstance(clazz);  
         if(row.getCell((short)0)==null){  
             throw new Exception("第一列单元格没有数据.");  
         }  
         for (int j = 0;; j++) {  
             HSSFCell cell = row.getCell((short) j);  //得到一个单元格.  
             if (cell == null)  
                 break;  
               
             String attribute=head.getCell((short)j).getRichStringCellValue().getString();  // 得到Excel中该列列名.  
             String property=pro.getProperty(attribute);                                 // 从Properties中得到对应的成员名  
             Object value=null;  //成员对象  
             if(property==null||property.equals("")||attribute.equals(""))  //防止有没有对应的字段映射  
                 continue;  
             switch (cell.getCellType()) {  // 判断单元格的数据类型,做不同处理.  
                 case HSSFCell.CELL_TYPE_STRING:  //判断是字符串类型  
                     value=cell.getRichStringCellValue().getString();                        // 得到对象的成员对象.  
                     break;  
                 case HSSFCell.CELL_TYPE_NUMERIC:  //判断是数字类型  
                     if(HSSFDateUtil.isCellDateFormatted(cell)){ //判断是标准日期类型(1996-1-1)  
                         value=cell.getDateCellValue();                                          // 得到对象的成员对象.  
                     }else{  
                         value=new Double(cell.getNumericCellValue()).longValue();  
                     }  
                     break;  
                 default:  
                     logger.error("excel里非字符串和数字的类型.");  
             }  
             sb.append(property+"="+value);  
             sb.append(" ");  
             BeanUtils.setProperty(object,property,value);  
               
         }  
         if (logger.isDebugEnabled()) {  
             //logger.debug(clazz.getSimpleName()+"[" + sb.toString() + "]");  
             logger.debug(BeanUtils.describe(object));  
         }  
         return object;  
     }  
     /** 
      * 创建对象. 
      * @param clazz 
      * @return 
      */  
     private Object newInstance(Class clazz){  
         try{  
             return  clazz.newInstance();  
         }catch(Exception e){  
             logger.error(e.getMessage());  
         }  
         return null;  
     }  
     public static void main(String[] args) throws Exception {  
         HSSFWorkbook book = new HSSFWorkbook(new FileInputStream("e:\\project\\test.xls"));  
           
         Properties pro=new Properties();  
         pro.load(ExcelToCollectionUtil.class.getClassLoader().getResourceAsStream("CustomerProxy.properties"));  
         ExcelToCollectionUtil util = new ExcelToCollectionUtil(pro, book, CustomerProxy.class);  
         Collection col=util.toCollection();  
         Iterator it=col.iterator();  
         while(it.hasNext()){  
             CustomerProxy con=(CustomerProxy) it.next();  
             System.out.println(con.getName()+" "+con.getValidStateString()+" "+con.getGradeString()+" "+con.getRegisterConsultantString());  
         }  
         util.showException();  
           
     }  
   
 } 
 
分享到:
评论
4 楼 sunxboy 2014-09-10  
用的apache poi 包
3 楼 u010100704 2014-09-03  
晕死!
2 楼 gaoyue999 2009-12-21  
给的类也不全,郁闷。
1 楼 gaoyue999 2009-12-21  
用到了什么jar包也说一下好不,要不怎么查。。

相关推荐

    开博第一篇: 一个Excel转换Java集合的工具类

    标题 "开博第一篇:一个Excel转换Java集合的工具类" 涉及到的核心知识点是将Excel数据转换为Java集合对象,这是在处理大量数据导入导出时常见的需求。这个工具类的主要功能可能是解析Excel文件,将其内容映射到Java...

    java中,list集合数据导出到excel表格通用工具类

    本实例提供了一个通用工具类,能够处理多种不同类型的对象集合,实现了最大化的通用性,使得开发者可以灵活地将各种业务数据转化为易于查看和分析的Excel格式。 首先,我们需要了解Java中处理Excel文件的库,如...

    java_poi导入excel通用工具类

    工具类通常会有一个方法,接受一个 List 对象,然后遍历Excel的每一行,对每行数据调用之前提到的对象赋值逻辑。 5. **指定坐标的赋值**: - 这种功能可能用于处理复杂的情况,比如数据不按常规的列对应方式排列,...

    Java 导出excel工具类(封装,带导出格式和类型转换)

    * 导出excel(利用反射机制) * String[] title = {"订单号","商品名称","商品价格","创建时间"}; * String[] field = {"orderNum","productName","productPrice","createTime"}; * ExportTools.export("sellJoin...

    Excel列表转化成java对象

    综上所述,"Excel列表转化成java对象"是一个涉及文件读取、数据解析、对象映射和集合操作的综合过程。Java提供了丰富的库和工具,如Apache POI、OpenCSV和JAXB,来支持这一过程,使得在Java应用中处理Excel和CSV数据...

    excel导入导出(poi工具类).zip

    导入Excel数据通常涉及到读取Excel文件并将其内容转换为程序可以处理的数据结构,如Java集合或数据库记录。使用Apache POI,你可以创建`Workbook`对象来代表整个Excel文件,然后通过`Sheet`对象访问工作表,再用`...

    Excel工具类.zip

    这个"Excel工具类.zip"文件包含了一个完整的解决方案,用于在本地和服务器环境中导出Excel文件,同时还提供了测试用的jar包,确保了功能的可行性。 首先,让我们详细了解一下Excel工具类的主要功能和原理。在Java...

    poi excel转换成bean

    标题“poi excel转换成bean”涉及到的关键技术是使用Apache POI从Excel文件中读取数据并将其映射到Java Bean对象中。这个过程在处理大量结构化数据时特别有用,例如导入数据库或进行数据分析。 首先,我们需要理解...

    java开发常用工具类

    本文将详细解析"java开发常用工具类"中的关键知识点,包括日历、时间处理、Excel导出、网络请求、流操作、数据处理、数值计算以及XML和Web工具类。 1. **日历和时间处理**: Java中`java.util.Calendar`和`java....

    Excel 数据导入、导出 工具类 源码

    本主题聚焦于一个名为"Excel数据导入、导出工具类"的源码,它利用了Java的反射机制来实现高效且灵活的功能。以下是关于这个工具类及其核心知识点的详细解释。 首先,我们需要理解什么是反射。在Java中,反射是一种...

    导出实体list集合的工具类

    "导出实体list集合的工具类"是一个非常实用的编程工具,它简化了从Java程序中导出List对象到外部文件的过程。这个工具类可能包含了多个方法,用于处理不同类型的数据导出需求,如Excel表格、CSV文件等。 在提供的...

    Java通过反射将 Excel 解析成对象集合实例

    4. 工具类编写:在编写工具类时,需要使用 Java 反射机制将 Excel 文件中的数据解析成对象集合实例。 5. 反射机制在 Java 中的应用:反射机制在 Java 中有广泛的应用,例如将 Excel 文件中的数据解析成对象集合实例...

    java通用的导入导出excel工具

    使用这个工具时,通常会有一个示例代码或者教程,展示如何初始化、读取Excel、创建Java对象、写入Excel等基本操作。 总结来说,"java通用的导入导出excel工具"利用Java反射机制和Apache POI库实现了对Excel文件的...

    常用的Java工具类

    Java工具类是Java编程中非常重要的组成部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常是静态方法的集合,无需实例化对象就能直接调用,大大提高了代码的可读性和实用性...

    java工具类汇总

    - Apache POI:这是一个流行的Java API,用于读写Microsoft Office格式的文件,包括Excel。主要类有`XSSFWorkbook`(用于创建.xlsx文件)和`HSSFWorkbook`(用于创建.xls文件)。 - OpenCSV:虽然主要处理CSV文件...

    java开发常用工具类包.zip

    "java开发常用工具类包.zip"就是一个这样的资源集合,包含了一系列实用的工具类,便于开发人员在项目中快速集成和使用。下面将详细阐述这个压缩包中的主要知识点。 1. **AES加解密工具类**: AES(Advanced ...

    导出实体集合工具类2.rar

    标题中的"导出实体集合工具类2.rar"表明这是一个用于导出实体类集合的Java工具类库,可能是一个便于开发者快速实现数据导出功能的组件。这类工具通常简化了将数据库中的实体对象转换为可下载的Excel或其他表格格式的...

    jxl导出excel工具类

    本文将详细介绍如何使用`jxl`库创建一个导出Excel的工具类,以及这个工具类如何帮助我们简化代码,提高效率。 首先,`jxl`库提供了对Excel文件的读写支持,包括工作簿(Workbook)、工作表(Worksheet)、行(Row)...

Global site tag (gtag.js) - Google Analytics