报错信息:
java.lang.RuntimeException: com.opencsv.exceptions.CsvRequiredFieldEmptyException: Number of data fields does not match number of headers.
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:85)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.opencsv.exceptions.CsvRequiredFieldEmptyException: Number of data fields does not match number of headers.
at com.opencsv.bean.HeaderColumnNameMappingStrategy.verifyLineLength(HeaderColumnNameMappingStrategy.java:108)
at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:313)
at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:116)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:77)
... 3 more
原因:
excel文件分割符导致的,windows是逗号 Mac是分号 openCSV官网地址在下面
http://opencsv.sourceforge.net/#csvparser
解决办法:
我自己读取所有行,然后按照索引赋值,你们可以参考参考,有其他好的解决方案请留言:
@Override public List<Excel> excelAnalysis() { ArrayList<Excel> result = new ArrayList<>(); try { CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(FILE_PATH + StrUtil.SLASH + FILE_NAME), Charset.forName("gbk"))); List<String[]> myEntries = reader.readAll(); if (ObjectUtil.isNotEmpty(myEntries) && myEntries.size() > 0) { for (int i = 1; i < myEntries.size(); i++) { String[] myEntry = myEntries.get(i); Excel excel = new Excel(); excel.setSaleOrdDetId(myEntry[0]); excel.setSaleOrdId(myEntry[1]); excel.setParentSaleOrdId(myEntry[2]); excel.setBeforePrefrAmount(new BigDecimal(myEntry[31])); excel.setAfterPrefrAmount(new BigDecimal(myEntry[32])); excel.setSaleOrdTm(myEntry[61]); excel.setSaleOrdDt(myEntry[62]); excel.setItemSkuId(myEntry[75]); excel.setItemId(myEntry[76]); excel.setItemName(myEntry[77]); excel.setFreeGoodsFlag(myEntry[78]); excel.setMcOrdFlag(myEntry[151]); excel.setPopShopId(myEntry[168]); result.add(excel); } } } catch (IOException e) { e.printStackTrace(); } return result; }