Docxide Template - Type safe MS Word templates for Rust.
[!WARNING] Work in progress. Subject to change. Do not assume this is ready for production.
docxide-template is a Rust crate for working with .docx / MS Word templates. It reads .docx 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 .docx templates in a folder (e.g. path/to/templates/), using {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} |
customer_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.
Embedded templates
By default, generate_templates! reads template files from disk at runtime. If you want a fully self-contained binary with no runtime file dependencies, enable the embed feature:
With embed enabled, template bytes are baked into the binary at compile time via include_bytes!. The same generate_templates! macro is used — no code changes needed.
Examples
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 — template bytes baked into the binary, no runtime file access needed:
See the examples/ directory for source code.
How it works
- The proc macro scans the given directory for
.docxfiles 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