对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
- 对str!=null &&str!="" 项目中的场景——对空值和空串的升级版,还有空白字符等等。
- 判断字符串非空if(str!=null && str!=""){}
- str==null 与 null == str 判断字符串是否为空的最优化写法
- 关于str="" 和 str=null;的区别
- str = str.replaceAll("2","");//把2替换为空字符转
- str != null 和 null != null的区别
- 黑马程序员之修正认知:string、Empty和null三者的正确区别 判断字符串为空str.length==0最快
- isNull(str),isEmpty(str)和str=的区别
- isNull(str), isEmpty(str)和 str = ""的区别
- isNull(str),isEmpty(str)和str=""的区别
- isNull(str), isEmpty(str)和 str = ""的区别
- 空对象——对Null的代替
- string str = null 与 string str =""的区别
- str == null和str.length == 0 和"".equals(str)之区别
- string str=null;和string str="";的区别(网摘)
- stringstream 的.str()正确用法和清空操作
- stringstream 的.str()正确用法和清空操作
- stringstream 的.str()正确用法和清空操作
- 解决Visual Studio 2017隐藏“高级保存选项”命令
- quickSort(优化)
- java高并发,分布式,集群,高性能,程序设计架构师思路
- AOP面向切面编程
- mysql---备份数据
- 对str!=null &&str!="" 项目中的场景——对空值和空串的升级版,还有空白字符等等。
- spring boot 共享session redis实现
- 一元多项式的乘法运算(C语言)实现
- C# 字段与属性区别
- jackson 实体转json属性为NULL或者为空不参加序列化
- 125. Valid Palindrome
- 数据库的基本操作:索引、视图、导入和导出、备份和恢复
- easyUI datagrid(“load”,json 数据)
- vim快捷键