NoClassDefFoundError:使用java处理excel表时出现UnsupportedFileFormatException

时间:2015-05-12 06:22:24

标签: java excel apache-poi xlsx xssf

我正在编写一个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

我已经加入了以下罐子:

  • 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以及目录,但我不明白这是什么问题。

如何删除此错误?

4 个答案:

答案 0 :(得分:10)

Apache POI FAQ page

中介绍了这一点
  

我可以混合使用不同版本的POI广告吗?

     

没有。这不受支持。

     

所有正在使用的POI罐必须来自同一版本。不支持poi-3.11.jar和poi-ooxml-3.9.jar等组合,并且无法以不可预测的方式工作。

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

您需要确保所有POI罐都来自同一版本。我建议你抓住latest POI release from the download page(写作时为3.12),并使用一套一致的罐子

答案 1 :(得分:0)

我尝试了同样的错误并得到了同样的错误。这是因为poi文件中的pom.xml个罐子是重复的。

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

这是我之前收到的警告:

  

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

答案 2 :(得分:0)

原因是poi,poi-ooxml,poi-ooxml-schemas的版本应该相同,例如rpom.xml文件中的版本应为3.6

答案 3 :(得分:-1)

当JVM在运行时无法找到库时,会出现NoClassDefFoundError。可能是您在文件路径中添加了库,但它在运行时不可用。