个人使用向7:easypoi EXCEL导入去空格

场景:系统存在客户可以通过上传excel来输入一些产品数据。对应用户输入数据校验是进行精确校验。所以输入的数据需要首尾去空格,因为空格肉眼无法判断是否存在,但是对应数据进行精确匹配时候回匹配上。

处理办法:处理首尾空格不是有手就行吗?
那个String自带的trim()去重。自测通过,代码直接上去生产。

but 事情并不像我想的那么单纯。
首先是大前提,保证产品的准确性下,去除首尾空格。
因为产品本身自带可能用空格是允许的,但是首尾是无意义的空格。所以我应该只考虑String 的 trim();
这里我罗列一下我看到的不错的参考

String str = " Hello Word! ";

//方法1:String.trim();trim()是去掉首尾空格
System.out.println("1:"+str.trim());

//方法2:str.replaceAll(" ", ""); 去掉所有空格,包括首尾、中间
String str2 = str.replaceAll(" ", ""); 
System.out.println("2:"+str2); 

//方法3:或者replaceAll(" +",""); 去掉所有空格,包括首尾、中间
String str3 = str.replaceAll(" +", ""); 
System.out.println("3:"+str3); 

//方法4:、str = .replaceAll("\\s*", "");可以替换大部分空白字符, 不限于空格 ; \s 可以匹配空格、制表符、换页符等空白字符的其中任意一个。
String str4 = str.replaceAll("\\s*", ""); 
System.out.println("4:"+str4);

但是我没有想到是,我用了trim(),依然有空格进去?
我有点蒙蔽,是我代码提交姿势不对吗?我又去验证了。要来测试excel,我自己添加了正确产品数据,然后前后加任意空格。导入之后我这条数据OJBK,其余带空格数据依然存在。那么继续找不同。
在这里插入图片描述
这是我创建的空格,对应字体是Arial,跟前面一致。
但是下面就很奇葩了。
在这里插入图片描述
为什么这里的空格是宋体??? 宋体的删除不掉。
或者是其他?这是一个疑问。
另外是 trim()的定义是什么?
源码是:

public String trim() {
    int len = value.length;
    int st = 0;
    char[] val = value;    /* avoid getfield opcode */

    while ((st < len) && (val[st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}

源码大意是 对应字符串弄成char[] ,然后进行首尾二端开始的比较,去除空格的,保留下来的就是首尾不是空格的。逻辑也很清楚很对。那么空格的判断依据是什么?对应判断依据是 ascii 码。对应空格的ASCII码是32,那么你char出来之后的单个ascii码是32,就认为你是空格。就没得了。
很好,知道了大致原理,可以开始搞事了。

 if (excelFrom.getSkfPartNo() != null) {
                    char[] chars = excelFrom.getSkfPartNo().toCharArray();
                    log.info("验证");
                    if (excelFrom.getSkfPartNo().trim().length() > 250) {
                        itoInquiryItem.setSkfProductDsgn(excelFrom.getSkfPartNo().trim().substring(0, 250));
                    } else {
                        itoInquiryItem.setSkfProductDsgn(excelFrom.getSkfPartNo().trim());
                    }
                }

这是项目的代码,就是对进行校验。
出现结果如下:
在这里插入图片描述
32 通过校验,是正常的空格。

在这里插入图片描述
然后就是不正经的看着像空格的 12288。

补:处于好奇我去看了一下ASCII 表的数据。
对应 空格的确是32。但是其他好像一般是256。

在这里插入图片描述
在这里插入图片描述
所以 12288是标识什么?
#12288=全角字符 ,也就是12288 是全角字符的空格。那么也就破案了。因为字体Arial下,空格应该是半角空格,所以32是正确的。对应的12288是宋体,给你整了全角的空格。所以就是为什么二个字体不一样,到程序中就是trim没办法解析。
网上的处理方式:
对应全角替换成 “”,然后进行trim();

str = str.replace((char) 12288, ' ');
str=str.trim();

不过因为项目需求中,在产品内部的空格没办法去除,替换就会导致产品不准。所以这个还是满足去空格功能还是可以正常实现。先空格替换,然后去除首尾空格。似乎可以满足条件

??????为什么打问号呢,因为网上普遍都是 poi导入的excel 存在默认值为160的情况。
在这里插入图片描述
比如上面这样的,但是我的是12288.同时也存在这个160.我略一思索,如果接下这个处理任意空格的,那么代码写死也赶不上乱七八糟出现的空格。所以机智的我,否了这个需求。
在这里插入图片描述
这就很nice啊。

不过如果仅仅只是poi导入的字符串空格ACCILL值 是160的话。对应上面处理方式很值得借用。

/**
     * @Description: 自定义去空格 excel专用     poi导入的字符串空格ASCll值:160,而空格(Space)的ASCII码值是:32
     * @Author: 
     * @Date: 14:44 2019/4/1
     */
    public static String StringTrim(String str){
        return str.replaceAll("[\\s\\u00A0]+","").trim();
    }

本次百度大力支持的参考网址是 : https://www.cnblogs.com/w-yu-chen/p/10636463.html


漫漫长路,一个小周跟他一个小陈朋友一起努力奔跑。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值