NoClassDefFoundError:UnsupportedFileFormatException使用java工作与Excel表

我正在写一个Java程序,它从.xlsx文件读取并以.csv格式输出。 这是我的代码:

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; public class xlsxToCsv { public static void main(String[] args) { long startTime = System.currentTimeMillis(); File inputFile = new File("C:\\inputFile.xlsx"); File outputFile = new File("C:\\outputFile.csv"); xlsx(inputFile, outputFile); long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime); } private static void xlsx(File inputFile, File outputFile) { //for storing data into CSV files StringBuffer data = new StringBuffer(); try { Writer w = new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"); // Get the workbook object for XLS file XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(inputFile)); // Get first sheet from the workbook XSSFSheet sheet = workbook.getSheetAt(0); Cell cell; Row row; // Iterate through each rows from first sheet Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { row = rowIterator.next(); // For each row, iterate through each columns Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { cell = cellIterator.next(); switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: data.append(cell.getBooleanCellValue() + ","); break; case Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); System.out.println(date.toString()); SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); String d = sdf.format(date); System.out.println(d); data.append(d + ","); } else if(cell.getNumericCellValue() == (int)cell.getNumericCellValue()) data.append((int)cell.getNumericCellValue() + ","); else if(cell.getNumericCellValue() == (long)cell.getNumericCellValue()) data.append((long)cell.getNumericCellValue() + ","); else data.append(cell.getNumericCellValue() + ","); break; case Cell.CELL_TYPE_STRING: data.append((cell.getStringCellValue()) + ","); break; case Cell.CELL_TYPE_BLANK: data.append("" + ","); break; default: data.append(cell + ","); } //data.append('\n'); } data.append("\r\n"); } w.write(data.toString()); w.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } 

}

但是,我收到以下错误:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at xlsxToCsv.xlsxToCsv.xlsx(xlsxToCsv.java:47) at xlsxToCsv.xlsxToCsv.main(xlsxToCsv.java:28) Caused by: java.lang.ClassNotFoundException: org.apache.poi.UnsupportedFileFormatException at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 14 more 

我已经包括以下jar子:

  • dom4j的-1.6.jar
  • POI-3.9.jar
  • POI-OOXML-3.11.jar
  • POI-OOXML-架构 – 3.8-20120326.jar
  • XMLBeans的-2.3.0.jar

我检查过的文件格式是.xlsx和目录,但我不明白是什么问题。

我怎样才能删除这个错误?

这包括在Apache POI FAQ页面中 :

我可以混合不同版本的POIjar子吗?

不,这不支持。

所有使用的POIjar子必须来自相同的版本。 诸如poi-3.11.jar和poi-ooxml-3.9.jar的组合不被支持,并且将不能以不可预知的方式工作。

你将自己列为使用来自不同版本的poi-3.9.jarpoi-ooxml-3.11.jar ,并且不起作用。

您需要确保所有的POIjar子来自相同的版本。 我build议你从下载页面抓取最新的POI版本 (截止撰写时为3.12),并使用一组一致的jar子

我试了一样,得到了同样的错误。 这是因为poi jar被复制到了pom.xml文件中。

我得到了我首先忽略的这些警告。 后来我尝试删除pom.xml重复poi jar,解决了这个问题。

这是我之前得到的警告:

[警告]构buildMavenProj的有效模型时遇到了一些问题:Perfumania:jar:0.0.1-SNAPSHOT [WARNING]'dependencies.dependency。(groupId:artifactId:type:classifier)'必须是唯一的:org.apache。 poi:poi:jar – > 3.9版本的重复声明@第36行,

JVM在运行时无法find库时,会出现NoClassDefFoundError。 可能是您在文件path中添加了库,但在运行时不可用。