Экспорт JasperReports в Excel использует только последний установленный цвет фона - PullRequest
0 голосов
/ 25 февраля 2020

Я довольно новичок в Dynami c -Jasper, но из-за работы мне пришлось добавить новую функцию в наше уже реализованное решение.

Моя проблема

Цель состоит в том, чтобы добавить столбец к отчету, который состоит только из фона, основанного на некоторой информации. Мне удалось это сделать, но во время тестирования я наткнулся на проблему. В то время как все мои столбцы в представлении html и pdf имели правильный цвет, в Excel один окрашивал только поля в последнем цвете.

Во время отладки я заметил, что одинаковые цветные поля имеют одинаковый templateId, но в то время как все представления выполняются в основном в одном и том же коде, Excel показывал разное поведение и имел одинаковый идентификатор во всех полях.

Мой код, где я манипулировал шаблоном

for(JRPrintElement elemt : jasperPrint.getPages().get(0).getElements()) {
         if(elemt instanceof JRTemplatePrintText) {
                   JRTemplatePrintText text = (JRTemplatePrintText) elemt;
                   (...)
                   if (text.getFullText().startsWith("COLOR_IDENTIFIER")) {
                            String marker = text.getFullText().substring(text.getFullText().indexOf('#') + 1);
                            text.setText("ID = " + ((JRTemplatePrintText) elemt).getTemplate().getId());
                            int rgb = TypeConverter.string2int(Integer.parseInt(marker, 16) + "", 0);
                            ((JRTemplatePrintText) elemt).getTemplate().setBackcolor(new Color(rgb));
                   }
         }
}

Представление html

Представление Excel

Временное заключение

одни и те же стили используют одни и те же объекты в фоновом режиме, а экспорт JR-Excel портит что-то, назначая один и тот же объект всем полям, которыми я там манипулировал. Если кто-то знает о моей ошибке или потенциальном Решении изменить что-то другое, чтобы привести к тому же самому, пожалуйста, дайте мне знать.

Что-то другое, что я пробовал ранее, пытался установить поле в методе оценки, который вызывался Джаспер. В этом методе мы присваиваем текстовое значение каждому полю. Он содержал карту с JRFillFields, но, к сожалению, Map-реализации отказал в доступе к ним и просто переназначил их значение. Карта была предоставлена ​​dj и не может быть переключена на другую.

Редактировать

Мы используем JasperReports 6.7.1

1 Ответ

0 голосов
/ 03 марта 2020

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

JRTemplateElement custom = 
   new JRTemplateText(((JRTemplatePrintText) elemt).getTemplate().getOrigin(), 
   ((JRTemplatePrintText) elemt).getTemplate().getDefaultStyleProvider());
custom.setBackcolor(new Color(rgb));
custom.setStyle(((JRTemplatePrintText) elemt).getTemplate().getStyle());
((JRTemplatePrintText) elemt).setTemplate(custom);
...