Docxide Template - Type safe MS Word templates for Rust.
docxide-template is a Rust crate for working with MS Word templates such as .docx, .docxm, .dotx, .dotm It reads your template files, finds {placeholder} patterns in document text, and generates type-safe Rust structs with those placeholders as fields. The generated structs include a save() method that produces a new .docx with placeholders replaced by field values and a to_bytes() for outputting the raw bytes.
Usage
Place your templates in a folder (e.g. path/to/templates/), containing {PlaceholderName} for variables.
Then invoke the macro:
use generate_templates;
generate_templates!;
Placeholders are converted to snake_case struct fields automatically:
| Placeholder in template | Struct field |
|---|---|
{FirstName} |
first_name |
{last_name} |
last_name |
{middle-name} |
middle_name |
{companyName} |
company_name |
{USER_COUNTRY} |
user_country |
{first name} |
first_name |
{ ZipCode } |
zip_code |
{ZIPCODE} |
zipcode |
Note: all upper- or lower-caps without a separator (like
ZIPCODE) can't be split into words — useZIP_CODEor another format if you want it to becomezip_code.
Polymorphism
All generated structs implement the DocxTemplate trait, which lets you write functions that accept any template type. This is useful for batch processing, pipelines, or anywhere you don't want to care about which specific template you're working with:
use ;
use Path;
generate_templates!;
The trait provides to_bytes(), save(), replacements(), and template_path(), so generic code has full access to both output generation and introspection. See the batch export example.
Deployment
Default: templates loaded at runtime
By default, templates are read from disk when to_bytes() or save() is called. The path you pass to the macro is stored as-is, so it resolves relative to the working directory at runtime:
generate_templates!;
This means you can build a binary and ship it alongside the template folder. As long as the relative path structure is preserved, it works from any machine:
my-app/
binary
templates/
HelloWorld.docx
Invoice.docx
Run from my-app/ and the binary finds templates/ just like it did during development. This is the natural layout for CI/CD artifacts, Docker images, or any deployment where you want to update templates without recompiling.
Embedded: fully self-contained binary
If you don't need runtime template swapping and want a single binary with no file dependencies, enable the embed feature:
With embed enabled, template bytes are baked into the binary at compile time via include_bytes!. The binary works anywhere with no template files on disk. The same generate_templates! macro is used.
Examples
See the examples/ directory for details.
Save to file — fill a template and write it to disk:
To bytes — fill a template and get the .docx as Vec<u8> in memory, useful for piping into other processing steps:
Embedded — self-contained binary with templates baked in at compile time:
Batch export — process different template types uniformly via dyn DocxTemplate:
How it works
- The proc macro scans the given directory for template files at compile time
- Each file becomes a struct named after the filename (PascalCase)
{placeholder}patterns become struct fields (snake_case)save()opens the original template, replaces all placeholders in the XML, and writes a new.docx
License
MIT