尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案 - 详解

Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案 - 详解
📅 发布时间:2026/6/20 8:17:44

Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案 - 详解

2025-10-24 12:52  tlnshuju  阅读(0)  评论(0)    收藏  举报

问题描述

  • 在阿里云ECS(Alibaba Cloud Linux 3)上,使用 Apache POI 的 SXSSFWorkbook 导出 Excel 时出现 NullPointerException。
  • 服务器为无图形界面环境,JDK 为 OpenJDK 1.8(headless)。

环境信息(关键信息)

  • 操作系统:阿里云ECS(Alibaba Cloud Linux 3 - 无图形界面环境)
  • JDK:OpenJDK 1.8.0_412
  • JDK 类型:java-1.8.0-openjdk-headless
  • Apache POI:3.14

错误堆栈(核心片段)

java.lang.NullPointerExceptionat org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:254)at org.apache.poi.xssf.streaming.SXSSFSheet.(SXSSFSheet.java:77)at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(...)

问题分析

  • 根因:AWT 字体系统在无图形界面环境初始化不完整,SXSSFWorkbook 创建时需要计算默认字符宽度,触发 NPE。
  • 现象触发条件:服务器无图形环境(DISPLAY 为空)、未装 X11 相关库;headless JDK 对字体配置更严格。

关键检测命令与结果(摘要)

# 图形/字体/Java环境
DISPLAY:
ls -la /usr/share/fonts/       # 存在 dejavu 目录
rpm -qa | grep -i x11          # 未安装X11包
java -Djava.awt.headless=true -version
# 输出:openjdk version "1.8.0_412" ...
# JDK 信息
which java                     # /usr/bin/java
java -XshowSettings:properties -version | grep -E 'java.version|java.home|os.name|os.version'
# java.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412...  os.name=Linux
# POI 版本
find /root/chp-fbs -name '*.jar' -exec jar -tf {} \; 2>/dev/null | grep -i poi | head -5 || echo '未找到POI相关JAR
# BOOT-INF/lib/poi-ooxml-3.14.jar
# BOOT-INF/lib/poi-3.14.jar
# BOOT-INF/lib/poi-ooxml-schemas-3.14.jar

解决方案

  1. 添加 JVM 参数(尝试但未完全解决)
java -Djava.awt.headless=true -jar your-app.jar

说明:可启动,但导出仍报 NPE,仅 headless 参数不足以补齐字体环境。

  1. 安装字体包与图形字体支持(最终解决)
yum install -y fontconfig \
dejavu-fonts-common \
dejavu-sans-fonts \
dejavu-serif-fonts \
dejavu-sans-mono-fonts \
java-1.8.0-openjdk-devel
fc-cache -fv

安装后(节选输出):

/usr/share/fonts/dejavu: caching, new cache contents: 21 fonts
/usr/bin/fc-cache-64: succeeded

结论:安装字体 + headless 参数后,SXSSFWorkbook 对象创建正常。

  1. 备用方案:使用 XSSFWorkbook替代SXSSFWorkbook
  • 特点:不依赖 AWT 字体,适合中小数据量,内存开销更高(XSSFWorkbook 会全量驻内存,数据量很大时确实更占内存并可能 OOM)
  • 示例(仅演示,不含项目真实代码):
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class TestXSSF {
public static void main(String[] args) throws Exception {
XSSFWorkbook workbook = new XSSFWorkbook();
}
}

(可选)测试 SXSSFWorkbook 的最小示例

import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
public class TestSXSSF {
public static void main(String[] args) throws Exception {
SXSSFWorkbook wb = new SXSSFWorkbook();
Sheet s = wb.createSheet("测试");
Row r = s.createRow(0); r.createCell(0).setCellValue("测试数据");
try (FileOutputStream out = new FileOutputStream("/tmp/test_sxssf.xlsx")) {
wb.write(out);
}
wb.close();
}
}

解决方案验证过程

  1. 验证字体安装
fc-list | head -10
# 显示 DejaVu 系列字体(如 DejaVuSans.ttf)
fc-cache -fv
# /usr/share/fonts/dejavu: ... 21 fonts
  1. 验证 Java AWT 运行环境
java -Djava.awt.headless=true -version
# openjdk version "1.8.0_412" ...
  1. 验证Excel导出接口
curl -s 'http://192.168.0.100/xxx/export?page=1&rows=10' \
-H 'Accept: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \
-o /tmp/test_export.xlsx
ls -la /tmp/test_export.xlsx
file /tmp/test_export.xlsx     # Microsoft Excel 2007+

最佳实践建议

  • 组合使用:安装字体包 + -Djava.awt.headless=true。
  • 大数据量优先 SXSSFWorkbook;若环境受限或数据量中小,可用 XSSFWorkbook。
  • 控制导出规模(如分页≤1万行),必要时分段导出或改 CSV。
  • 为导出任务分配足够堆内存:-Xmx1024m 或更高,视数据量调整。
  • 将环境检测与验证脚本写入部署文档,便于回归与迁移。

相关新闻

  • 扩展欧几里得 exgcd
  • 防爆模乘
  • 20232314 2025-2026-1 《网络与系统攻防技术》实验三实验报告

最新新闻

  • 口碑好的智能水务品牌推荐与分析 - myqiye
  • ARM Cortex-M0+微控制器低功耗设计:从架构到实战的嵌入式系统优化
  • 2026永州汽车贴膜门店实力排行 - 国麟测评
  • 金得力环保:木百叶定制品牌中的靠谱之选 - mypinpai
  • 2026黑龙江哈尔滨红肠哪家正宗?四家优质品牌总结 - 最新行业资讯
  • 深入解析CAN控制器:从寄存器位到消息调度与滤波机制

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号