环境:centos7(华为云服务器),jdk17,springboot3
线下测试表格下载没有问题,一放到线上,下载下来都是空白,查看日志报错如下:
dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.RuntimeException: com.alibaba.excel.exception.ExcelGenerateException: java.lang.InternalError: java.lang.reflect.InvocationTargetException] with root cause
java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1269) ~[na:na]
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:224) ~[na:na]
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:106) ~[na:na]
系统字体缺失
系统联网:比较简单直接下载安装就行
sudo yum install fontconfig
sudo yum install dejavu-sans-fonts
系统未联网:最烦的就是版本问题,直接从官网下载版本一直冲突,于是我用另一个同样centos7系统下载下来包然后移到问题服务器;
yumdownloader下载的包会下在当前目录
yumdownloader dejavu-fonts-common
yumdownloader dejavu-sans-fonts fontpackages-filesystemyumdownloader fontconfig
yumdownloader ttmkfdir
安装所需依赖
sudo rpm -ivh dejavu-fonts-common*.rpm dejavu-sans-fonts*.rpm fontpackages-filesystem*.rpm
安装fontconfig
sudo rpm -ivh fontconfig-2.13.0-4.3.el7.x86_64.rpm
安装ttmkfdir,当你在 Linux 系统中加了新的字体,可以使用 ttmkfdir 生成相关的字体配置文件,使得字体能被 X11 系统识别和使用;
sudo rpm -ivh ttmkfdir
回到windows系统找要用的字体
C:\Windows\Fonts
在问题服务器中创建文件夹,然后将字体文件移过来
cd /usr/share/fontconfig/
mkdir fonts
chmod -R 755 /usr/share/fontconfig/fonts/
生成字体目录文件
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
修改系统字体配置
vi /etc/fonts/fonts.conf
在 Font directory list 下添加你的文件夹
<dir>/usr/share/fontconfig/fonts</dir>
保存,然后刷新字体缓存
fc-cache
然后查看是否生效
fc-list :lang=zh
easyExcel的配置中别忘了设置字体
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer integer, Boolean aBoolean) {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
Font font = workbook.createFont();
font.setFontName("SimHei");
font.setFontHeightInPoints((short) 14);
font.setBold(true);
}
}