You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JasperReports与Apache POI导出XLS时遇ClassNotFoundException

报表导出XLS格式失败问题排查与解决

问题背景

使用Jasper Report v6.17.0生成报表,搭配Apache POI 4.1.2、poi-ooxml 4.1.2、ooxml-schemas 1.4及poi-ooxml-schemas 4.1.2,PDF、DOC、XLSX格式导出正常,但XLS格式无法工作,创建JRXlsExporter实例时直接抛出异常。

相关代码

JRAbstractExporter  exporter = new JRXlsExporter();
ByteArrayOutputStream baos = new ByteArrayOutputStream();

// 为导出器分配参数
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
if(ReportOutputType.XLS.equals(reportOutputType) || ReportOutputType.XLSX.equals(reportOutputType)){
    exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
    exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
    exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS, Boolean.FALSE);
    exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
    exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
    exporter.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE);
    exporter.setParameter(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED, Boolean.TRUE);
    exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_CELL_BORDER, Boolean.TRUE);
}

try {
    exporter.exportReport();
} catch (JRException e) {
    throw new RuntimeException(e);
}

return baos;

异常详情

Caused by: java.lang.NoClassDefFoundError: org/apache/poi/hssf/util/HSSFColor$WHITE
    at deployment.dp.war//net.sf.jasperreports.engine.export.JRXlsExporter.<init>(JRXlsExporter.java:163)
    at deployment.dp.war//net.sf.jasperreports.engine.export.JRXlsExporter.<init>(JRXlsExporter.java:191)
    at deployment.dp.war//com.apc.dp.view.utils.exports.ReportsExporter.getReportOutputType(ReportsExporter.java:56)
    at deployment.dp.war//com.apc.dp.view.utils.exports.ReportsExporter.<init>(ReportsExporter.java:74)
    at deployment.dp.war//com.apc.dp.controller.solution.SolutionReportsController.getPartNumberReports(SolutionReportsController.java:963)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at deployment.dp.war//org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at deployment.dp.war//org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
    at deployment.dp.war//org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    at deployment.dp.war//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at deployment.dp.war//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
    at deployment.dp.war//org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at deployment.dp.war//org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
    ... 56 more
Caused by: java.lang.ClassNotFoundException: org.apache.poi.hssf.util.HSSFColor$WHITE from [Module "deployment.dp.war" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
    ... 72 more

已尝试操作

  • 调整jar包类路径
  • 升级POI版本

解决方案

问题根源

org.apache.poi.hssf.util.HSSFColor$WHITE属于POI的poi核心包(负责处理旧版XLS格式),当前依赖中仅引入了处理XLSX的poi-ooxml包,缺少基础的poi核心包,导致JRXlsExporter初始化时找不到依赖类。

修复步骤

在pom.xml中添加poi核心依赖,版本与现有POI组件保持一致(4.1.2):

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

额外注意事项

  1. 确保所有POI相关依赖版本统一,避免版本冲突
  2. 若使用JBoss等模块化容器,需确认模块配置中包含poi包的引入,避免类加载器无法找到该类
  3. 若仍有问题,检查是否存在依赖排除规则导致poi包未被正确引入

内容的提问来源于stack exchange,提问作者Ruchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:23:13