Skip to content

vibeengineer/xlsx-chart

 
 

Repository files navigation

xlsx-chart

Node.js excel chart builder

Quick start

Install

npm install xlsx-chart

Generate and write chart to file

var XLSXChart = require ("xlsx-chart");
var xlsxChart = new XLSXChart ();
var opts = {
	file: "chart.xlsx",
	chart: "column",
	titles: [
		"Title 1",
		"Title 2",
		"Title 3"
	],
	fields: [
		"Field 1",
		"Field 2",
		"Field 3",
		"Field 4"
	],
	data: {
		"Title 1": {
			"Field 1": 5,
			"Field 2": 10,
			"Field 3": 15,
			"Field 4": 20 
		},
		"Title 2": {
			"Field 1": 10,
			"Field 2": 5,
			"Field 3": 20,
			"Field 4": 15
		},
		"Title 3": {
			"Field 1": 20,
			"Field 2": 15,
			"Field 3": 10,
			"Field 4": 5
		}
	}
};
xlsxChart.writeFile (opts, function (err) {
  console.log ("File: ", opts.file);
});

Generate and download chart data

xlsxChart.generate (opts, function (err, data) {
	res.set ({
	  "Content-Type": "application/vnd.ms-excel",
	  "Content-Disposition": "attachment; filename=chart.xlsx",
	  "Content-Length": data.length
	});
	res.status (200).send (data);
});

Chart types

column, bar, line, area, radar, scatter, pie

Mixing

You can mix column, bar, line, area.

Custom template

Default templates: xlsx-chart/template/*.xlsx

var opts = {
	file: "chart.xlsx",
	chart: "column",
	templatePath: __dirname + "/myColumn.xlsx",
	...
};
xlsxChart.writeFile (opts, function (err) {
  console.log ("File: ", opts.file);
});

Multiple charts (one type)

Only column chart. For other types use custom template.

let fs = require ("fs");
let XLSXChart = require ("xlsx-chart");
let xlsxChart = new XLSXChart ();
let opts = {
	charts: [{
		chart: "column",
		titles: [
			"Title 1",
			"Title 2",
			"Title 3"
		],
		fields: [
			"Field 1",
			"Field 2",
			"Field 3",
			"Field 4"
		],
		data: {
			"Title 1": {
				"Field 1": 5,
				"Field 2": 10,
				"Field 3": 15,
				"Field 4": 20
			},
			"Title 2": {
				"Field 1": 10,
				"Field 2": 5,
				"Field 3": 20,
				"Field 4": 15
			},
			"Title 3": {
				"Field 1": 20,
				"Field 2": 15,
				"Field 3": 10,
				"Field 4": 5
			}
		},
		chartTitle: "Title 1"
	}, {
		chart: "column",
		titles: [
			"Title 1",
			"Title 2",
			"Title 3"
		],
		fields: [
			"Field 1",
			"Field 2",
			"Field 3",
			"Field 4"
		],
		data: {
			"Title 1": {
				"Field 1": 5,
				"Field 2": 10,
				"Field 3": 15,
				"Field 4": 20
			},
			"Title 2": {
				"Field 1": 10,
				"Field 2": 5,
				"Field 3": 20,
				"Field 4": 15
			},
			"Title 3": {
				"Field 1": 20,
				"Field 2": 15,
				"Field 3": 10,
				"Field 4": 5
			}
		},
		chartTitle: "Title 2"
	}, {
		chart: "column",
		titles: [
			"Title 1",
			"Title 2",
		],
		fields: [
			"Field 1",
			"Field 2",
			"Field 3",
		],
		data: {
			"Title 1": {
				"Field 1": 15,
				"Field 2": 30,
				"Field 3": 45,
			},
			"Title 2": {
				"Field 1": 5,
				"Field 2": 2,
				"Field 3": 10
			}
		},
		chartTitle: "Title 3"
	}]
};
xlsxChart.generate (opts, function (err, data) {
	fs.writeFileSync ("chart.xlsx", data);
});

Available chart options

var opts = {
	file: "chart.xlsx", // exported file
	type: "nodebuffer", // optional: used by JSZip library
	charts: [
		{
			chart: "column", // pie, doughnut, line, area, bar
			grouping: "clustered", // optional: stacked, standard - allow to create stacked bar or line chart
			titles: [
				"title1", // list of chart titles
				"title2", // list of chart titles
			],
			fields: [
				"field1", // list of chart fields
				"field2",
			],
			data: {
				// chart: "column", // could be used to create multi-layer charts with e.g. column + bar + line + area chart in the same object
				// grouping: "clustered", // same as common grouping option, but only for current layer;
				"title1": {
					"field1": 123, // structured data
					"field2": 321,
				},
				"title2": {
					"field1": 456,
					"field2": 654,
				},
			},
			chartTitle: "Title",
			position: { // optional: chart position
				fromColumn: 0, 			// chart top left x coordinate in columns
				fromColumnOffset: 0, 	// chart top left x coordinate in pixels
				fromRow: n * 20, 		// chart top left y coordinate in columns
				fromRowOffset: 0, 		// chart top left y coordinate in pixels
				toColumn: 10, 			// chart bottom right x coordinate in columns
				toColumnOffset: 0, 		// chart bottom right x coordinate in pixels
				toRow: (n + 1) * 20, 	// chart bottom right y coordinate in columns
				toRowOffset: 0, 		// chart bottom right y coordinate in pixels
			},
			customColors: { // optional: chart colors
				points: {
					"title1": {
						"field1": "FF0000", // colors in the same structure as data; not all points required
						"field1": {
							fill: "FF0000", // separate colors for fill and border could be set
							line: "FF0000",
						},
					},
				},
				series: {
					"title1": "FF0000", // whole series color could be also set
					"title2": {
						fill: "FF0000", // separate colors for fill and border could be set
						line: "FF0000",
						markerColor: "FF0000", // different marker color also could be set for line chart
					},
				},
			},
			manualLayout: { // optional blocks position on the chart canvas
				plotArea: { // chart position
					x: 0.5, // x and y of top left corner in proportion value 0..1
					y: 0.5,
					w: 0.5, // width and height of block point in proportion value 0..1
					h: 0.5,
				},
				title: {
					x: 0.5, // x and y of top left corner in proportion value 0..1
					y: 0.5,
				},
			},
			firstSliceAng: 270, // optional: first slice angle for pie and doughnut chart in degrees
			holeSize: 50, // optional: hole size of doughnut chart in percent
			legendPos: "r", // optional: 'l', 't', 'r', 'b', null - legend position; null to hide; right is default
			deleteEmptyCells: false, // optional: allow to will empty values with 0 or leave as gaps
		},
	],
};

xlsxChart.writeFile (opts, function (err) {
  console.log ("File: ", opts.file);
});

Examples

column.js
alt tag
bar.js
alt tag
line.js
alt tag
area.js
alt tag
radar.js
alt tag
scatter.js
alt tag
pie.js
alt tag
columnLine.js
alt tag
mix.js
alt tag

Author

Dmitriy Samortsev

Copyright and license

MIT

About

Node.js excel chart builder

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%