[alibaba/easyexcel]功能增强建议:autotrim由去除半角空格,改为去除所有空白字符

2023-12-11 316 views
7
建议描述

现在版本中,autotrim开启时,去除的只有半角空格。如果是其他空白字符(比如全角空格、office换行空格等),默认是不会去除的,如果在导入的为数字类型下会直接报错,让用户一个个手动去除的话,大数据量下几乎没法完成。如果社区需要这个功能,我很高兴提供PR。

回答

1

这是由于解析器导致的问题,不是autotrim的问题。

8

如果trim能自动去除单元格中数字前后的其他空白字符,那么解析器应该就不会报错了,我觉得这样对用户更友好

9

那等于修改了元数据,这个trim应该是解析器做的事,但是会影响效率。默认的暂时不考虑修改 建议你自定义解析器

1

如果默认是去掉所有空白字符是会影响一点效率。可以增加一个选项让用户选择,让用户决定是只去掉半角空格还是所有空白字符,默认还是只去掉半角空格

9

你现在不是要解决问题么。。 好的方式是自定义解析器。 这个问题下版本修复的时候会通过修改默认解析器的方式解决

9

项目中的问题,我是通过扩展IntegerStringConverter,StringStringConverter,LongStringConverter、BigDecimalStringConverter等类,重写convertToJavaData方法解决了。同时使用EasyeExcel.read().registerConverter()方法全部注册进去。提这个建议,是希望库本身支持这个特性(去掉空白字符),不用对每种数据类型都写一个Converter,然后每次使用时都注册进去,这样很麻烦

4

如果下个版本能支持,那就非常好了,😊

2

你的方式和思路是非常正确。 下个版本会的,转换器应该会大改一个版本

2

谢谢了,期待

3

image

image

我也遇到同样的问题,现在的trim只能去除半角空格,可以参考这段代码就可以trim所有的空格

/**
参考String.trim,加入了不连续空格nbsp;unicode160和汉字空格unicode12288
**/
   public static String trim(String text){
       int len = text.length();
       int st = 0;
       char[] val = text.toCharArray();
       char p;
       while ((st < len) && ((p=val[st]) <= ' ' || p==160 || p==12288 )) {
           st++;
       }
       while ((st < len) && ((p =val[len - 1]) <= ' ' || p==160 || p==12288 )) {
           len--;
       }
       return ((st > 0) || (len < text.length())) ? text.substring(st, len) : text;
   }
1
    public static String trimStr(String text) {
        CharMatcher charMatcher = CharMatcher.whitespace()
                .or(CharMatcher.is((char) 160))
                .or(CharMatcher.is((char) 12288));

        return charMatcher.trimFrom(text);
    }

作为国内用户autoTrim大家都会认为会自动trim中文空格的,上面这个写法简洁一点

5

发现一种改变全局converter的方法:easyexcel版本:3.2.1 @Slf4j @Component public class CustomerDefaultConverterLoader implements ApplicationRunner {

@Override
public void run(ApplicationArguments args) throws Exception {
    log.info("=====加载自定义easyexcel的converter开始");
    Map<ConverterKeyBuild.ConverterKey, Converter<?>> allConverter = DefaultConverterLoader.loadAllConverter();
    putCustomConverter(allConverter, new CustomBigDecimalStringConverter());
    putCustomConverter(allConverter, new CustomIntegerStringConverter());
    putCustomConverter(allConverter, new CustomLongStringConverter());
    putCustomConverter(allConverter, new CustomStringStringConverter());
    putCustomConverter(allConverter, new CustomDateStringConverter());
    log.info("=====加载自定义easyexcel的converter结束:" + allConverter.size());
}

private void putCustomConverter(Map<ConverterKeyBuild.ConverterKey, Converter<?>> allConverter,
        Converter<?> converter) {
    allConverter.put(ConverterKeyBuild.buildKey(converter.supportJavaTypeKey(), converter.supportExcelTypeKey()),
            converter);
}

}