2015-02-08 69 views
1

我在我的代碼讓這些異常而即時通訊使用的POI罐子在Excel工作簿寫一些數據:例外,而使用Excel工作簿

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 WorkBookDemo.main(WorkBookDemo.java:27) 
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) 
    ... 13 more 

我添加下列jar:

  1. 的xmlbeans-2.4。 0
  2. POI-OOXML-架構 - 3.11
  3. POI-3.11
  4. 共享記錄-1.1
  5. dom4j的-1.6.1
  6. 的log4j-1.2.17

    import java.io.File; 
    import java.io.FileOutputStream; 
    
    import java.util.Map; 
    import java.util.Set; 
    import java.util.TreeMap; 
    
    import org.apache.poi.ss.usermodel.Cell; 
    import org.apache.poi.ss.usermodel.Row; 
    import org.apache.poi.xssf.usermodel.XSSFSheet; 
    import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
    
    public class WorkBookDemo { 
    
        public static void main(String[] args) 
        { 
         //Blank workbook 
         XSSFWorkbook workbook = new XSSFWorkbook(); 
    
         //Create a blank sheet 
         XSSFSheet sheet = workbook.createSheet("Employee Data"); 
    
         //This data needs to be written (Object[]) 
         Map<String, Object[]> data = new TreeMap<String, Object[]>(); 
         data.put("1", new Object[] {"ID", "NAME", "LASTNAME"}); 
         data.put("2", new Object[] {1, "Amit", "Shukla"}); 
         data.put("3", new Object[] {2, "Lokesh", "Gupta"}); 
         data.put("4", new Object[] {3, "John", "Adwards"}); 
         data.put("5", new Object[] {4, "Brian", "Schultz"}); 
    
         //Iterate over data and write to sheet 
         Set<String> keyset = data.keySet(); 
         int rownum = 0; 
         for (String key : keyset) 
         { 
          Row row = sheet.createRow(rownum++); 
          Object [] objArr = data.get(key); 
          int cellnum = 0; 
          for (Object obj : objArr) 
          { 
           Cell cell = row.createCell(cellnum++); 
           if(obj instanceof String) 
            cell.setCellValue((String)obj); 
           else if(obj instanceof Integer) 
            cell.setCellValue((Integer)obj); 
          } 
         } 
         try 
         { 
         //Write the workbook in file system 
          FileOutputStream out = new FileOutputStream(new File("exps.xlsx")); 
          workbook.write(out); 
          out.close(); 
          System.out.println("exps.xlsx written successfully on disk."); 
         } 
         catch (Exception e) 
         { 
          e.printStackTrace(); 
         } 
        } 
    
    } 
    

回答

2
FileOutputStream out = new FileOutputStream(new File("exps.xlsx")); 

A file output stream is an output stream for writing data to a File or to a FileDescriptor. Whether or not a file is available or may be created depends upon the underlying platform. Some platforms, in particular, allow a file to be opened for writing by only one FileOutputStream (or other file-writing object) at a time. In such situations the constructors in this class will fail if the file involved is already open.

既然你明確地創建一個File對象,並通過同向FileOutputStream構造。它假定文件"exps.xlsx"已經創建。 [Reference.]

因此,不是,您只需在FileOutputStream構造函數中傳遞文件的名稱即可。

FileOutputStream out = new FileOutputStream("exps.xlsx"); 

這會自動創建文件,因爲它已經沒有被創建。

此外,我測試了您的給定代碼,並使用以下Maven依賴項,它的工作。

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.10-FINAL</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.10</version> 
</dependency> 

櫃面你不使用maven項目,你可以明確地添加上述版本的上述jars

+1

POI jars *必須*總是來自同一版本 - 您的建議在3.9和3.10混合時是危險的! – Gagravarr 2015-02-09 11:20:46

+0

可能發生兼容性問題。 – emin 2015-02-09 12:11:12

+0

Sry,我的壞。錯誤地放在一起! – 2015-02-09 12:24:47

2

你丟失了一些JAR-文件。我在工作區中運行了代碼,並添加了所需的jar來構建路徑。它連續工作。

org/apache/poi/UnsupportedFileFormatException is under poi-x.xx-xxx-xx.jar 

代碼中沒有錯誤,它是正確的。添加罐子來建立路徑。

0

你可以檢查重複的poi罐子,假設你需要poi-ooxml-3.9。罐。但在你的lib文件夾中有poi-ooxml-3.11.jar,poi-ooxml-3.9.jar然後刪除poi-ooxml-3.11.jar,它應該工作。

+0

你爲什麼要移除較新的jar?當然,你會想保留最新版本,並修復所有錯誤,並刪除舊版本? – Gagravarr 2015-05-06 12:20:11

2

應該都是同一個版本需要apachePOI庫罐的下面列表如下所示:

org.apache.poi.3.11 
org.apache.poi-ooxml.3.11 
org.apache.poi-ooxml-schemas.3.11 

如果同一個庫的上述罐子是不同的版本,那麼你也會得到異常的「java.lang.NoClassDefFoundError:org/apache/poi/UnsupportedFileFormatException」