根据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

目录
相关文章
|
7月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
1116 10
|
2月前
|
存储 安全 大数据
网安工程师必看!AiPy解决fscan扫描数据整理难题—多种信息快速分拣+Excel结构化存储方案
作为一名安全测试工程师,分析fscan扫描结果曾是繁琐的手动活:从海量日志中提取开放端口、漏洞信息和主机数据,耗时又易错。但现在,借助AiPy开发的GUI解析工具,只需喝杯奶茶的时间,即可将[PORT]、[SERVICE]、[VULN]、[HOST]等关键信息智能分类,并生成三份清晰的Excel报表。告别手动整理,大幅提升效率!在安全行业,工具党正碾压手动党。掌握AiPy,把时间留给真正的攻防实战!官网链接:https://www.aipyaipy.com,解锁更多用法!
|
5月前
|
分布式计算 Hadoop 大数据
从Excel到Hadoop:数据规模的进化之路
从Excel到Hadoop:数据规模的进化之路
93 10
|
7月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
7月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
160 6
|
9月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
442 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
9月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
9月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
166 0
|
2月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
9月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
195 1