#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. Я думаю, что это условное форматирование вам не поможет, потому что стиль применяется ко всему элементу … возможной альтернативой может быть написание скрипта, который применяет стиль к нужным вам ячейкам, я никогда не делал такого, но я думаю, что это должно быть возможно.