[alibaba/easyexcel]相同的代码,不同的结果。java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion()

2024-06-20 905 views
8

本地运行正常,部署到服务器异常。 本地win10,jdk 1.8,服务器是docker上的,open jdk 1.8

java.lang.NullPointerException: null at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) ~[?:1.8.0_151] at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) ~[?:1.8.0_151] at sun.awt.FontConfiguration.init(FontConfiguration.java:107) ~[?:1.8.0_151] at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) ~[?:1.8.0_151] at sun.font.SunFontManager$2.run(SunFontManager.java:431) ~[?:1.8.0_151] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_151] at sun.font.SunFontManager.(SunFontManager.java:376) ~[?:1.8.0_151] at sun.awt.FcFontManager.(FcFontManager.java:35) ~[?:1.8.0_151] at sun.awt.X11FontManager.(X11FontManager.java:57) ~[?:1.8.0_151] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_151] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_151] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_151] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_151] at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_151] at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) ~[?:1.8.0_151] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_151] at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) ~[?:1.8.0_151] at java.awt.Font.getFont2D(Font.java:491) ~[?:1.8.0_151] at java.awt.Font.canDisplayUpTo(Font.java:2060) ~[?:1.8.0_151] at java.awt.font.TextLayout.singleFont(TextLayout.java:470) ~[?:1.8.0_151] at java.awt.font.TextLayout.(TextLayout.java:531) ~[?:1.8.0_151] at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:274) ~[poi-3.16.jar!/:3.16] at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.(AutoSizeColumnTracker.java:117) ~[poi-ooxml-3.16.jar!/:3.16] at org.apache.poi.xssf.streaming.SXSSFSheet.(SXSSFSheet.java:79) ~[poi-ooxml-3.16.jar!/:3.16] at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:652) ~[poi-ooxml-3.16.jar!/:3.16] at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:673) ~[poi-ooxml-3.16.jar!/:3.16] at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:89) ~[poi-ooxml-3.16.jar!/:3.16] at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:51) ~[easyexcel-1.1.2-beta4.jar!/:?] at com.alibaba.excel.context.WriteContext.currentSheet(WriteContext.java:112) ~[easyexcel-1.1.2-beta4.jar!/:?] at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:69) ~[easyexcel-1.1.2-beta4.jar!/:?] at com.alibaba.excel.ExcelWriter.write1(ExcelWriter.java:106) ~[easyexcel-1.1.2-beta4.jar!/:?]

回答

5

你的poi-ooxml和poi的版本好像有问题,标准是依赖3.17 你的依赖怎么是3.16?

2

@jipengfei-jpf 这个链接已经失效了

4

其实能考虑下 内嵌一个字体不,或者 绕过这个 用通用的字体。 我在linux下 用其他的方式excel导出也能导出中文出来。 但是 easyexcel 在linux下要是缺少字体,那么导出来的就都是空的了。

9

怎么绕过 这个坑;

1

可以试试设置EasyExcel.write().inMemory(true)

7

可以试试设置EasyExcel.write().inMemory(true)

不行还是一样问题

4

可以试试设置EasyExcel.write().inMemory(true)

我这边是可以的,避免在系统层面安装依赖,非常感谢

1

Alpine Linux中OpenJDK无法使用字体控件fontconfig

解决方案

1) 将openjdk更换成oraclejdk。但考虑到商业授权的问题,因此不更换,仍使用openjdk。 2)再dockerfile构建文件中,安装 fontconfig 和 ttf-dejavu字体。

FROM openjdk:8-jre-alpine

# 安装 fontconfig 和 ttf-dejavu字体
RUN apk add fontconfig
RUN apk add --update ttf-dejavu
RUN fc-cache --force