使用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>
额外注意事项
- 确保所有POI相关依赖版本统一,避免版本冲突
- 若使用JBoss等模块化容器,需确认模块配置中包含poi包的引入,避免类加载器无法找到该类
- 若仍有问题,检查是否存在依赖排除规则导致poi包未被正确引入
内容的提问来源于stack exchange,提问作者Ruchi
相关产品推荐
相关产品推荐

