我编写了生成excel的模块,并将其部署在Servicemix下。在 Windows 环境中一切正常,但在 Linux 下 Servicemix 在以下调用时意外崩溃:
for (short i=0;i<=3;i++) {
log.trace("AutoSize column {}", i);
worksheet.autoSizeColumn(i);
}
我正在使用 POI 版本 4.2-FINAL、FuseESB 4.2、Java 5.0。但是,没有 hs_err*.pid 文件。 Servicemix 日志在第一次 autoSizeColumn 调用时结束。
有人遇到过这种行为并知道它是如何引起的以及如何解决吗?
为了能够计算列宽,POI 需要获取正在使用的字体,并要求它依次调整每个字符的大小。在我所知道的所有 JVM 上,这都需要图形环境,因为实际工作由 JVM 委托给底层图形系统。
如果您使用的是 Windows,那么您始终拥有图形系统,所以这很好。在 Linux 上,如果您在服务器上的命令行上运行,则可能不会。 (Linux 作为桌面也不错)
如果您在没有运行 X 服务器的 Linux 服务器上运行,则需要告诉 Java 以“无头”方式运行。取自 POI AutoSize 文档
为了计算列宽,Sheet.autoSizeColumn 使用 Java2D 类,如果图形环境不可用,这些类会抛出异常。如果图形环境不可用,您必须告诉 Java 您正在无头模式下运行,并设置以下系统属性: java.awt.headless=true
尝试在启动 JVM 时进行设置,我有预感它会解决你的问题(这很可能是由 Java 找不到完整的图形环境引起的)
我们尚未测试它,因为它尚未发布,但自 POI 5.2.3 以来,有一个布尔系统属性可以提供帮助:
org.apache.poi.ss.ignoreMissingFontSystem
指示 Apache POI 忽略由于缺少字体和 因此即使没有字体也可以执行更多功能 安装。注意:某些功能仍然无法实现,因为 不能使用默认值,例如渲染幻灯片、绘图...
嗨,我遇到了类似的问题。我没有发生任何崩溃,但在我的开发环境(Windows)上,autosizecolumn 起作用了。在生产环境(类Unix)上它不起作用。我设置了系统属性 java.awt.headless=true 但问题仍然存在。我解决了以下这个解决方案,但我添加了所有 Arial Family 字体。希望它对任何人都有帮助。
我在迁移服务器时遇到了同样的问题(OpenJDK 1.8、Rocky Linux 9)
无头设置对我没有帮助(
java.awt.headless=true
)。但安装 fontconfig 解决了这个问题。我假设这个包带有默认字体。
$> sudo dnf install fontconfig
$> fc-list