#java #parameters #jasper-reports #expression #evaluation
Вопрос:
Мне приходится хуже всего, пытаясь понять, как оценивать выражения с параметрами из загруженного файла JRXML во время выполнения, прежде чем начнется генерация всего файла jasper PDF. До сих пор это работает для простых выражений, которым не нужны никакие параметры извне. Но мне нужно оценить выражение с заданными параметрами.
Некоторые рабочие примеры кода на Java для оценки без параметров:
JasperDesign jasperDesign = JRXmlLoader.load(jrxmlStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
DefaultJasperReportsContext jasperReportsContext = DefaultJasperReportsContext.getInstance();
List<JRExpression> compiledExpressions = JRExpressionCollector.collectExpressions(jasperReportsContext, jasperReport);
int size = compiledExpressions.size();
JRExpression expression = compiledExpressions.get(size - 1);
JREvaluator evaluator = JasperCompileManager.loadEvaluator(jasperReport);
Object jasperEvaluatedValue = evaluator.evaluate(expression);
И теперь я застрял. Этот статический API не очень дружелюбен. Кто-нибудь пытался оценить выражения таким образом? Когда я делаю что-то «стандартным способом», позволяя Джасперу выполнять свою работу и передавая карту параметров в JasperFillManager:
JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
все оценивается отлично, и мой вывод в формате PDF верен. Но перед этим мне нужно оценить эти выражения.
Комментарии:
1. Это снимок в темноте (никогда не пытался это сделать), но, глядя на
JREvaluator
него, похоже, что вы можете инициализировать его с помощью параметров, полей и переменных. jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/… Ты пробовал это сделать?2. Спасибо, но я видел это и, к сожалению, не могу создать карту JRFillParameters (этот метод требует таких параметров) из-за защищенного конструктора. Я ищу, как извлечь эти параметры из других объектов JR или как-то преобразовать, но до сих пор не нашел решения.
3. Не оптимально, извините, что я не посмотрел, но вы могли бы (если это не окончательно) просто расширить класс для целей вашего тестирования (или что бы вы ни делали), сделав защищенный конструктор доступным?
4. Это похоже на большую лопатку (или план Б). Должен быть законный способ решения этой проблемы. Это даже не кажется очень сложным сценарием, я просто пытаюсь указать некоторые параметры перед оценкой. API Jasperreports просто трудно читать. Но я запомню ваше предложение 🙂
5. Я согласен с вами на 100%, но, просматривая код (быстро), я не вижу ничего, кроме того, чтобы воспользоваться преимуществами
protected
. Извини, парень.
Ответ №1:
Вы можете придумать способ оценки выражений с параметрами, посмотрев на источник JRParameterDefaultValuesEvaluator
Код будет выглядеть примерно так:
JRFillObjectFactory factory = new JRFillObjectFactory((JRBaseFiller) null, null) {
@Override
public JRFillGroup getGroup(JRGroup group) {
return super.getGroup(null);
}
};
JRDataset reportDataset = jasperReport.getMainDataset();
JRFillDataset fillDataset = factory.getDataset(reportDataset);
fillDataset.createCalculator(jasperReport);
fillDataset.initCalculator();
fillDataset.setParameterValues(map);
Object jasperEvaluatedValue = fillDataset.evaluateExpression(expression, JRExpression.EVALUATION_DEFAULT);
В качестве альтернативы вы можете поместить выражение в отчет в качестве выражения значения параметра по умолчанию и напрямую использовать JRParameterDefaultValuesEvaluator для оценки значений параметра по умолчанию и извлечения оцененного выражения из результата.