DOCX Markup Language
This is a NodeJS/Deno module for making .docx
files from scratch or from
an existing DOCX/DOTX template.
You could use docxml
to:
- Create an MS Word file without ever opening MS Word
- Create a parameterized template file, and render it to DOCX with your data parameters
- Convert JSON, XML or other data structures to DOCX
- Parse content from an existing DOCX file
- Extract style definitions from a DOTX/DOCX file
This documentation for this lib is available at various locations:
👉 Documentation site
👉 GitHub source
👉 Deno mirror
👉 npm mirror
For Deno or for NodeJS
👉 Main article
docxml
can be used in NodeJS and Deno according to the traditions in those
ecosystems. For Node users, simply npm install docxml
and then require()
or import
as you wish. For Deno users,
import "deno.land/x/docxml/mod.ts"
or use an import map if you wish.
const { default: Docxml, Paragraph } = require('docxml');
import Docxml, { Paragraph } from 'docxml';
import Docxml, { Paragraph } from 'https://deno.land/x/docxml/mod.ts';
For JSX or for vanilla
👉 Main article
docxml
is designed to be used in vanilla JavaScript using class component instances, or using JSX if you're on Deno or
want to use NodeJS and a transpiler like Babel:
const para = new Paragraph({ alignment: 'center' }, new Text({}, 'I want a cookie'));
const para = (
<Paragraph alignment="center">
<Text>I want a cookie</Text>
</Paragraph>
);
For XML or for anything
docxml
is also designed to be used from scratch/entirely programmatically, or using a more ergonomic API
to transform from an XML document. Both modes work equally well with vanilla JS or JSX.
await Docx.fromJsx(
<Paragraph alignment="center">
<Text>I want a cookie</Text>
</Paragraph>,
).toFile('example-1.docx');
await Docx.fromNothing()
.withXmlRule('self::text()', ({ node }) => <Text>{node.nodeValue}</Text>)
.withXmlRule('self::p', ({ traverse, node }) => (
<Paragraph alignment={node.getAttribute('align')}>{traverse()}</Paragraph>
))
.withXml(`<p align="center">I want a cookie</p>`, {})
.toFile('example-2.docx');
Features
To great or small extend, the following features work in the current version of docxml
. Some items are not ticked off
yet -- they are not available, but hopefully soon.
👉 See code examples of some or the more intricate features
API features:
Custom styles:
References:
Tables:
Images:
Sections:
Comments:
Change tracking:
Differences with actual MS Word DOCX
Obviously docxml
is a TypeScript project, which is already very different from how you would normally interact
with a DOCX document. More meaningfully however, docxml
is meant to make writing DOCX easier than going straight
to OOXML. For example;
- All sizes are of type
Length
, which means it doesn't matter wether you input them as points, centimeters,
inches, 1/2, 1/8th or 1/20th points, English Metric Units, and so on. - The JSX pragma will try to correct components that would lead to invalid XML structures, by splitting the parents of
invalidly placed components recursively until the new position is valid. Moreover, string content in unexpected places
is automatically wrapped in
<Text>
when using JSX. This makes the configuration of a new DOCX a little more
forgiving. - Using the
<Image>
or <Comment>
components will automatically create all required relationships etc. - Some of the words have changed, generally speaking
docxml
is more verbose than the DOCX verbiage. - Generally speaking
docxml
prefers formal (JS) references over references-by-identifier. In those cases the
identifiers are randomly generated for you when the .docx
file is written. - Especially in tables and images, a lot of formatting details are automatically applied. In a lot of cases there
is no API yet to change them.
For contributors
This project uses unit tests and linting for quality control. To lint, both Deno's own linting as well as ESLint are used.
Please run both of the following commands to ensure that a GitHub Action does not fail later.
npm install
deno task test
deno task lint