2015-05-12 15 views
1

Я пишу программу Java, которая читает из .xlsx-файла и выдает вывод в формате .csv. Это мой код:NoClassDefFoundError: UnsupportedFileFormatException при работе с листом excel с использованием java

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
  • пои-OOXML-3.11.jar
  • пои-OOXML-схемы-3.8-20120326.jar
  • XMLBeans-2.3.0.jar

Я проверил формат файла .xlsx, а также в директории, но я не понимаю, в чем проблема.

Как удалить эту ошибку?

+0

в какой строке вы получите сообщение об ошибке? –

+0

XSSFWorkbook рабочая книга = новый XSSFWorkbook (новый FileInputStream (inputFile)); –

+2

Все ваши версии poi разные. Добавьте банки poi, которые все из той же версии i.e 3.9. И все файлы jar предоставлены apache poi для пути к классу вашего проекта. – LittlePanda

ответ

9

Это рассматривается в Apache POI FAQ page:

Can I mix POI jars from different versions?

No. This is not supported.

All POI jars in use must come from the same version. A combination such as poi-3.11.jar and poi-ooxml-3.9.jar is not supported, and will fail to work in unpredictable ways.

Вы перечислите себя с помощью poi-3.9.jar и poi-ooxml-3.11.jar, которые находятся в разных версиях, и не будет работать.

Вам необходимо убедиться, что все ваши POI-банки имеют ту же версию. Я предлагаю вам захватить latest POI release from the download page (3.12 на момент написания) и использовать согласованный набор банок из этого

+0

спасибо за помощь. –

-1

NoClassDefFoundError появляется, когда JVM не может найти библиотеку во время выполнения. Может быть, вы добавили библиотеку в путь к файлу, но она недоступна во время выполнения.

0

Я пробовал то же самое и получил ту же ошибку. Это потому, что банки poi дублируются в файле pom.xml.

Я получил эти предупреждения, которые я проигнорировал первым. Позже я попытался удалить дубликаты poi банки в pom.xml, которые решили проблему.

Это предупреждение, которое я получил раньше:

[WARNING] Some problems were encountered while building the effective model for MavenProj:Perfumania:jar:0.0.1-SNAPSHOT [WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.poi:poi:jar -> duplicate declaration of version 3.9 @ line 36,

 Смежные вопросы

  • Нет связанных вопросов^_^