使用CsvMapReader转CSV到Excel时遇SuperCsvException(数组大小不匹配)求助
解决SuperCsvException: nameMapping数组与sourceList大小不一致的问题
你遇到的这个异常指向性很明确:nameMapping length = 0, sourceList size = 11——意思是你传给CsvMapReader.read()的列名映射数组是空的,但你的CSV每行有11列数据,两者长度不匹配直接触发了报错。
看你的代码,其实你已经获取到了CSV的表头:
final String[] headers = csvMapReader.getHeader(true);
但你调用read()的时候没把这个表头数组传进去!CsvMapReader.read()的无参重载默认会用空数组作为nameMapping,这就导致了大小不匹配的问题。
修改方法很简单,把headers数组传给read()方法:
while ((csvRow = csvMapReader.read(headers)) != null) { // 这里传入headers作为nameMapping rowNo++; Row excelRow = sheet.createRow(rowNo); createExcelRow(csvRow, excelRow, fName); }
为什么这样改?
csvMapReader.getHeader(true)已经读取了CSV的第一行作为表头数组,这个数组的长度正好和你的CSV列数一致(11列)。- 把它传给
read(headers)后,SuperCSV会将每行的11列数据对应到Map中,以表头字符串作为键,这样nameMapping和sourceList的大小就完全匹配了,异常自然就消失了。
额外注意事项
- 确认你的CSV文件确实有合法的表头行,如果表头行有缺失或者空值,可能需要调整
getHeader()的参数(比如getHeader(false)不跳过表头行,或者自己手动构造nameMapping数组)。 - 如果你的CSV没有表头,你可以手动创建一个长度为11的字符串数组作为nameMapping,比如
final String[] nameMapping = {"col1", "col2", ..., "col11"};,只要保证长度和列数一致即可。
内容的提问来源于stack exchange,提问作者Gayathri
相关产品推荐
相关产品推荐

