Цвет ячейки в соответствии с условием

#javascript #eclipse #styles #birt

#javascript #затмение #стили #birt

Вопрос:

У меня есть таблица, в которой я должен установить цвет фона, когда ячейка в заголовке и ячейка в строке отображаются как пара в определенном списке в источнике данных. Например: столбец: «AUD, USD» строка: «BRL, CZK»

в ячейке столбца AUD и строки — BRL я проверяю, существует ли в списке в источнике данных «AUD-BRL», и если да, то мне нужно покрасить в зеленый цвет

Теперь я подумал сделать это таким образом: столбцы и строки будут в списках. Я просматриваю оба списка, а затем окрашиваю эти индексы в ячейку.

Так что у меня будет одна функция для всей таблицы, и мне не придется вызывать функцию из каждой ячейки (всего 1200 ячеек). Как это можно сделать?

Ответ №1:

Ответ от Fede MG правильный.

Если я правильно понял ваш вопрос, вы хотите добавить правило выделения ко всем ячейкам в строке сведений таблицы. К сожалению, я думаю, что это немного громоздко для достижения этого в BIRT.

Я предполагаю, что в вашей таблице есть, например, такие привязки, как COL_VALUE_1, …, COL_VALUE_9 для значений ячеек и COL_TITLE_1, …, COL_TITLE_9 для заголовков столбцов.

Кроме того, я предполагаю, что у меня есть небольшой опыт использования Javascript в BIRT.

То, как я это делаю, выглядит следующим образом:

Для каждой подробной ячейки я создаю сценарий onCreate события с таким кодом:

 highlightDetailCell(this, row, 1);
  

… где 1 — номер столбца. Например, это код для первого столбца, для второго столбца я заменяю 1 на 2 и так далее. Это можно быстро сделать с помощью copy amp; paste .

Затем я реализую логику в функции внутри 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 :-). Вы должны прочитать документацию и просто поработать с API Design Engine (сокращенно 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

Комментарии:

1. Нет способа сделать это с помощью функции для всей таблицы как единого целого и перебирать все ячейки с условием?

2. Я должен исправить свой комментарий относительно onPrepare (см. Комментарии к другому ответу): то, что я сделал, это использовал событие beforeFactory отчета. Внутри этого я использовал DE API, чтобы найти (в моем случае: ) элемент сетки и изменить его. Я немного изменю свой ответ, чтобы дать вам подсказку.

3. получение ошибок для метода getrows: ошибка типа: не удается найти функцию GetRows в объекте org.eclipse.birt.report.model.api.TableHandle@6b29fd6e . (/report/метод[@name=»beforeFactory»] #11) в org.eclipse.birt.report.engine.javascript.JavascriptEngine.evaluate(JavascriptEngine.java:295) в org.eclipse.birt.core.script.ScriptContext.evaluate(ScriptContext.java:159)в org.eclipse.birt.report.engine.executor. ExecutionContext.evaluate(ExecutionContext.java:789)

4. Я использовал сетку, вы используете таблицу. Возможно, API немного отличается, может быть, вам стоит попробовать getDetailRows() .

Ответ №2:

Перейдите к ячейке, которую вы хотите отформатировать (применяется также к таким элементам, как строки или столбцы), в «Редакторе свойств» перейдите в раздел «Основные моменты» и нажмите «Добавить …». Вы получите диалоговое окно, в котором вы можете ввести условие для выделения и какой стиль применить к элементу, еслиусловие выполняется.

Скриншот здесь

Комментарии:

1. Спасибо за ваш ответ. Я не хочу устанавливать для каждой ячейки условие, поскольку это будет бесконечная работа. и если я делаю для строк или столбцов, я не знаю, как установить его в ячейку таким образом. можете ли вы подробнее рассказать о том, как это можно сделать.

2. Тогда, боюсь, я не совсем понял вашу проблему … можете ли вы показать пример того, что вы хотите сделать?

3. Я думаю, что это условное форматирование вам не поможет, потому что стиль применяется ко всему элементу … возможной альтернативой может быть написание скрипта, который применяет стиль к нужным вам ячейкам, я никогда не делал такого, но я думаю, что это должно быть возможно.