JasperReport - Использование DynamicJasper после создания большого количества отчетов JRXML - PullRequest
0 голосов
/ 28 ноября 2018

JasperReport - Использование DynamicJasper после создания большого количества отчетов JRXML

Обзор проблемы

В настоящее время мое программное обеспечение java использует скомпилированные файлы .jrxml.создавать отчеты.Однако пользователи жалуются, что хотят настроить отчеты.Что в основном, так что я узнал о DynamicJasper.Проблема в том, что у готовых отчетов .jasper, которые я ранее построил, есть свой собственный макет, который я в итоге настроил, вставив заполнители изображений для логотипов, которые отправляются через параметры.


ВОПРОС

Можно ли простым способом скопировать стиль или повторно использовать ранее созданные макеты отчетов?


Насколько я помню, я создавал эти отчеты, используя шаблон Jasper под названием Cherry.И для некоторых я использовал ландшафт, а для других - портретный тип.


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

Ссылки

Как использовать файл jrxml в качестве шаблона оформления в DynamicJasper

Как получить одинаковые стили в DynamicReports и JasperReports

1 Ответ

0 голосов
/ 04 декабря 2018

Итак, чтобы ответить на мой собственный вопрос, вот рецепт.

1º Вы берете свой jrxml и очищаете его в соответствии с: http://dynamicjasper.com/2010/10/06/how-to-use-custom-jrxml-templates/

Что в основном Требуется:

  • Шаблон не должен иметь групп, DynamicJAsper создаст их при необходимости.

  • Полоса детализации должна быть пустой: DynamicJasper будет работать в детальном диапазоне, любой ранее существующий элемент будет удален.

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

2º Вы вызываете метод setTemplateFile:

 public DynamicReportBuilder setTemplateFile(String path,
                                                         boolean importFields,
                                                         boolean importVariables,
                                                         boolean importParameters,
                                                         boolean importDatasets)

С помощьютребуются логические флаги.Эти булевы флаги позволят вам загружать или не загружать параметры, поля, переменные и набор данных, которые вы установили в своем jrxml.

И ниже я прилагаю фиктивный пример.Однако для тестирования вам понадобится собственный файл jrxml.

public class TestReport {

    protected static JasperPrint jp;
    protected static JasperReport jr;
    protected static Map params = new HashMap();
    protected static DynamicReport dr;

    public static void main(String args[]) throws SQLException, ColumnBuilderException, ClassNotFoundException {

        TestReport t = new TestReport();
        t.createReport();

    }

    public void createReport() throws SQLException, ColumnBuilderException, ClassNotFoundException {

        ArrayList<Fruit> createMockDataset = createMockDataset();

        Style titleStyle = new Style();
        titleStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        titleStyle.setFont(Font.ARIAL_SMALL_BOLD);

        Style dataStyle = new Style();
        dataStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        dataStyle.setFont(Font.ARIAL_SMALL);
        dataStyle.setBlankWhenNull(true);

        final List items = SortUtils.sortCollection(createMockDataset, Arrays.asList(new String[]{"name", "description"}));

        FastReportBuilder drb = new FastReportBuilder();
        drb.setTemplateFile("templatePortrait.jrxml", true, true, true, true);
        drb.addColumn("name", "name", String.class.getName(), 30, dataStyle)
                .addColumn("description", "description", String.class.getName(), 50, dataStyle)
                .setTitle("Report")
                .setSubtitle("")
                .setPrintBackgroundOnOddRows(true)
                .setUseFullPageWidth(true);



        DynamicReport dynamicReport = drb.build();

        dynamicReport.setTitleStyle(titleStyle);

        HashMap parametros = new HashMap();
        parametros.put("dataRelatorio", MyTools.getDataPorExtenso());

        doReport(dynamicReport, items, parametros);
    }

    public void doReport(final DynamicReport _report, final Collection _data, HashMap parametros) {
        try {
            JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(_data);

            JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint(_report, new ClassicLayoutManager(), beanCollectionDataSource, parametros);

            JasperViewer.viewReport(jasperPrint);
        } catch (JRException ex) {
            ex.printStackTrace();
        }
    }


    public ArrayList<Fruit> createMockDataset() {
        ArrayList<Fruit> fruits = new ArrayList<>();

        Fruit f1 = new Fruit();
        f1.name = "Apple X1";
        f1.description = "Yummy yummy apple for the stackoverflow readers 1";

        Fruit f2 = new Fruit();
        f2.name = "Apple Ag";
        f2.description = "Yummy yummy apple for the stackoverflow readers 2";

        Fruit f3 = new Fruit();
        f3.name = "Apple Mn";
        f3.description = "Yummy yummy apple for the stackoverflow readers 3";

        Fruit f4 = new Fruit();
        f4.name = "Apple O2";
        f4.description = "Yummy yummy apple for the stackoverflow readers 4";

        //Evaluations for f1
        for (int i = 0; i < 4; i++) {
            Evaluation e = new Evaluation();
            e.id = i;
            e.score = Math.random() * 10;
            f1.evaluations.add(e);
        }

        //evaluations for f4
        for (int i = 0; i < 4; i++) {
            Evaluation e = new Evaluation();
            e.id = i;
            e.score = Math.random() * 10;
            f4.evaluations.add(e);
        }

        fruits.add(f1);
        fruits.add(f2);
        fruits.add(f3);
        fruits.add(f4);

        return fruits;

    }

    public class Fruit {

        public String name;
        public String description;
        public ArrayList<Evaluation> evaluations = new ArrayList<Evaluation>();

        public Fruit() {

        }

        public Fruit(String name, String description) {
            this.name = name;
            this.description = description;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public ArrayList<Evaluation> getEvaluations() {
            return evaluations;
        }

        public void setEvaluations(ArrayList<Evaluation> evaluations) {
            this.evaluations = evaluations;
        }

    }

    public class Evaluation {

        public int id;
        public double score;

        public Evaluation() {

        }

        public Evaluation(int id, double score) {
            this.id = id;
            this.score = score;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public double getScore() {
            return score;
        }

        public void setScore(double score) {
            this.score = score;
        }

    }

}
...