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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 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

目录
相关文章
|
1月前
|
域名解析 存储 缓存
DNS是什么?内网电脑需要配置吗?
【10月更文挑战第22天】DNS是什么?内网电脑需要配置吗?
323 1
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
机器学习/深度学习 调度
mmseg配置解析 Polynomial Decay 多项式衰减
Polynomial Decay(多项式衰减)是一种常用的学习率调度方法,通过多项式函数逐步减少学习率,帮助模型更好地收敛。公式为:\[ lr = (lr_{initial} - \eta_{min}) \times \left(1 - \frac{current\_iter}{max\_iters}\right)^{power} + \eta_{min} \]。参数包括初始学习率、最小学习率、当前迭代次数、总迭代次数和衰减指数。适用于需要平滑降低学习率的场景,特别在训练后期微调模型参数。
76 0
mmseg配置解析 Polynomial Decay 多项式衰减
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
111 0
|
2月前
|
编解码 计算机视觉
mmseg配置解析 align_corners=False
`align_corners=False` 是图像插值操作中的一个参数,影响输入和输出图像的角点对齐方式。`align_corners=True` 严格对齐角点,而 `align_corners=False` 均匀分布像素点,更适用于保持整体比例关系的任务,如语义分割。
48 0
|
2月前
|
机器学习/深度学习 编解码
mmseg配置解析 contract_dilation=True
`contract_dilation=True` 是 ResNetV1c 中的一种设置,用于解决多层膨胀卷积中的“栅格效应”。通过调整膨胀率,使卷积核在不同阶段更密集地覆盖输入特征图,避免信息丢失,提升特征提取质量,尤其在语义分割任务中效果显著。
53 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
53 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
88 0
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
83 2

推荐镜像

更多