- 5.15.3Latest
- 5.15.2
- 5.15.1
- 5.15.0
- 5.14.1
- 5.14.0
- 5.13.3
- 5.13.2
- 5.13.1
- 5.13.0
- 5.12.2
- 5.12.1
- 5.12.0
- 5.11.4
- 5.11.3
- 5.11.2
- 5.11.1
- 5.11.0
- 5.10.1
- 5.10.0
- 5.9.0
- 5.8.1
- 5.8.0
- 5.7.2
- 5.7.1
- 5.7.0
- 5.6.0
- 5.5.6
- 5.5.5
- 5.5.4
- 5.5.3
- 5.5.2
- 5.5.1
- 5.5.0
- 5.4.0
- 5.3.8
- 5.3.7
- 5.3.6
- 5.3.5
- 5.3.4
- 5.3.3
- 5.3.2
- 5.3.1
- 5.3.0
- 5.2.1
- 5.2.0
- 5.1.1
- 5.1.0
- 5.0.2
- 5.0.1
- 5.0.0
- 4.0.8
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.2.0
- 3.1.1
- 3.1.0
- 3.0.1
- 3.0.0
- 2.4.3
- 2.4.2
- 2.4.1
- 2.2.0
- 2.1.0
- 2.0.1
- 2.0.0
- 1.6.0
- 1.5.1
- 1.5.0
- 1.4.0
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.0
- 1.1.0
- 1.0.0
- 0.0.4
- 0.0.3
- 0.0.2
- 0.0.1
This is a Deno module for making .docx
files.
It can be used to create a .docx
using components, for example:
/** @jsx Docx.jsx */
import Docx, { Paragraph } from 'https://deno.land/x/docxml/mod.ts';
await Docx
.fromJsx(<Paragraph>This is the simplest document you could make.</Paragraph>)
.toFile('example-1.docx');
Or it can be used to convert any XML to DOCX:
/** @jsx Docx.jsx */
import Docx, { Paragraph, Text } from 'https://deno.land/x/docxml/mod.ts';
await Docx.fromNothing()
.withXmlRule('self::node()', ({ traverse }) => traverse('./*'))
.withXmlRule('self::text()', ({ node }) => <Text>{node.nodeValue}</Text>)
.withXmlRule('self::p', ({ traverse }) => <Paragraph>{traverse()}</Paragraph>)
.withXmlRule('self::strong', ({ traverse }) => <Text isBold>{traverse()}</Text>)
.withXml(
`<html>
<body>
<p>This is a very simply <strong>XML transformation</strong>.</p>
</body>
</html>`,
{},
)
.toFile('example-2.docx');
For the latest and greatest API documentation please go to https://doc.deno.land/https://deno.land/x/docxml/mod.ts
Formatting options
Paragraph formatting
Paragraph styles may be applied via different ways;
// As a prop:
<Paragraph alignment="center" />
// As a style:
const style = docx.styles.add({
type: 'paragraph',
paragraph: {
alignment: 'center',
},
});
<Paragraph style={style} />;
- See all the paragraph formatting options.
- Every style property, and every property of every style property, is optional;
Text formatting
// As a prop:
<Text isBold />
- See all the text formatting options
- Paragraph formatting options may be merged with text formatting options. When used directly on a component (ie. not via a style) the formatting only applies to the paragraph pilcrow (“¶”) sign. In MS Word, the text styling options merged into a paragraph style definition do apply to the paragraph text – but may still be overriden with dedicated text formatting options.
<Paragraph isBold>Text not shown as bold, but the paragraph's pilcrow is.</Paragraph>
// As a style:
const style = docx.styles.add({
type: 'paragraph',
text: {
isItalic: true,
},
paragraph: {
isBold: true,
},
});
<Paragraph style={style}>Text is shown as bold and italic</Paragraph>;
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:
API features:
- Asynchronous components
- Component composition
Custom styles:
- Font size and color
- Bold, italic, underline styles, strike-through
- Subscript, superscript, small caps
- Paragraph spacing and indentation
- Left/right/center/justified alignment
- Aligning text on tabs
- Font family
References:
- Cross references
- Table of contents
Tables:
- Colspans and rowspans
- Table borders
- Conditional formatting
Images:
- From any
UInt8Array
source - Alternative and title text
- Width and height
Sections:
- Width and height
- Orientation
Comments:
- Point comment
- Range comment
- Comment reply
Change tracking:
- Text additions and deletions
- Style changes
- Table row additions and deletions
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
# Run all unit tests
deno task test
# Run all linting
deno task lint