Generate documents from templates with GroupDocs.Assembly
Leave feedback
On this page
GroupDocs.Assembly generates documents from a template and a data source. Unlike the rest of the suite it needs an input you have to author yourself: a template carrying <<[...]>> tags that say where the data goes.
<<[expr]>> inserts a value, <<foreach [x in xs]>>…<</foreach>> repeats a block, and expressions can compute. On a Java object the expression calls a public getter, for example manager.getName(). JSON, XML and spreadsheet fields are referred to by name, for example Name or Client.Name. The output format follows the output file’s extension.
Generate a document from a Java object
Pass any object as a data source and name it. The name is what the template’s tags refer to — here manager. The template single-row.txt contains:
importcom.groupdocs.assembly.DataSourceInfo;importcom.groupdocs.assembly.DocumentAssembler;publicclassManager{privatefinalStringname;privatefinalintage;publicManager(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}}Managermanager=newManager("John Smith",37);DocumentAssemblerassembler=newDocumentAssembler();// "manager" must match the name the template's tags use
assembler.assembleDocument("single-row.txt","assembly-object.txt",newDataSourceInfo(manager,"manager"));
single-row.txt is the template used in this example. Click here to download it.
Data source classes must be public, and the template can only call public methods or read public fields. The engine reflects over the object at generation time, so a non-public class fails at run time rather than compile time. The same applies to the item type inside a collection.
Generate a document from JSON
JsonDataSource reads a JSON file. The name passed to DataSourceInfo is what the template iterates. simple-dataset.docx contains:
Manager: John Smith
Contracts:
- A Company ($1200000)
- B Ltd. ($750000)
- C & D ($350000)
Manager: Tony Anderson
Contracts:
- E Corp. ($650000)
- F & Partners ($550000)
Manager: July James
Contracts:
- G & Co. ($350000)
- H Group ($250000)
- I & Sons ($100000)
- J Ent. ($100000)
The String argument of JsonDataSource is a file path. To assemble JSON held in memory, pass an InputStream instead.
Generate a document from a spreadsheet
DocumentTable reads one worksheet as a table of rows. setFirstRowContainsColumnNames(true) takes the first row as the field names. A space in a heading becomes an underscore, so the column Contract Price is Contract_Price in the template.
contracts-template.docx groups those rows by manager and sums the prices:
Total Contract Prices by Managers
Manager
Total Contract Price
<<foreach [group in contracts.groupBy(c => c.Manager).orderBy(g => g.key)]>><<[group.key]>>
<<[group.sum(c => c.Contract_Price)]>><</foreach>>
importcom.groupdocs.assembly.DataSourceInfo;importcom.groupdocs.assembly.DocumentAssembler;importcom.groupdocs.assembly.DocumentTable;importcom.groupdocs.assembly.DocumentTableOptions;DocumentTableOptionsoptions=newDocumentTableOptions();options.setFirstRowContainsColumnNames(true);// First worksheet: Client, Manager, Contract Price
DocumentTablecontracts=newDocumentTable("contracts-data.xlsx",0,options);DocumentAssemblerassembler=newDocumentAssembler();assembler.assembleDocument("contracts-template.docx","assembly-spreadsheet.docx",newDataSourceInfo(contracts,"contracts"));
GroupDocs.Assembly also reads XML, CSV and database data sources, generates tables, lists and charts from collections, supports conditional blocks and master-detail reports, and can insert hyperlinks and images from the data.