java.lang.ClassNotFoundException : org. apache.xmlbeans.XmlOptions

标签 java apache-poi classnotfoundexception

我正在尝试在 servlet 中使用 POI 将上传的文件处理为 Excel 文件:

public static String readExcel(InputStream inp) {
    // InputStream inp = null;
    StringBuilder excelDataBuilder = new StringBuilder();
    try {
        Workbook wb = WorkbookFactory.create(inp);
        Sheet sheet = wb.getSheetAt(0);
        Header header = sheet.getHeader();

        int rowsCount = sheet.getLastRowNum();
        for (int rowCounter = 0; rowCounter <= rowsCount; rowCounter++) {
            Row row = sheet.getRow(rowCounter);
            int colCounts = row.getLastCellNum();
            for (int colCounter = 0; colCounter < colCounts; colCounter++) {
                Cell cell = row.getCell(colCounter);
                excelDataBuilder.append(cell.getStringCellValue());
                if (colCounter < colCounts)
                    excelDataBuilder.append(",");
            }
            if (rowCounter <= rowsCount) {
                excelDataBuilder.append("\n");
            }
        }
        return excelDataBuilder.toString();

    } catch (Exception ex) {
        LOG.error("Exception", ex);
    } finally {
        try {
            inp.close();
        } catch (IOException ex) {
            LOG.error("IOException", ex);
        }
    }
    return excelDataBuilder.toString();
}

但是,它在以下行引发了异常:

Workbook wb = WorkbookFactory.create(inp);

这是堆栈跟踪:

SEVERE: Servlet.service() for servlet [com.bhrt93.excel.servlet.UploadProcessExcel] in context with path [/ExcelServletProcessCommons] threw exception [Servlet execution threw an exception] with root cause
java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlOptions
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at org.apache.poi.POIXMLDocumentPart.<clinit>(POIXMLDocumentPart.java:59)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:78)
    at com.bhrt93.excel.service.ExcelReaderService.readExcel(ExcelReaderService.java:22)
    at com.bhrt93.excel.servlet.UploadProcessExcel.doPost(UploadProcessExcel.java:69)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

这是怎么造成的,如何解决?

最佳答案

Apache POI page on Components and their Dependencies 中详述...

如果您想使用通用 SS 代码,例如 WorkbookFactory,则您的类路径中需要有 poipoi-ooxml POI jar。此外,您还需要它们的依赖项。 listed dependencies之一是 xmlbeans,顺便说一句,它是您丢失的类的来源

所以,你只需要review the Components and Dependencies page ,然后确保在类路径上包含 Apache POI 二进制包中的适当 jar。 (或者使用 Maven,让它为你担心)

关于java.lang.ClassNotFoundException : org. apache.xmlbeans.XmlOptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26024193/

相关文章:

java - Equinox:通过包正确导出和导入类,但仍然出现 ClassNotFoundException

java - 如何使实体内的属性只读?

java - for() 语句指令顺序

java - 我的程序中的 InputMismatchException 处理? - JAVA

java - 使用 POI 读取一系列 Excel 工作表数据

java - 找不到 MySQL 驱动程序类,即使包含在类路径中也是如此

java - 用 Java 抓取网站

java - 有什么方法可以知道 CellStyle 已经存在于工作簿中(重用)使用 POI 或仅复制 Celstyle obj 而不是引用

excel - 使用apache POI读取单元格样式以及数据-Excel表格

java - 添加 RecyclerView Layoutmanager 时我的应用程序停止了