Office Open XML Generator using Node.js streams. Supporting Microsoft Office 2007 and later Word (docx), PowerPoint (pptx,ppsx) and Excel (xlsx). This module is for all frameworks and environments. No need for any commandline tool - this module is doing everything inside it.
npm install officegen-2bash
$ git clone git://github.com/vtloc/officegen.git
`
via npm:
`bash
$ npm install officegen-2
`
This module is depending on:
- archiver
- setimmediate
- fast-image-size
- underscore
- xmlbuilder
Public API: ##
$3
`js
var officegen = require('officegen');
`
There are two ways to use the officegen function:
`js
officegen ( '' );
officegen ({
'type': ''
// More options here (if needed)
});
`
Generating PowerPoint 2007 object:
`js
var pptx = officegen ( 'pptx' );
`
Generating Word 2007 object:
`js
var docx = officegen ( 'docx' );
`
Generating Excel 2007 object:
`js
var xlsx = officegen ( 'xlsx' );
`
General events of officegen:
- 'finalize' - been called after finishing to create the document.
- 'error' - been called on error.
Event examples:
`js
pptx.on ( 'finalize', function ( written ) {
console.log ( 'Finish to create a PowerPoint file.\nTotal bytes created: ' + written + '\n' );
});
pptx.on ( 'error', function ( err ) {
console.log ( err );
});
`
Another way to register either 'finalize' or 'error' events:
`js
var pptx = officegen ({
'type': 'pptx', // or 'xlsx', etc
'onend': function ( written ) {
console.log ( 'Finish to create a PowerPoint file.\nTotal bytes created: ' + written + '\n' );
},
'onerr': function ( err ) {
console.log ( err );
}
});
`
If you are preferring to use callbacks instead of events you can pass your callbacks to the generate method
(see below).
Now you should fill the object with data (we'll see below) and then you should call generate with
an output stream to create the output Office document.
Example with pptx:
`js
var out = fs.createWriteStream ( 'out.pptx' );
pptx.generate ( out );
`
Passing callbacks to generate:
`js
var out = fs.createWriteStream ( 'out.pptx' );
pptx.generate ( out, {
'finalize': function ( written ) {
console.log ( 'Finish to create a PowerPoint file.\nTotal bytes created: ' + written + '\n' );
},
'error': function ( err ) {
console.log ( err );
}
});
`
Generating HTTP stream (no file been created):
`js
var http = require("http");
var officegen = require('officegen');
http.createServer ( function ( request, response ) {
response.writeHead ( 200, {
"Content-Type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
'Content-disposition': 'attachment; filename=surprise.pptx'
});
var pptx = officegen ( 'pptx' );
pptx.on ( 'finalize', function ( written ) {
// ...
});
pptx.on ( 'error', function ( err ) {
// ...
});
// ... (fill pptx with data)
pptx.generate ( response );
}).listen ( 3000 );
`
$3
#### MS-Office document properties (for all document types): ###
The default Author of all the documents been created by officegen is 'officegen'. If you want to put anything else please
use the 'creator' option when calling the officegen function:
`js
var pptx = officegen ({
'type': 'pptx', // or 'xlsx', etc
'creator': ''
});
`
Change the document title (pptx,ppsx,docx):
`js
var pptx = officegen ({
'type': 'pptx',
'title': ''
});
// or
pptx.setDocTitle ( '' );
`
For Word only:
`js
var docx = officegen ({
'type': 'docx',
'subject': '...',
'keywords': '...',
'description': '...'
});
// or
docx.setDocSubject ( '...' );
docx.setDocKeywords ( '...' );
docx.setDescription ( '...' );
`
#### PowerPoint: ####
Creating a new slide:
`js
slide = pptx.makeNewSlide ();
`
The returned object from makeNewSlide representing a single slide. Use it to add objects into this slide.
You must create at last one slide on your pptx/ppsx document.
Inside each slide you can place objects, for example: text box, shapes, images, etc.
Properties of the slide object itself:
- "name" - name for this slide.
- "back" - the background color.
- "color" - the default font color to use.
- "show" - change this property to false if you want to disable this slide.
The slide object supporting the following methods:
- addText ( text, options )
- addShape ( shape, options )
- addImage ( image, options )
- addPieChart ( data )
- addColumnChart ( data )
- addBarChart ( data )
Read only methods:
- getPageNumber - return the ID of this slide.
Common properties that can be added to the options object for all the add based methods:
- x - start horizontal position. Can be either number, percentage or 'c' to center this object (horizontal).
- y - start vertical position. Can be either number, percentage or 'c' to center this object (vertical).
- cx - the horizontal size of this object. Can be either number or percentage of the total horizontal size.
- cy - the vertical size of this object. Can be either number or percentage of the total vertical size.
- color - the font color for text.
- fill - the background color.
- line - border color / line color.
- flip_vertical: true - flip the object vertical.
- shape - see below.
Font properties:
- font_face
- font_size
- bold: true
- underline: true
Text alignment properties:
- align - can be either 'left' (default), 'right', 'center' or 'justify'.
- indentLevel - indent level (number: 0+, default = 0).
Line/border extra properties (only effecting if the 'line' property exist):
- 'line_size' - line width in pixels.
- 'line_head' - the shape name of the line's head side (either: 'triangle', 'stealth', etc).
- 'line_tail' - the shape name of the line's tail side (either: 'triangle', 'stealth', etc).
The 'shape' property:
Normally every object is a rectangle but you can change that for every object using the shape property, or in case that
you don't need to write any text inside that object, you can use the addShape method instead of addText. Use the shape
property only if you want to use a shape other then the default and you also want to add text inside it.
Shapes list:
- 'rect' (default) - rectangle.
- 'ellipse'
- 'roundRect' - round rectangle.
- 'triangle'
- 'line' - draw line.
- 'cloud'
- 'hexagon'
- 'flowChartInputOutput'
- 'wedgeEllipseCallout'
- (much more shapes already supported - I'll update this list later)
Please note that every color property can be either:
- String of the color code. For example: 'ffffff', '000000', '888800', etc.
- Color object:
- 'type' - The type of the color fill to use. Right now only 'solid' supported.
- 'color' - String with the color code to use.
- 'alpha' - transparent level (0-100).
Adding images:
Just pass the image file name as the first parameter to addImage and the 2nd parameter, which is optional, is normal options objects
and you can use all the common properties ('cx', 'cy', 'y', 'x', etc).
Examples:
Changing the background color of a slide:
`js
slide.back = '000088';
`
or:
`js
slide.back = { type: 'solid', color: '008800' };
`
Examples how to put text inside the new slide:
`js
// Change the background color:
slide.back = '000000';
// Declare the default color to use on this slide (default is black):
slide.color = 'ffffff';
// Basic way to add text string:
slide.addText ( 'This is a test' );
slide.addText ( 'Fast position', 0, 20 );
slide.addText ( 'Full line', 0, 40, '100%', 20 );
// Add text box with multi colors and fonts:
slide.addText ( [
{ text: 'Hello ', options: { font_size: 56 } },
{ text: 'World!', options: { font_size: 56, font_face: 'Arial', color: 'ffff00' } }
], { cx: '75%', cy: 66, y: 150 } );
// Please note that you can pass object as the text parameter to addText.
slide.addText ( 'Office generator', {
y: 66, x: 'c', cx: '50%', cy: 60, font_size: 48,
color: '0000ff' } );
slide.addText ( 'Boom!!!', {
y: 250, x: 10, cx: '70%',
font_face: 'Wide Latin', font_size: 54,
color: 'cc0000', bold: true, underline: true } );
`
Examples how to add chart into the slide:
`js
// Column chart
slide = pptx.makeNewSlide();
slide.name = 'Chart slide';
slide.back = 'ffffff';
slide.addColumnChart(
{ title: 'Column chart',
data: [ // each item is one serie
{
name: 'Income',
labels: ['2005', '2006', '2007', '2008', '2009'],
values: [23.5, 26.2, 30.1, 29.5, 24.6]
},
{
name: 'Expense',
labels: ['2005', '2006', '2007', '2008', '2009'],
values: [18.1, 22.8, 23.9, 25.1, 25]
}]
}
)
// Pie chart
slide = pptx.makeNewSlide();
slide.name = 'Pie Chart slide';
slide.back = 'ffff00';
slide.addPieChart(
{ title: 'My production',
data: [ // each item is one serie
{
name: 'Oil',
labels: ['Czech Republic', 'Ireland', 'Germany', 'Australia', 'Austria', 'UK', 'Belgium'],
values: [301, 201, 165, 139, 128, 99, 60]
}]
}
)
// Bar Chart
slide = pptx.makeNewSlide();
slide.name = 'Bar Chart slide';
slide.back = 'ff00ff';
slide.addBarChart(
{ title: 'Sample bar chart',
data: [ // each item is one serie
{
name: 'europe',
labels: ['Y2003', 'Y2004', 'Y2005'],
values: [2.5, 2.6, 2.8]
},
{
name: 'namerica',
labels: ['Y2003', 'Y2004', 'Y2005'],
values: [2.5, 2.7, 2.9]
},
{
name: 'asia',
labels: ['Y2003', 'Y2004', 'Y2005'],
values: [2.1, 2.2, 2.4]
},
{
name: 'lamerica',
labels: ['Y2003', 'Y2004', 'Y2005'],
values: [0.3, 0.3, 0.3]
},
{
name: 'meast',
labels: ['Y2003', 'Y2004', 'Y2005'],
values: [0.2, 0.3, 0.3]
},
{
name: 'africa',
labels: ['Y2003', 'Y2004', 'Y2005'],
values: [0.1, 0.1, 0.1]
}
]
}
)
`
#### Word: ####
All the text data in Word is saved in paragraphs. To add a new paragraph:
`js
var pObj = docx.createP ();
`
Paragraph options:
`js
pObj.options.align = 'center'; // Also 'right' or 'jestify'.
`
Every list item is also a paragraph so:
`js
var pObj = docx.createListOfDots ();
var pObj = docx.createListOfNumbers ();
`
Now you can fill the paragraph object with one or more text strings using the addText method:
`js
pObj.addText ( 'Simple' );
pObj.addText ( ' with color', { color: '000088' } );
pObj.addText ( ' and back color.', { color: '00ffff', back: '000088' } );
pObj.addText ( 'Bold + underline', { bold: true, underline: true } );
pObj.addText ( 'Fonts face only.', { font_face: 'Arial' } );
pObj.addText ( ' Fonts face and size.', { font_face: 'Arial', font_size: 40 } );
`
Add an image to a paragraph:
var path = require('path');
pObj.addImage ( path.resolve(__dirname, 'myFile.png' ) );
pObj.addImage ( path.resolve(__dirname, 'myFile.png', { cx: 300, cy: 200 } ) );
To add a page break:
`js
docx.putPageBreak ();
`
#### Excel: ####
`js
sheet = xlsx.makeNewSheet ();
sheet.name = 'My Excel Data';
`
Fill cells:
`js
// Using setCell:
sheet.setCell ( 'E7', 340 );
sheet.setCell ( 'G102', 'Hello World!' );
// Direct way:
sheet.data[0] = [];
sheet.data[0][0] = 1;
sheet.data[0][1] = 2;
sheet.data[1] = [];
sheet.data[1][3] = 'abc';
``