根据XML配置规则导入Excel数据(五)ExcelReader XLS解析类

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dba10g.blog.51cto.com/764602/756538
 
ExcelReader.java
 
 
package com.ivfly.xlsbean; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.lang.reflect.InvocationTargetException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.commons.beanutils.BeanUtils; 
import org.apache.commons.beanutils.PropertyUtils; 
import org.apache.commons.lang.math.NumberUtils; 
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 org.apache.poi.poifs.filesystem.POIFSFileSystem; 

public  class ExcelReader { 
    
  @SuppressWarnings( "unchecked"
   public  static List<ExcelAble>    parseXls2Beans(BeanSpecification bean, String dir,String fileName){ 
    bean.setFileName(fileName); 
     try { 
       return (List<ExcelAble>)xlsToBean(dir,bean); 
    }  catch (Exception e) { 
      e.printStackTrace(); 
    } 
     return  null
  } 
    
  @SuppressWarnings( "unchecked"
   private  static List<ExcelAble> xlsToBean(String dir,BeanSpecification bean)  throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { 

    String fileName =    dir+bean.getFileName(); 

    POIFSFileSystem poi =  new POIFSFileSystem( new FileInputStream(fileName)); 
    HSSFWorkbook wb =  new HSSFWorkbook(poi); 
    HSSFSheet sheet = wb.getSheetAt(0); 
     int headCol = 0; 
     int fromCol = 1; 
     if (bean.getHead() !=  null) { 
      headCol = bean.getHead() - 1 < 0 ? 0 : bean.getHead() - 1; 
    } 
     if (bean.getHead() !=  null) { 
      fromCol = bean.getFrom() - 1 < 1 ? 1 : bean.getFrom() - 1; 
    } 
     /** 
     * 解析头部信息 
     */
 
    HSSFRow head = sheet.getRow(headCol); 
     int cols=head.getPhysicalNumberOfCells(); 
    String[] p =  new String[cols]; 
     for ( int j = 0; j < cols; j++) { 
      HSSFCell cell = head.getCell(j); 
      String col = cell.getStringCellValue(); 
       if (bean.getPropertyNameByValue(col) !=  null) { 
        p[j] = bean.getPropertyNameByValue(col); 
      } 
    } 
    Class clazz = Class.forName(bean.getClassName()); 
    List<ExcelAble> result =  new ArrayList<ExcelAble>(); 
     int rows=sheet.getPhysicalNumberOfRows(); 
    begin: for ( int i = fromCol; i < rows; i++) { 
      HSSFRow row = sheet.getRow(i); 
      ExcelAble sh = (ExcelAble) clazz.newInstance(); //新建对象 
      XlsImpRule rule =  new XlsImpRule(); //为对象定义规则对象 
       for ( int j = 0; j < cols; j++) { 
         
        String propertyName = p[j]; //Bean 属性名称 
         
         if (propertyName ==  null) { 
           continue
        } 
        Object value =  null
        HSSFCell cell = row.getCell(j); 
         if(cell== null){ 
           if(!bean.nullable(propertyName)) { 
             break begin; 
          } else
             continue
          } 
        } 
         //获取单元格的值 
         switch (cell.getCellType()) { 
         case HSSFCell.CELL_TYPE_FORMULA: 
           //TODO 这里或许有情况 
           if (HSSFDateUtil.isCellDateFormatted(cell)) { 
            value = cell.getDateCellValue(); 
          }  else { 
            value = cell.getStringCellValue(); 
          } 
           break
         case HSSFCell.CELL_TYPE_STRING: 
          value = cell.getStringCellValue(); 
           //字符串比较特殊,当此列不能为空的时候,空字符串也不行 
           if(FileUtil.isEmpty((String)value)){ 
             if(!bean.nullable(propertyName)) { 
               break begin; 
            } 
          } 
           break
         case HSSFCell.CELL_TYPE_NUMERIC: 
           if (HSSFDateUtil.isCellDateFormatted(cell)) { 
            value = cell.getDateCellValue(); 
          } else
            value = cell.getNumericCellValue(); 
          } 
           break
         case 3: 
          value =  null
           if(1==1){ 
             throw  new RuntimeException(); 
          } 
           if(!bean.nullable(propertyName)) { 
             break begin; 
          } else
             break
          } 
         case HSSFCell.CELL_TYPE_BOOLEAN: 
          value = cell.getBooleanCellValue(); 
           break
         case HSSFCell.CELL_TYPE_ERROR: 
          value = cell.getErrorCellValue(); 
           break
         default
           break
        } //获取单元格的值 
         
//        if() 
         try { 
          Class type = PropertyUtils.getPropertyType(sh,propertyName); 
           if(Integer. class ==type ||  int. class == type){ 
             try { 
              String valueOf = String.valueOf(value); 
              value = Integer.valueOf(valueOf); 
               //value = NumberUtils.toInt(value.toString()); 
            }  catch (Exception e) { 
               if(Double. class == value.getClass()){ 
                value = ((Double)value).intValue(); 
              } else
                value = 0; 
              } 
            } 
          } 
           if(Long. class ==type ||  long. class == type){ 
            System.out.println(propertyName+ "是Long形"); 
          } 
        }  catch (InvocationTargetException e1) { 
          e1.printStackTrace(); 
        }  catch (NoSuchMethodException e1) { 
          e1.printStackTrace(); 
        } 
         //依次验证行的每个单元格 
        Boolean pv = rule.validateProperty(bean,propertyName,value); 
         if(!pv){ //验证不通过    
          sh.setCheck( false); //设置数据对象验证不通过 
          rule.addPropertyWarrning(i,bean,propertyName); 
        } 
         try { 
          BeanUtils.setProperty(sh, propertyName, value); 
        }  catch (Exception e) { 
          e.printStackTrace(); 
        } 
      } 
       if(!sh.isCheck()){ 
        sh.setMessage(rule.reportWarrning()); 
      }        
      result.add(sh); 
    } 
     return    result; 
  } 

 
