现在版本中,autotrim开启时,去除的只有半角空格。如果是其他空白字符(比如全角空格、office换行空格等),默认是不会去除的,如果在导入的为数字类型下会直接报错,让用户一个个手动去除的话,大数据量下几乎没法完成。如果社区需要这个功能,我很高兴提供PR。
[alibaba/easyexcel]功能增强建议:autotrim由去除半角空格,改为去除所有空白字符
回答
这是由于解析器导致的问题,不是autotrim的问题。
如果trim能自动去除单元格中数字前后的其他空白字符,那么解析器应该就不会报错了,我觉得这样对用户更友好
那等于修改了元数据,这个trim应该是解析器做的事,但是会影响效率。默认的暂时不考虑修改 建议你自定义解析器
如果默认是去掉所有空白字符是会影响一点效率。可以增加一个选项让用户选择,让用户决定是只去掉半角空格还是所有空白字符,默认还是只去掉半角空格
你现在不是要解决问题么。。 好的方式是自定义解析器。 这个问题下版本修复的时候会通过修改默认解析器的方式解决
项目中的问题,我是通过扩展IntegerStringConverter,StringStringConverter,LongStringConverter、BigDecimalStringConverter等类,重写convertToJavaData方法解决了。同时使用EasyeExcel.read().registerConverter()方法全部注册进去。提这个建议,是希望库本身支持这个特性(去掉空白字符),不用对每种数据类型都写一个Converter,然后每次使用时都注册进去,这样很麻烦
如果下个版本能支持,那就非常好了,😊
你的方式和思路是非常正确。 下个版本会的,转换器应该会大改一个版本
谢谢了,期待
我也遇到同样的问题,现在的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;
}
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中文空格的,上面这个写法简洁一点
发现一种改变全局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);
}
}