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

目录
相关文章
|
8月前
|
Python
如何根据Excel某列数据为依据分成一个新的工作表
在处理Excel数据时,我们常需要根据列值将数据分到不同的工作表或文件中。本文通过Python和VBA两种方法实现该操作:使用Python的`pandas`库按年级拆分为多个文件,再通过VBA宏按班级生成新的工作表,帮助高效整理复杂数据。
|
8月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
10月前
|
存储 安全 大数据
网安工程师必看!AiPy解决fscan扫描数据整理难题—多种信息快速分拣+Excel结构化存储方案
作为一名安全测试工程师,分析fscan扫描结果曾是繁琐的手动活:从海量日志中提取开放端口、漏洞信息和主机数据,耗时又易错。但现在,借助AiPy开发的GUI解析工具,只需喝杯奶茶的时间,即可将[PORT]、[SERVICE]、[VULN]、[HOST]等关键信息智能分类,并生成三份清晰的Excel报表。告别手动整理,大幅提升效率!在安全行业,工具党正碾压手动党。掌握AiPy,把时间留给真正的攻防实战!官网链接:https://www.aipyaipy.com,解锁更多用法!
|
8月前
|
Python
将Excel特定某列数据删除
将Excel特定某列数据删除
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
3446 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
分布式计算 Hadoop 大数据
从Excel到Hadoop:数据规模的进化之路
从Excel到Hadoop:数据规模的进化之路
303 10
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
2365 10
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
831 4
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
211 0

推荐镜像

更多
  • DNS