StimVinsh / xdocreport

Automatically exported from code.google.com/p/xdocreport
0 stars 0 forks source link

XdocReport with FreeMarker <> Displaying values in a table #26

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?

1. I would like to create a document (.docx/.odt) from a template where i 
display values that come out of a database in a table like in the examples of 
DocxProjectWithFreemarkerList.java.
In my specific situation I trigger values from a database query and I get in 
return values that can be of any kind of variety.
So I don't want to make a specific object for it (like in the example - 
developer) each time I query other data.

2. I've been trying to work arround my problem and I found that when I use 
TemplateEngineKind.Velocity I can show my data in the table but not sorted 
(because you can't sort a HashMap). 
When I try to this with TemplateEngineKind.FreeMarker I get the 
freemarker.template.TemplateException: Expected collection or sequence 
exception. Because we have chosen for the FreeMarker template engine and I 
declare my vars in my template like the FreeMarker syntax I would like to fix 
this with FreeMarker.
3. Is there an option to fix this exception and to make the IContext (Map?) 
sortable for data?

My way of doing this:

            InputStream in = new FileInputStream("test.docx");
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Freemarker);

            // 2) Create fields metadata to manage lazy loop (#forech velocity)
            // for table row.
            FieldsMetadata metadata = new FieldsMetadata();
            metadata.addFieldAsList("developers.name");
            metadata.addFieldAsList("developers.lastName");
            metadata.addFieldAsList("developers.mail");
            report.setFieldsMetadata(metadata);

            // 3) Create context Java model
            IContext context = report.createContext();
            Project project = new Project("Liber");
            context.put("project", project);

            context.put("developers.0.name", "Stefan");
            context.put("developers.0.lastName", "Jans");
            context.put("developers.0.mail", "stefan.jans@bct.nl");
            context.put("developers.1.name", "Bjorn");
            context.put("developers.1.lastName", "Ramant");
            context.put("developers.1.mail", "bra@bct.nl");
            context.put("developers.2.name", "Matthijs");
            context.put("developers.2.lastName", "Rozema");
            context.put("developers.2.mail", "mro@bct.nl");
            context.put("developers.3.name", "Frank");
            context.put("developers.3.lastName", "Dijkstra");
            context.put("developers.3.mail", "fdi@bct.nl");

            // 4) Generate report by merging Java model with the Docx
            OutputStream out = new FileOutputStream(new File("test_output.docx"));
            report.process(context, out);

What is the expected output? What do you see instead?

1-aug-2011 15:02:40 freemarker.log.JDK14LoggerFactory$JDK14Logger error
SEVERE: Template processing error: "Expected collection or sequence. developers 
evaluated instead to freemarker.template.SimpleHash on line 2, column 3301 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml."

Expected collection or sequence. developers evaluated instead to 
freemarker.template.SimpleHash on line 2, column 3301 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
The problematic instruction:
----------
==> list developers as item_developers [on line 2, column 3294 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateException: Expected collection or sequence. 
developers evaluated instead to freemarker.template.SimpleHash on line 2, 
column 3301 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
    at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:136)
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:190)
    at freemarker.core.Environment.visit(Environment.java:428)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.EscapeBlock.accept(EscapeBlock.java:84)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.Environment.process(Environment.java:199)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.process(FreemarkerTemplateEngine.java:126)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.processWithCache(FreemarkerTemplateEngine.java:78)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:88)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:66)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.processTemplateEngine(AbstractXDocReport.java:593)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:397)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:365)
    at docxandfreemarker.DocxFreeMarkerLiber.main(DocxFreeMarkerLiber.java:68)
fr.opensagres.xdocreport.core.XDocReportException: 
freemarker.template.TemplateException: Expected collection or sequence. 
developers evaluated instead to freemarker.template.SimpleHash on line 2, 
column 3301 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.process(FreemarkerTemplateEngine.java:128)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.processWithCache(FreemarkerTemplateEngine.java:78)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:88)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:66)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.processTemplateEngine(AbstractXDocReport.java:593)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:397)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:365)
    at docxandfreemarker.DocxFreeMarkerLiber.main(DocxFreeMarkerLiber.java:68)
Caused by: freemarker.template.TemplateException: Expected collection or 
sequence. developers evaluated instead to freemarker.template.SimpleHash on 
line 2, column 3301 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
    at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:136)
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:190)
    at freemarker.core.Environment.visit(Environment.java:428)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.EscapeBlock.accept(EscapeBlock.java:84)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.Environment.process(Environment.java:199)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.process(FreemarkerTemplateEngine.java:126)
    ... 7 more

What version of the product are you using? On what operating system?

The latest.

Please provide any additional information below.

My template is the same as in the example:

Project : «${project.name}»
Developers (Section) : 
--------------------------------------------------------------------------------
------------------------------------------------------
Developers (Table) :
Name    Last name   Mail
«${developers.name}»
«${developers.lastName}»
«${developers.mail}»

Original issue reported on code.google.com by stefan.j...@gmail.com on 1 Aug 2011 at 1:36

GoogleCodeExporter commented 8 years ago
Hi Stefan, 

It seems that it's the same issue than 
http://code.google.com/p/xdocreport/issues/detail?id=18

where you don't want use Developer model. If you see this isuee, you will  see 
you can do the same thing with Map object : 

----------------------------------------
List<Map<String,String>> developers = new ArrayList<Map<String,String>>();
Map<String,String> developer1 = new HashMap<String, String>();
developer1.put("Name", "ZERR");
developer1.put("LastName", "Angelo");
developer1.put("Mail", "angelo.zerr@gmail.com");

