对str!=null &&str!="" 项目中的场景——对空值和空串的升级版,还有空白字符等等。

来源:互联网 发布:java三大框架简述 编辑:程序博客网 时间:2024/06/16 22:46

实际项目的场景并非只有这两种情况,

所以要借助工具类来解决项目中遇到的问题:

我遇到的问题是:从excel读取数据的时候,如果是空数据的话,一直报异常,空数据的情况很多,并不只是单单的“非空”,“非空串”还有其他的.....(这是重点!)


我的代码如下:

package com.cmf.otc.chinamoney.data.common;


import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;


/** 将excel转化为List<T>列表 */
public class Excel2ObjectUtil {


public static <T> List<T> translate(Map<String, String> map,Class<T> clazz,Sheet sheet,int dataRowBeginIndex) throws InstantiationException, IllegalAccessException{


Map<String, Integer> fieldName2ExcelColumnIndexMap = new HashMap<String, Integer>();
Iterator<String> it = map.keySet().iterator();

while(it.hasNext()){

String key = it.next();
String mapKey = key.replaceAll("_", "").toLowerCase();
fieldName2ExcelColumnIndexMap.put(mapKey, Integer.valueOf((String)map.get(key)));
}

if(sheet.getLastRowNum() <dataRowBeginIndex){
return new ArrayList<>();
}

//反射获取目标实体类的属性列表
        Field[] fields = clazz.getDeclaredFields();
        List<T> returnList = new ArrayList<>();
        //遍历数据行
        for(int i = dataRowBeginIndex; i < sheet.getLastRowNum() + dataRowBeginIndex; i++){
        Row row = sheet.getRow(i);
        if(row==null || row.getCell(0) == null){//因为 sheet.getLastRowNum() 获取不到真实的行数,所以通过这种方式判断
        break;
        }
       
        T obj = clazz.newInstance();
       
       
        for(int j = 0; j < fields.length; j++){
        try {
        //通过反射方式设置值
            String fieldName = fields[j].getName();
            if(fieldName2ExcelColumnIndexMap.containsKey(fieldName.toLowerCase())){
                int cellColumnIndex = fieldName2ExcelColumnIndexMap.get(fieldName.toLowerCase());
            Cell cell = row.getCell(cellColumnIndex);
                if(!fields[j].isAccessible()){
                fields[j].setAccessible(true);
                }
            if(cell!=null){
           
            if(cell.getCellTypeEnum() == CellType.NUMERIC){
                fields[j].set(obj, new BigDecimal(cell.getNumericCellValue()));
                    }else{
                    if(fields[j].getType() == String.class){
                        fields[j].set(obj, cell.getStringCellValue());
                    }else if(fields[j].getType() == Integer.class){
                    fields[j].set(obj, Integer.valueOf(cell.getStringCellValue()));
                    }else if(fields[j].getType() == BigDecimal.class){                    
                    fields[j].set(obj, StrToBigDecimal.change(cell.getStringCellValue()));//注意:这里就是无数据,所抛出的异常。
                    }
            }
            }
           
            }
} catch (Exception e) {
System.out.println("读取excel字段时错误,实体类字段名:"+fields[j].getName()+",错误消息:"+e.getMessage());
}
       
       
        }
       
        returnList.add(obj);


        }

return returnList;
}

}

//将没有数据的内容,如何转换成BigDecimal类型,这里面用到了:org.springframework.util.StringUtils里面的hasText(String str)方法.

package com.cmf.otc.chinamoney.data.common;


import java.math.BigDecimal;


import org.springframework.util.StringUtils;


/** 
* @author 作者 E-mail: 
* @version 创建时间:2017年8月29日 下午4:26:22 
* 类说明 
*/
public class StrToBigDecimal {
public static BigDecimal  change(String strBigDecimal){

if(StringUtils.hasText(strBigDecimal)){
return new BigDecimal(strBigDecimal.replaceAll(",",""));
}else{
return null;
}
}
}


附::大神对org.springframework.util.StringUtils里面的hasText(String str)方法解读:http://blog.csdn.net/chunqiuwei/article/details/8131298


阅读全文
0 0
原创粉丝点击