Birt table 动态格式化单元格

Birt table dynamically format cells

是否可以在 运行 时动态格式化我的报告?我需要能够根据单元格的列和值设置单元格的样式。所以如果 column3 有一个值为 23 的单元格.setStyleName("customStyle");。我正在使用 BIRT 4.2.2.

目前我有这样的东西:

// table detail
RowHandle tabledetail = (RowHandle) table.getDetail().get(0);
for (int i = 0; i < cols.size(); i++) {
    CellHandle cell = (CellHandle) tabledetail.getCells().get(i);
    DataItemHandle data = designFactory.newDataItem("data_" + cols.get(i));

    data.setResultSetColumn(cols.get(i));

    // data.getContent(from, cols.get(i)).getcontents();

    cell.getContent().add(data);

    // format every other columns
    if (i == 3) {
        cell.setStyleName("LabelHeader");
    }
}

但出于某种原因,这会更改第四列中每个单元格的背景颜色,而不是其中包含 3 的单元格。

我读了这个 Eclipse Birt - Set style cell table dynamically with Event Handler,唯一的答案是使用脚本。我不想使用脚本我想更改 java.

中的样式

我需要能够评估单元格内容并根据它设置样式。

您需要了解 BIRT 的工作原理,才能理解您的代码无法工作的原因。 BIRT 有一个设计阶段(您没有任何值)。当报表呈现时,BIRT 会解析设计并按照一定的规则展开​​它(例如,它会复制数据表的模板行,这样你的数据库 returns 甚至每行数据都会得到一行输出尽管您的设计只有一行)。

这意味着您无法在设计阶段实现您想要的 - 当时无法获得这些值。

您需要的是事件处理程序或 dynamic formatting。后者更简单

如果要使用事件处理程序,则挂接到数据源的onFetch事件。它会在从数据库中获取的每一行之后触发。这时,您可以检查数据并更改模板。注意:您必须通过 setStyleName() 为每一行设置一个有用的值。因此,您必须有两种样式("is not 3" 和 "is 3")并应用适合的样式。

可以从 Java 开始,但最简单的解决方案实际上是编写一小段 Java 脚本。然后你可以使用Java代码在设计中安装这段Java脚本。

理论上您可以直接从事件处理程序调用 Java,但我从未见过任何有用的文档。