当前位置: 首页 > 知识库问答 >
问题:

使用excel工作簿时发生异常

祝昊东
2023-03-14

当我使用poi JAR在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

我添加了以下罐子:

>

  • xmlbeans-2.4.0
  • poi-ooxml-schemas-3.11
  • poi-3.11
  • commons-logging-1.1
  • dom4j-1.6.1
  • 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();
            }
        }
    
    }
    
  • 共有1个答案

    糜正业
    2023-03-14
    FileOutputStream out = new FileOutputStream(new File("exps.xlsx"));
    

    文件输出流是用于将数据写入文件或文件描述符的输出流。文件是否可用或是否可以创建取决于底层平台。特别是某些平台,一次只允许一个FileOutputStream(或其他文件写入对象)打开一个文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。

    因为您正在显式创建一个文件对象,并将其传递给文件输出流构造函数。它假定文件“exps.xlsx”已经创建。[参考。]

    如果不是,您只需在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项目,您可以显式地添加上述版本的jar

     类似资料:
    • 所以在问这个之前,我搜索并发现了一些与我在这里想要做的相似的事情。 基本上我有工作簿AlphaMaster。这个工作簿是一个模板,我想用它来创建每周的新工作簿。 在本工作簿中,有名为“周一至周六”的工作表,以及带有相应日期的周一、周二等其他工作表。 我创建了一个在打开工作簿时加载的表单。我想要的是当我单击表单运行时,它将: > 将代码保存模板作为新工作簿运行 根据userform1的输入重命名工作

    • 然后另一个问题是工作簿的名称都不同,所有300个。是否有一个宏可以复制我打开的工作簿,而不是每次都输入实际的名称?

    • ...需要很长时间(~30秒),并且该文件只有72行10列(365KB)。 这不是问题,只是看起来有点过分。我在想我是做错了什么,还是没有做我应该做的事情。实例化具有相同数据(但只有25KB)的xls文件只需1或2秒。如果这是正常的,那么有人可以告诉我。 编辑: 因此,我不知道这是App Engine的问题,还是POI不喜欢返回的InputStream的味道。顺便说一句,我不能用而不是尝试初始化,

    • 我得到了这个错误: 工作簿已包含此名称的工作表 行应该检查工作簿是否已经包含此名称的工作表,但它不工作。我仍然有错误。 谢谢你的帮助!

    • 问题内容: 在的文档中,我了解了以下内容: 如何从现有的工作簿/工作表中阅读: 如何创建新的工作簿/工作表: 我现在想做的是在现有工作簿中打开一个现有工作表,并写入该工作表。 我已经尝试过类似的东西: 但仅是模块的一部分,而不是。 有任何想法吗? Edit1:在Olivers的建议下,我调查并尝试了以下操作: 但是,这给了我以下错误信息: 编辑2:错误消息是由于不正确使用该功能。终于找到了如何使用