当使用Docker打包包含EasyExcel的Java应用时,可能会遇到字体相关的报错,这是因为基础Docker镜像通常不包含完整的中文字体库。以下是解决方案:
EasyExcel在生成Excel文件时需要访问系统字体,而常见的Docker基础镜像(如openjdk)通常不包含完整字体库,导致报错:
java.awt.FontFormatException
或
Can't find font file
修改Dockerfile,添加字体安装步骤:
FROM openjdk:8-jdk-alpine
# 安装字体(针对Alpine Linux)
RUN apk add --no-cache ttf-dejavu fontconfig
# 或者针对Ubuntu基础镜像
# FROM openjdk:8
# RUN apt-get update && apt-get install -y fontconfig fonts-wqy-microhei && rm -rf /var/lib/apt/lists/*
# 复制应用程序
COPY target/your-app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
FROM adoptopenjdk/openjdk8:jdk8u292-b10-ubuntu
# 确保字体已安装
RUN apt-get update && apt-get install -y fontconfig fonts-wqy-microhei && rm -rf /var/lib/apt/lists/*
COPY target/your-app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
如果只需要特定字体,可以将字体文件添加到镜像中:
FROM openjdk:8-jdk-alpine
# 创建字体目录并复制字体
RUN mkdir -p /usr/share/fonts
COPY src/main/resources/fonts/simsun.ttf /usr/share/fonts/
# 刷新字体缓存
RUN apk add --no-cache fontconfig && \
fc-cache -fv
COPY target/your-app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
如果只是需要基本功能,可以在EasyExcel初始化时禁用字体检查:
EasyExcel.write(response.getOutputStream(), YourDataClass.class)
.registerWriteHandler(new WriteHandler() {
@Override
public void sheet(int i, Sheet sheet) {}
@Override
public void row(int i, Row row) {}
@Override
public void cell(int i, Cell cell) {}
})
.autoCloseStream(true)
.ignoreFontStyle(true) // 忽略字体样式
.sheet("Sheet1")
.doWrite(dataList);
可以在容器内运行以下命令验证:
docker exec -it your-container /bin/sh
fc-list
应该能看到已安装的字体列表。
选择哪种方案取决于你的具体需求和对镜像大小的限制。