【问题标题】:Color cell according to condition根据条件着色单元格
【发布时间】:2020-10-15 07:43:01
【问题描述】:

我有一个表格,当标题中的单元格和行中的单元格在数据源的某个列表中成对出现时,我必须在其中设置背景颜色。 例如: 栏:“澳元,美元” 行:“BRL,捷克克朗”

在 AUD 列和行是 BRL 的单元格中,我检查数据源“AUD-BRL”的列表中是否存在,如果存在,我需要用绿色着色

现在,我想这样做: 列和行将在列表中。 我浏览了两个列表,然后在这些索引中为单元格着色。

这样我就可以为整个表格提供一个函数,而不必从每个单元格调用函数(总共有 1200 个单元格)。 怎么可能?

【问题讨论】:

    标签: javascript eclipse styles birt


    【解决方案1】:

    Fede MG 的回答是正确的。

    如果我正确理解了您的问题,您希望向表格详细信息行中的所有 单元格添加突出显示规则。不幸的是,我认为在 BIRT 中实现这一点有点麻烦。

    我假设你的桌子有例如像 COL_VALUE_1, ..., COL_VALUE_9 这样的绑定用于单元格值和 COL_TITLE_1, ..., COL_TITLE_9 用于列标题。

    此外,我假设有一些在 BIRT 中使用 Javascript 的经验。

    我这样做的方式是这样的:

    为每个细节单元格创建一个onCreate 事件脚本,代码如下:

    highlightDetailCell(this, row, 1);
    

    ... 其中 1 是列号。例如。这是第一列的代码,对于第二列,我将 1 替换为 2,依此类推。您可以通过复制和粘贴快速完成此操作。

    接下来我在报告的onInitialize 脚本内的函数中实现逻辑,如下所示:

    function highlightDetailCell(item, row, colnum) {
        var colTitle = row["COL_TITLE_" + colnum];
        var colValue = row["COL_VALUE_" + colnum];
        var highlight = use_your_logic_to_decide(colTitle, colValue);
        if (highlight) {
            item.get_Style().backgroundColor = "yellow";
        }
    }
    

    这是基本思想。如果您想将脚本添加到许多单元格中,手动执行此操作可能需要做很多工作。事实上,可以使用脚本将调用附加到 highlightDetailCell 函数(当然,这是 BIRT :-)。您应该阅读文档并修改 Design Engine API(简称 DE API)。

    但请注意,编写和调试这样的脚本可能比在 1200 个单元格中添加和编辑单行代码的工作量更大!

    我曾经做的基本上是这样的(在报告项的onFactory事件中):

    // This code is a simplified version that modifies just the first cell,
    // However it should point you into the right direction.
    
    // Some preparation
    importPackage(Packages.org.eclipse.birt.report.model.api);
    var myconfig = reportContext.getReportRunnable().getReportEngine().getConfig();
    var de = DataEngine.newDataEngine( myconfig, null );
    var elementFactory = reportContext.getDesignHandle().getElementFactory();
    
    // Find the item you want to modify (in my case, a "Grid Item").
    // Note that for tables, the structure is probably a bit different.
    // E.G. tables have header, detail and footer rows, 
    // while grids just have rows.
    var containerGrid = reportContext.getDesignHandle().findElement("Layout MATRIX");
    
    // Get the first row
    var row0 = containerGrid.getRows().get(0);
    // Do something with the first cell (:
    var cell = row0.getCells().get(0).getContent();
    cell.setStringProperty("paddingTop", "1pt");
    cell.setStringProperty("paddingLeft", "1pt");
    cell.setStringProperty("paddingRight", "1pt");
    cell.setStringProperty("paddingBottom", "1pt");
    cell.setStringProperty("borderBottomColor", "#000000");
    cell.setStringProperty("borderBottomStyle", "solid");
    cell.setStringProperty("borderBottomWidth", "thin");
    cell.setStringProperty("borderTopColor", "#000000");
    cell.setStringProperty("borderTopStyle", "solid");
    cell.setStringProperty("borderTopWidth", "thin");
    cell.setStringProperty("borderLeftColor", "#000000");
    cell.setStringProperty("borderLeftStyle", "solid");
    cell.setStringProperty("borderLeftWidth", "thin");
    cell.setStringProperty("borderRightColor", "#000000");
    cell.setStringProperty("borderRightStyle", "solid");
    cell.setStringProperty("borderRightWidth", "thin");
    
    // When you're finished:
    de.shutdown( );
    

    如果您必须处理合并的单元格,事情会更加复杂。

    您甚至可以向单元格添加内容(我以这种方式动态创建了一个完整的矩阵)。

    脚本并不完全符合您的要求(将脚本添加到每个单元格),但我将其留作练习...

    保存动态修改的报表设计以在设计器中打开以查看结果也很有帮助:

    reportContext.getDesignHandle().saveAs("c:/temp/modified_report.rptdesign");
    

    HTH

    【讨论】:

    • 没有办法通过函数将整个表格作为一个单元并循环遍历所有具有条件的单元格吗?
    • 我必须更正我关于 onPrepare 的评论(请参阅 cmets 到另一个答案):我所做的是使用报告的 beforeFactory 事件。在这里面,我使用 DE API 来查找(在我的例子中:)网格项并对其进行修改。我会稍微修改一下我的答案给你一个提示。
    • 方法 getrows 出现错误:TypeError:在对象 org.eclipse.birt.report.model.api.TableHandle@6b29fd6e 中找不到函数 getRows。 (/report/method[@name="beforeFactory"]#11) 在 org.eclipse.birt.report.engine.javascript.JavascriptEngine.evaluate(JavascriptEngine.java:295) 在 org.eclipse.birt.core.script。 ScriptContext.evaluate(ScriptContext.java:159) at org.eclipse.birt.report.engine.executor.ExecutionContext.evaluate(ExecutionContext.java:789)
    • 我用的是网格,你用的是表格。可能 API 略有不同,也许您应该尝试 getDetailRows()。
    【解决方案2】:

    转到要设置格式的单元格(也适用于行或列等元素),在“属性编辑器”中转到“突出显示”并单击“添加...”。您将看到一个对话框,您可以在其中输入突出显示的条件以及在条件为真时在元素上应用的样式。

    Screenshot here

    【讨论】:

    • 感谢您的回答。我不想为每个单元格设置一个条件,因为这将是无休止的工作。如果我为行或列做,我不知道如何以这种方式将其设置为单元格。您能否详细说明如何做到这一点。
    • 那恐怕我不太明白你的问题……你能举个例子说明你想做什么吗?
    • 我认为这种条件格式对您没有帮助,因为样式适用于整个元素...一种可能的替代方法是编写一个脚本,将样式应用于您需要的单元格,我'从来没有做过这样的事情,但我认为这应该是可能的。
    猜你喜欢
    • 2014-05-04
    • 2023-04-07
    • 2019-11-12
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多