@momsfriendlydevco/spreadsheet-templater
v1.1.10
Published
Simple templates markup for spreadsheets
Downloads
6
Readme
Spreadsheet-Templater
Simple templates markup for spreadsheets (via XLSX).
This plugin allows a spreadsheet to use handlebars-like notation to replace cell contents which enables an input spreadsheet to act as a template for incoming data.
var SpreadsheetTemplater = require('@momsfriendlydevco/spreadsheet-templater');
new SpreadsheetTemplater()
.read('input.xlsx')
.data({...})
.apply()
.write('output.xlsx')
See the test directory for some example spreadsheets.
Limitations
There are a few restrictions with this module, mainly due to time and technical limitations:
- Nested
{{#each}}
+{{/each}}
statements are not supported - Due to no support for dynamic row adding, at the time of writing, in the upstream xlsx-populate library this module will overwrite all rows below the
{{each}}
blocks with however many rows of data need placing - the spreadsheet contents below the{{each}}
blocks will not be moved down
Debugging
This module uses the Debug NPM. To enable simply set the DEBUG
environment variable to include spreadsheet-templater
Markup
This module reads all cells in all sheets and applies simple substitutions based on a Handlebars like template based on an input data set.
Simple substitution
Simple substitution is performed by putting a lodash compatible dotted notation path inside double braces.
For example {{people.0.name}}
- extracts from the data object the key people
, the first element of the array and the subkey name
.
Repeaters
Basic support is provided for single level repeaters. Repeaters start ({{#each ITERABLE}}
) in the first cell and are read horizontally until the end is encountered ({{/each}}
).
For example assuming the following CSV spreadsheet layout:
Name,Email,Phone,Address
{{#each people}}{{name}},{{email}},{{phone}},"{{address.street}}, {{address.city}}, {{address.zipcode}}{{/each}}"
The spreadsheet would be populated with all items in the people
collection until exhausted.
If no specific data path is specified for each (i.e. {{#each}}
) the main data object is assumed to be an array and it is used instead.
API
The module exposes a single object.
This module supports the following options:
| Option | Type | Default | Description |
|-------------------------|----------|----------------------------|---------------------------------------------------------------------------------|
| re
| Object | | The regular expressions used when detecting markup |
| re.expression
| RegExp | /{{(.+?)}}/
| RegExp to detect a single expression replacement |
| re.repeatStart
| RegExp | /{{#?\s*each\s+(.+?)}}/g
| How to identify the start of a repeater |
| re.repeatEnd
| RegExp | /{{\/each.*?}}/
| How to identify the end of a repeater |
| repeaterSilentOnError
| Boolean | false
| Whether the module should throw when a non-array path is provided to a repeater |
| template
| Object | | Options to control templates |
| template.path
| String | | The source file to process the template from |
| data
| Object | {}
| The data object used when marking up the template output |
| defaultValue
| Any | ''
| The value used when no corresponding simple dotted path can be located |
| templateDetect
| Function | See code | How to determine if a cell needs to be templated |
| templatePreProcess
| Array | []
| Array of functions that can mutate a cell template before processing |
| templateSettings
| Object | See code | Settings passed to the templating NPM |
| dateDetect
| RegEx | See code | RegEx for detecting date output before formatting |
| dateFormat
| String | "dd/mm/yyyy"
| The date format to use when dateDetect
succeeds |
Constructor([options])
Setup the initial object with options.
set(key, [val])
Set a single or multiple options (if key is an object). Lodash array and dotted notation is supported for the key.
read([path])
Parse the input template file. This function is automatically called if constructor is given a filename when initialized.
apply([data])
Apply the given data (or the data specified in options.data
) to the loaded template.
data([data])
Alternate way to set template data.
json()
Convenience function to return the workbook as a JSON object This will return an object with each key as the sheet ID and a 2D array of cells