2015-02-08 70 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”