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. 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.
Import the package first, so the Total library is on the classpath, then load the Assembly classes with java.import.
Note
Plain JavaScript objects cannot be passed as data sources, because they are not Java objects. Where the Java documentation binds a custom class such as Manager, pass JSON, XML or CSV of the same shape, or a DocumentTable.
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 a Java InputStream instead.
Generate a document from XML
XmlDataSource reads the same kind of structure from XML. The template above works unchanged when each manager is a <Manager> element and each contract is a nested <Contract>.
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)
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>>
import'@groupdocs/groupdocs.total';importjavafrom'java';constDocumentAssembler=java.import('com.groupdocs.assembly.DocumentAssembler');constDocumentTable=java.import('com.groupdocs.assembly.DocumentTable');constDocumentTableOptions=java.import('com.groupdocs.assembly.DocumentTableOptions');constDataSourceInfo=java.import('com.groupdocs.assembly.DataSourceInfo');constoptions=newDocumentTableOptions();options.setFirstRowContainsColumnNames(true);// First worksheet: Client, Manager, Contract Price
constcontracts=newDocumentTable('contracts-data.xlsx',0,options);constassembler=newDocumentAssembler();assembler.assembleDocument('contracts-template.docx','assembly-spreadsheet.docx',newDataSourceInfo(contracts,'contracts'));
GroupDocs.Assembly also reads 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.