使用PrimeFaces 5.3 dataExporter导出超65535行Excel报错如何解决
根因说明
你遇到的报错本质是PrimeFaces 5.3内置的dataExporter默认仅支持导出旧版.xls格式(对应POI的HSSF实现),该格式单sheet最大行数限制为65535行,超过就会抛出越界错误。仅引入poi-ooxml无效的原因是PrimeFaces 5.3默认不会主动调用XSSF/SXSSF的新版Excel实现。
可行解决方案
方案1:自定义DataExporter实现(推荐,无需升级PrimeFaces版本)
该方案适配新版xlsx格式,支持单sheet最高104万行,大文件导出不会触发OOM问题:
- 首先确认依赖配置正确,需要同时引入同版本的poi和poi-ooxml,避免类冲突:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
- 继承PrimeFaces原生
ExcelExporter类,重写工作簿创建逻辑,使用流式SXSSF实现:
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.primefaces.component.export.ExcelExporter; public class CustomExcelExporter extends ExcelExporter { @Override protected Workbook createWorkBook() { // 参数100为内存缓存行数,超出部分自动刷入磁盘,避免内存溢出 return new SXSSFWorkbook(100); } }
- 在
faces-config.xml中注册自定义导出器,替换原生默认的Excel导出实现:
<application> <factory> <exporter-factory> <exporter> <name>excel</name> <class>替换为你自定义类的全限定类名</class> </exporter> </exporter-factory> </factory> </application>
- 页面中
dataExporter组件导出的文件名后缀改为.xlsx,避免打开文件时提示格式错误。
方案2:升级PrimeFaces版本
PrimeFaces从6.0版本开始原生支持xlsx格式导出,无需自定义代码:
- 升级PrimeFaces到6.0及以上版本
- 页面中
dataExporter配置type="xlsx",同时引入同版本的poi和poi-ooxml依赖即可直接支持超过65535行的导出。
注意事项
- 单页导出行数超过20万时必须使用SXSSF流式实现,避免服务器内存溢出
- 大文件导出建议搭配异步处理逻辑,避免前端请求超时
内容的提问来源于stack exchange,提问作者user13986674
相关产品推荐
相关产品推荐