解析类,使用了BeanUtils 提供的方法,自动为属性赋值。有一个问题,当Excel中为数字类型时,如果对象的属性为Integer(int)、Long(long)时,会转换不成功。
所以添加了如下语句
         try { 
          Class type = PropertyUtils.getPropertyType(sh,propertyName); 
           if(Integer. class ==type ||  int. class == type){ 
             try { 
              String valueOf = String.valueOf(value); 
              value = Integer.valueOf(valueOf); 
               //value = NumberUtils.toInt(value.toString()); 
            }  catch (Exception e) { 
               if(Double. class == value.getClass()){ 
                value = ((Double)value).intValue(); 
              } else
                value = 0; 
              } 
            } 
          } 
           if(Long. class ==type ||  long. class == type){ 
            System.out.println(propertyName+ "是Long形"); 
          } 
        }  catch (InvocationTargetException e1) { 
          e1.printStackTrace(); 
        }  catch (NoSuchMethodException e1) { 
          e1.printStackTrace(); 
        } 
 
当为对象填充值时,添加验证功能。
       //依次验证行的每个单元格 
        Boolean pv = rule.validateProperty(bean,propertyName,value); 
         if(!pv){ //验证不通过    
          sh.setCheck( false); //设置数据对象验证不通过 
          rule.addPropertyWarrning(i,bean,propertyName); 
        } 
  

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/756538

目录
相关文章
|
14天前
|
数据采集 消息中间件 监控
Flume数据采集系统设计与配置实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入探讨Apache Flume的数据采集系统设计,涵盖Flume Agent、Source、Channel、Sink的核心概念及其配置实战。通过实例展示了文件日志收集、网络数据接收、命令行实时数据捕获等场景。此外,还讨论了Flume与同类工具的对比、实际项目挑战及解决方案,以及未来发展趋势。提供配置示例帮助理解Flume在数据集成、日志收集中的应用,为面试准备提供扎实的理论与实践支持。
25 1
|
17天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
28天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
38 0
|
29天前
|
XML 存储 Java
Spring重要类解析
Spring重要类解析
20 0
|
1月前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Teacher.hbm.xml
hibernate正向生成数据库表以及配置——Teacher.hbm.xml
13 1
|
3天前
|
JavaScript IDE 编译器
TypeScript中模块路径解析与配置:深入剖析与最佳实践
【4月更文挑战第23天】本文深入探讨了TypeScript中模块路径解析的原理与配置优化,包括相对路径、Node.js模块解析和路径别名。通过配置`baseUrl`、`paths`、`rootDirs`以及避免裸模块名,可以提升开发效率和代码质量。建议使用路径别名增强代码可读性,保持路径结构一致性,并利用IDE插件辅助开发。正确配置能有效降低维护成本,构建高效可维护的代码库。
|
3天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析
Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析
7 0
Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析
|
3天前
|
XML Java 数据库连接
Javaweb之Mybatis的XML配置文件的详细解析
Javaweb之Mybatis的XML配置文件的详细解析
13 0
|
7天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
15 1
|
8天前
|
域名解析 网络协议 Linux
TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍
TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍

推荐镜像

更多