Apache POI导出出现FontConfiguration中NULL

OpenJDK 比JDK缺少AWT组件部分功能

Apache POI 中使用SXSSFWorkbook出现Excel导出失败的异常。

问题堆栈

java 复制代码
java.lang.NullPointerException: null
        at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
        at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
        at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
        at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
        at sun.font.SunFontManager$2.run(SunFontManager.java:431)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.SunFontManager.<init>(SunFontManager.java:376)
        at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
        at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
        at java.awt.Font.getFont2D(Font.java:491)
        at java.awt.Font.canDisplayUpTo(Font.java:2060)
        at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
        at java.awt.font.TextLayout.<init>(TextLayout.java:531)
        at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:285)
        at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
        at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:89)
        at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:701)
        at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:722)

根本原因

服务器是使用的JDK是OpenJDK,AWT组件中被简化了,没有字体,同时服务器中没有字体包。而本地一般使用OracleJDK拥有完整的AWT功能。结果常出现本地服务功能正常,生产环境失败。

修复方案

方案一

直接将JDK更换成完整的版本,不用OpenJDK。

方案二

如果是使用Apache POI导出Excel失败,可以升级poi的jar版本,在5.2.3版本的时候对这个问题进行了修复。

https://poi.apache.org/changes.html#5.2.3

Type BUG Module Description
66230 SXSSF SXSSFWorkbook should work even when fonts not installed on OS

方案三

给服务器(CentOS)安装配置字体

  1. 安装fontconfig

    在线安装

    shell 复制代码
    yum install fontconfig

    离线方法,需要去下载对应的离线安装包,根据系统版本而定。举例:

    shell 复制代码
    rpm -ivh fontconfig-2.10.95-10.el7.x86_64.rpm  --nodeps --force
  2. 安装字体ttf-dejavu

    在线安装

    shell 复制代码
    yum install ttf-dejavu

    离线方法,需要去下载对应的离线安装包,根据系统版本而定。举例:

    下载地址:https://packages.msys2.org/packages/mingw-w64-x86_64-ttf-dejavu,取出其中的字体文件,重新打包

    上传字体:将 字体文件打包上传到服务器,解压到 /usr/share/fonts 目录

    刷新字体:执行命令fc-cache --force

    查看安装的字体:执行命令 fc-list

    在上述的方案操作之后都是重启项目。

相关推荐
JoySSLLian1 小时前
手把手教你安装免费SSL证书(附宝塔/Nginx/Apache配置教程)
网络·人工智能·网络协议·tcp/ip·nginx·apache·ssl
Apache Flink2 小时前
Apache Flink Agents 0.2.0 发布公告
大数据·flink·apache
软件派1 天前
Apache SeaTunnel从入门到精通:企业级数据集成全流程解析
apache·seatunnel
倔强的石头1062 天前
边缘侧时序数据的选型指南:网络不稳定、数据不丢、回传可控——用 Apache IoTDB 设计可靠链路
网络·apache·iotdb
A-刘晨阳2 天前
2026年时序数据库选型指南:从大数据视角深度解析Apache IoTDB的技术优势与实践路径
大数据·apache·时序数据库
todoitbo2 天前
时序数据库选型指南:面向工业物联网的工程视角,以 Apache IoTDB 为例
物联网·apache·时序数据库·iotdb
枫叶丹42 天前
时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?
大数据·数据库·apache·时序数据库·iotdb
wei_shuo2 天前
国产时序数据库的云原生实践:Apache IoTDB 与 TimechoDB 在物联网场景的深度应用
云原生·apache·时序数据库
Aloudata3 天前
数据治理选型对比:Apache Atlas vs 商业平台在存储过程解析与自动化治理的实测分析
数据挖掘·自动化·apache·元数据·数据血缘
世界尽头与你3 天前
CVE-2017-5645_ Apache Log4j Server 反序列化命令执行漏洞
网络安全·渗透测试·log4j·apache