是否可以在运行时动态格式化我的报告?我需要能够根据单元格的列和值设置单元格的样式。因此,如果 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 将解析设计并按照某些规则扩展它(例如,它将复制数据表的模板行,以便数据库返回的每一行数据都获得一行输出,即使您的设计已只有一行)。
这意味着您无法在设计阶段实现您想要的目标 - 无法获得当时的值。
您需要的是事件处理程序或 dynamic formatting 。后者更简单。
如果您想使用事件处理程序,请 Hook 数据源的 onFetch
事件。从数据库中获取每一行后,它将触发。此时,您可以检查数据并更改模板。注意:您必须通过 setStyleName()
为每一行设置一个有用的值。因此,您必须有两种样式(“is not 3”和“is 3”)并应用适合的一种。
可以通过 Java 做到这一点,但最简单的解决方案实际上是编写一小段 JavaScript。然后,您可以使用 Java 代码在设计中安装这段 JavaScript。
理论上,您可以直接从事件处理程序调用 Java,但我从未见过任何有用的文档。
关于java - Birt表动态格式化单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30900838/