EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List
Posted lyterrific
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List相关的知识,希望对你有一定的参考价值。
业务场景
将一些对象数据导出到excel文件中,其中字符串列表类型的字段要以json字符串的形式导出。例如
public class MyData
@ExcelProperty(value = "a")
private Integer a;
@ExcelProperty(value = "b")
private List<String> b;
MyData
类对象的List<String> b
属性要以json字符串的形式输出到excel里:["xxxx","xxxx","xxxx"]
在使用EasyExcel导出时,报错如下:
com.alibaba.excel.exception.ExcelDataConvertException: Can not find 'Converter' support class List.
原因及解决方式
EasyExcel自身实现了一些常用类型的Converter
来支持excel数据到对象的转换,例如 BigDecimal、Bolean、Byte[]、btye[]、Byte、Date、Double、File、Float、InputStream、Integer、Long、Short、Url。若使用了其他数据类型 或 想定制化数据转换方式,需要实现自己的Converter
,并在使用EasyExcel时注册。
这个业务场景,需要实现将List类型数据与String的转换。实现方式:
第一步,实现Converter
接口
public class ListStringConverter implements Converter<List>
@Override
public Class<List> supportJavaTypeKey()
return List.class;
@Override
public CellDataTypeEnum supportExcelTypeKey()
return CellDataTypeEnum.STRING;
@Override
public List convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty
, GlobalConfiguration globalConfiguration) throws Exception
//从excel中读数据时被EasyExcel调用
String stringValue = cellData.getStringValue();
//用json转换工具将excel单元格中数据转换为java List<String>对象
List<String> list = JSONUtil.toList(stringValue, String.class);
return list;
@Override
public CellData convertToExcelData(List list, ExcelContentProperty excelContentProperty
, GlobalConfiguration globalConfiguration) throws Exception
//写excel文件时被EasyExcel调用
//用json转换工具将List对象转换为json字符串
String json = JSONUtil.toJsonStr(list);
return new CellData(json);
第二步,在导出时,将ListStringConverter
注册
//这里为全局注册,后面会讲到
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), MyData.class)
.registerConverter(new ListStringConverter()).build();
到此,导出成功
小延伸
-
LocalDateTime
类型数据比较常用,但EasyExcel自身也不支持。浅实现一下LocalDateTime
的Converter
。public class LocalDateTimeConverter implements Converter<LocalDateTime> private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public Class<LocalDateTime> supportJavaTypeKey() return LocalDateTime.class; @Override public CellDataTypeEnum supportExcelTypeKey() return CellDataTypeEnum.STRING; @Override public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) return LocalDateTime.parse(cellData.getStringValue(), DATE_TIME_FORMATTER); @Override public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) return new CellData<>(value.format(DATE_TIME_FORMATTER));
-
Converter
注册到EasyExcel的方式-
针对对象的特定字段指定转换器,其他字段不受影响:在字段上使用@ExcelProperty注解,通过设置converter参数的方式注册
public class MyData @ExcelProperty(value = "b", converter = ListStringConverter.class) private List<String> b; @ExcelProperty(value = "c") private List<String> c; //字段c未配置converter,不会按ListStringConverter指定方式转换
-
全局注册,影响所有相同类型数据的转换
//写excel时注册 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), MyData.class) .registerConverter(new ListStringConverter()).build(); //读excel时注册 EasyExcel.read(fileName, MyData.class) .registerConverter(new ListStringConverter()).sheet().doRead();
-
完结撒花✿✿ヽ(°▽°)ノ✿
EasyExcel单元格数据超过32767报错问题处理
EasyExcel单元格数据超过32767报错问题处理
EasyExcel描述
EasyExcel是一款基于Java的简单、省内存的读写Excel的开源项目。官网。使用起来确实比较方便,但是对于一些比较复杂的场景,比如多单元格,现在的版本兼容不是很好,不过效率和使用上确实体验还可以。
问题描述
不过今天在做一个数据量很大的Excel表导出的时候,遇到一个异常,这个字段数据量太多了,导出时候直接抛出如下异常:
IllegalArgumentException: The maximum length of cell contents (text) is 32,767 characters
看起来好像是超过框架限制了
在poi3.7.1版本找到代码org.apache.poi.hssf.usermodel.HSSFCell#setCellValue(org.apache.poi.ss.usermodel.RichTextString)
:
public void setCellValue(RichTextString value)
int row=_record.getRow();
short col=_record.getColumn();
short styleIndex=_record.getXFIndex();
if (value == null)
notifyFormulaChanging();
setCellType(CellType.BLANK, false, row, col, styleIndex);
return;
if(value.length() > SpreadsheetVersion.EXCEL97.getMaxTextLength())
throw new IllegalArgumentException("The maximum length of cell contents (text) is 32,767 characters");
if (_cellType == CellType.FORMULA)
// Set the 'pre-evaluated result' for the formula
// note - formulas do not preserve text formatting.
FormulaRecordAggregate fr = (FormulaRecordAggregate) _record;
fr.setCachedStringResult(value.getString());
// Update our local cache to the un-formatted version
_stringValue = new HSSFRichTextString(value.getString());
// All done
return;
// If we get here, we're not dealing with a formula,
// so handle things as a normal rich text cell
if (_cellType != CellType.STRING)
setCellType(CellType.STRING, false, row, col, styleIndex);
int index = 0;
HSSFRichTextString hvalue = (HSSFRichTextString) value;
UnicodeString str = hvalue.getUnicodeString();
index = _book.getWorkbook().addSSTString(str);
(( LabelSSTRecord ) _record).setSSTIndex(index);
_stringValue = hvalue;
_stringValue.setWorkbookReferences(_book.getWorkbook(), (( LabelSSTRecord ) _record));
_stringValue.setUnicodeString(_book.getWorkbook().getSSTString(index));
解决方法
在网上搜索,整理一下两种处理方法:
- 复制
org.apache.poi.ss.SpreadsheetVersion
代码到项目里,包路径这些不能修改,然后找到EXCEL2007(0x100000, 0x4000, 255, Integer.MAX_VALUE, 64000, 32767);
,修改最后面的值,可以修改为Integer.MAX_VALUE
- 通过反射机制修改
public static void resetCellMaxTextLength()
SpreadsheetVersion excel2007 = SpreadsheetVersion.EXCEL2007;
if (Integer.MAX_VALUE != excel2007.getMaxTextLength())
Field field;
try
// SpreadsheetVersion.EXCEL2007的_maxTextLength变量
field = excel2007.getClass().getDeclaredField("_maxTextLength");
// 关闭反射机制的安全检查,可以提高性能
field.setAccessible(true);
// 重新设置这个变量属性值
field.set(excel2007,Integer.MAX_VALUE);
catch (Exception e)
e.printStackTrace();
参考资料
以上是关于EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List的主要内容,如果未能解决你的问题,请参考以下文章
开发错误记录阿里easyexcel报错java.lang.NoClassDefFoundError: org/apache/commons/collections4/CollectionUtils
开发错误记录阿里easyexcel报错java.lang.NoClassDefFoundError: org/apache/commons/collections4/CollectionUtils
使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy,并不Easy
EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List