4

我编写了生成 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 调用时结束。

有没有人遇到过这种行为并知道它是如何引起的以及如何解决?

4

2 回答 2

6

为了能够计算列宽,POI 需要掌握正在使用的 Font,并要求它依次调整每个字符的大小。在我所知道的所有 JVM 上,这需要一个图形环境,因为实际工作由 JVM 委托给底层图形系统。

如果你在 Windows 上,你总是有一个图形系统,这很好。在 Linux 上,如果您在服务器上的命令行上运行,则可能不会。(不过,Linux 作为桌面很好)

如果您在没有运行 X 服务器的 linux 服务器上运行,您需要告诉 Java 运行“无头”。取自POI AutoSize 文档

计算列宽 Sheet.autoSizeColumn 使用 Java2D 类,如果图形环境不可用,则会抛出异常。如果图形环境不可用,您必须告诉 Java 您正在以无头模式运行并设置以下系统属性: java.awt.headless=true

尝试在您启动 JVM 时进行设置,我有预感它会解决您的问题(这很可能是由于 Java 没有找到完整的图形环境造成的)

于 2011-09-14T09:15:59.873 回答
0

嗨,我遇到了类似的问题。我没有任何崩溃,但在我的开发环境(Windows)上,autosizecolumn 有效。在生产环境(类Unix)上它不起作用。我把系统属性java.awt.headless=true但我仍然有问题。我解决了这个解决方案,但我添加了所有 Arial Family 字体。希望它可以帮助任何人。

于 2012-09-20T16:36:17.437 回答