context.put("developers", developers);
----------------------------------------

Instead of : 

----------------------------------------
List<Developer> developers = new ArrayList<Developer>();
developers.add(new Developer("ZERR", "Angelo","angelo.zerr@gmail.com"));

context.put("developers", developers);
----------------------------------------

Is it your need?

Regards Angelo

Original comment by angelo.z...@gmail.com on 1 Aug 2011 at 1:45

GoogleCodeExporter commented 8 years ago
Hello Angelo,

Thank you for your fast reply.
I changed my code to:

            List<Map<String, String>> developers = new ArrayList<Map<String, String>>();
            Map<String, String> developer1 = new HashMap<String, String>();
            developer1.put("Name", "ZERR");
            developer1.put("LastName", "Angelo");
            developer1.put("Mail", "angelo.zerr@gmail.com");

            Map<String, String> developer2 = new HashMap<String, String>();
            developer2.put("Name", "Stefan");
            developer2.put("LastName", "Jans");
            developer2.put("Mail", "stefan.jansss@gmail.com");

            developers.add(developer1);
            developers.add(developer2);
            context.put("developers", developers);

But I'm still getting the error:

1-aug-2011 16:21:08 freemarker.log.JDK14LoggerFactory$JDK14Logger error
SEVERE: Template processing error: "Expression any is undefined on line 1, 
column 17 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml."

Expression any is undefined on line 1, column 17 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
The problematic instruction:
----------
==> ${item_developers.name} escaped ${item_developers.name?xml} [on line 2, 
column 3577 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression any is undefined on line 
1, column 17 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
    at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
    at freemarker.core.Expression.getStringValue(Expression.java:118)
    at freemarker.core.Expression.getStringValue(Expression.java:93)
    at freemarker.core.StringBuiltins$StringBuiltIn._getAsTemplateModel(StringBuiltins.java:71)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.Expression.getStringValue(Expression.java:93)
    at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
    at freemarker.core.Environment.visit(Environment.java:428)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.EscapeBlock.accept(EscapeBlock.java:84)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.Environment.process(Environment.java:199)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.process(FreemarkerTemplateEngine.java:126)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.processWithCache(FreemarkerTemplateEngine.java:78)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:88)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:66)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.processTemplateEngine(AbstractXDocReport.java:593)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:397)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:365)
    at docxandfreemarker.DocxFreeMarkerLiber.main(DocxFreeMarkerLiber.java:63)
fr.opensagres.xdocreport.core.XDocReportException: 
freemarker.core.InvalidReferenceException: Expression any is undefined on line 
1, column 17 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.process(FreemarkerTemplateEngine.java:128)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.processWithCache(FreemarkerTemplateEngine.java:78)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:88)
    at fr.opensagres.xdocreport.template.AbstractTemplateEngine.process(AbstractTemplateEngine.java:66)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.processTemplateEngine(AbstractXDocReport.java:593)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:397)
    at fr.opensagres.xdocreport.document.AbstractXDocReport.process(AbstractXDocReport.java:365)
    at docxandfreemarker.DocxFreeMarkerLiber.main(DocxFreeMarkerLiber.java:63)
Caused by: freemarker.core.InvalidReferenceException: Expression any is 
undefined on line 1, column 17 in 
fr.opensagres.xdocreport.document.docx.DocXReport@1e97676!word/document.xml.
    at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
    at freemarker.core.Expression.getStringValue(Expression.java:118)
    at freemarker.core.Expression.getStringValue(Expression.java:93)
    at freemarker.core.StringBuiltins$StringBuiltIn._getAsTemplateModel(StringBuiltins.java:71)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.Expression.getStringValue(Expression.java:93)
    at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
    at freemarker.core.Environment.visit(Environment.java:428)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.EscapeBlock.accept(EscapeBlock.java:84)
    at freemarker.core.Environment.visit(Environment.java:221)
    at freemarker.core.Environment.process(Environment.java:199)
    at fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine.process(FreemarkerTemplateEngine.java:126)
    ... 7 more
Process exited with exit code 0.

Original comment by stefan.j...@gmail.com on 1 Aug 2011 at 2:23

GoogleCodeExporter commented 8 years ago
Yes it's normal because you are using Freemarker template engien (my sampel was 
for Velocity). developers.Name cannot work, its developers.name (lowercase). So 
try with this code: 

----------------------------------------
List<Map<String, String>> developers = new ArrayList<Map<String, String>>();
Map<String, String> developer1 = new HashMap<String, String>();
developer1.put("name", "ZERR");
developer1.put("lastName", "Angelo");
developer1.put("mail", "angelo.zerr@gmail.com");
developers.add(developer1);

Map<String, String> developer2 = new HashMap<String, String>();
developer2.put("name", "Stefan");
developer2.put("lastName", "Jans");
developer2.put("mail", "stefan.jansss@gmail.com");
developers.add(developer2);

context.put("developers", developers);
----------------------------------------

Regards Angelo

Original comment by angelo.z...@gmail.com on 1 Aug 2011 at 2:30

GoogleCodeExporter commented 8 years ago
Oh I'm sorry for my mistake..
Thank you very much!

Original comment by stefan.j...@gmail.com on 1 Aug 2011 at 2:37

GoogleCodeExporter commented 8 years ago

Original comment by angelo.z...@gmail.com on 5 Aug 2011 at 1:37