jasper-reportsdynamic-jasper

JasperReport - Using DynamicJasper after having a lot of JRXML reports built


JasperReport - Using DynamicJasper after having a lot of JRXML reports built

Problem Overview

Currently my java software uses compiled .jrxml files to generate reports. However, the users are complaining that they want to customize the reports. Which is basically So I found out about DynamicJasper. The problem is that the ready-to-use .jasper reports that I previously Built has their own layout which I ended up adjusting, inserting image placeholders for logos that are sent via parameters.


QUESTION

Is there a way to either copy the style or re-use these previously built report layouts in a simple way?


As far as I remember, I built those reports using the Jasper template called Cherry . And For some I used landscape and for others I used portrait type.


I Dont think this question is a duplicate due to the constraints of the problem itself: I cant rebuild every report to be DynamicJasper nor I can change the layour aggressively.

References

How to use jrxml file as design template in DynamicJasper

How to get same styles in DynamicReports and JasperReports


Solution

  • So to answer my own question, here's a recipe.

    1º You take your jrxml and clean it according to : http://dynamicjasper.com/2010/10/06/how-to-use-custom-jrxml-templates/

    Which basically requires:

    2º You call setTemplateFile method:

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

    With the required boolean flags. Those boolean flags will allow you to load or not load the parameters,fields,variables and dataset that you set on your jrxml.

    And below I attach a mock example. However, you are going to need your own jrxml file to test.

    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;
            }
    
        }
    
    }