You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:02