How can I help you?
Chart print in EJ2 TypeScript Chart control
3 Feb 202624 minutes to read
The rendered chart can be printed directly from the browser by calling the public print method. This method accepts an array of element IDs or element references to print; by default it prints the chart element itself.
import { Chart, ColumnSeries, Category, Legend } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, Legend);
import { Button } from '@syncfusion/ej2-buttons';
import { EmitType } from '@syncfusion/ej2-base';
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
//Initializing Chart title
title: 'Sales Comparision',
}, '#element');
document.getElementById('print').onclick = () => {
chart.print();
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<button id= "print" type="button" width ='15%' style="float: right">Print</button>
</div>
</body>
</html>Export
Export the rendered chart to JPEG, PNG, SVG, or PDF using the chart export method. To export chart data into XLSX or CSV, use the Excel/CSV export options. The primary parameters for export are type (format) and fileName (output file name).
Optional parameters include:
-
orientation—portraitorlandscapefor PDF export -
controls— a collection of controls for multi-control export -
width— exported width -
height— exported height
import { Chart, ColumnSeries, Category, Legend, Export } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, Legend, Export);
import { EmitType } from '@syncfusion/ej2-base';
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
//Initializing Chart title
title: 'Sales Comparision',
}, '#element');
document.getElementById('print').onclick = () => {
chart.exportModule.export('PNG', 'result');
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<div id='element1' style="float: left "></div>
<button id= "print" type="button" width ='15%' style="float: right">Export</button>
</div>
</body>
</html>Adding header and footer in PDF export
In the export method, specify the following parameters to add a header and footer text to the exported PDF document:
-
header- Specify the text that should appear at the top of the exported PDF document. -
footer- Specify the text that should appear at the bottom of the exported PDF document.
import { Chart, ColumnSeries, Category, Legend, Export } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, Legend, Export);
import { EmitType } from '@syncfusion/ej2-base';
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
//Initializing Chart title
title: 'Sales Comparision',
}, '#element');
document.getElementById('export').onclick = () => {
const header = {
content: 'Chart Header',
fontSize: 15
};
const footer = {
content: 'Chart Footer',
fontSize: 15,
};
chart.exportModule.export('PDF', 'Chart', 1, [chart], null, null, true, header, footer);
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<div id='element1' style="float: left "></div>
<button id= "export" type="button" width ='15%' style="float: right">Export</button>
</div>
</body>
</html>Exporting charts into separate page during the PDF export
During PDF export, set the exportToMultiplePage parameter to true to export each chart as a separate page.
import { Chart, ColumnSeries, LineSeries, DateTime, Category, Legend, Export, AccumulationChart, AccumulationLegend, PieSeries, AccumulationDataLabel } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, LineSeries, Category, DateTime, Legend, Export);
AccumulationChart.Inject(AccumulationLegend, PieSeries, AccumulationDataLabel);
import { EmitType } from '@syncfusion/ej2-base';
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
valueType: 'DateTime',
labelFormat: 'y',
intervalType: 'Years',
edgeLabelPlacement: 'Shift',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
labelFormat: '{value}%',
rangePadding: 'None',
minimum: 0,
maximum: 100,
interval: 20,
lineStyle: { width: 0 },
majorTickLines: { width: 0 },
minorTickLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Line',
dataSource: [{ x: new Date(2005, 0, 1), y: 21 }, { x: new Date(2006, 0, 1), y: 24 },
{ x: new Date(2007, 0, 1), y: 36 }, { x: new Date(2008, 0, 1), y: 38 },
{ x: new Date(2009, 0, 1), y: 54 }, { x: new Date(2010, 0, 1), y: 57 },
{ x: new Date(2011, 0, 1), y: 70 }
],
xName: 'x', width: 2, yName: 'y', name: 'Germany',
marker: { visible: true, width: 10, height: 10 },
},
{
type: 'Line',
dataSource: [{ x: new Date(2005, 0, 1), y: 28 }, { x: new Date(2006, 0, 1), y: 44 },
{ x: new Date(2007, 0, 1), y: 48 }, { x: new Date(2008, 0, 1), y: 50 },
{ x: new Date(2009, 0, 1), y: 66 }, { x: new Date(2010, 0, 1), y: 78 },
{ x: new Date(2011, 0, 1), y: 84 }
],
xName: 'x', width: 2, yName: 'y', name: 'England',
marker: { visible: true, width: 10, height: 10 },
}
],
title: 'Medal Count',
}, '#element');
let chart1: Chart = new Chart({
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
title: 'Sales Comparision',
}, '#element1');
let pie: AccumulationChart = new AccumulationChart({
series: [
{
dataSource: [{ x: 'Labour', y: 18, text: '18%' }, { x: 'Legal', y: 8, text: '8%' },
{ x: 'Production', y: 15, text: '15%' }, { x: 'License', y: 11, text: '11%' },
{ x: 'Facilities', y: 18, text: '18%' }, { x: 'Taxes', y: 14, text: '14%' },
{ x: 'Insurance', y: 16, text: '16%' }],
dataLabel: {
visible: true,
name: 'text',
position: 'Inside',
font: {
fontWeight: '600',
color: '#ffffff'
}
},
radius: '70%', xName: 'x',
yName: 'y', startAngle: 0,
endAngle: 360,
name: 'Project'
}
],
enableSmartLabels: true,
legendSettings: {
visible: true
},
tooltip: { enable: false },
title: 'Project Cost Breakdown'
});
pie.appendTo('#element2');
document.getElementById('print').onclick = () => {
chart.exportModule.export('PDF', 'Chart', null, [chart, chart1, pie], null, null, true, undefined, undefined, true);
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<div id='element1' style="float: left "></div>
<div id='element2' style="float: left "></div>
<button id= "print" type="button" width ='15%' style="float: right">Export</button>
</div>
</body>
</html>Multiple chart export
You can export the multiple charts in single page by passing the multiple chart objects in the export method of chart. To export multiple charts in a single page, follow the given steps:
Initially, render more than one chart to export, and then add button to export the multiple charts. In button click, call the export method in charts, and then pass the multiple chart objects in the export method.
import { Chart, ColumnSeries, Category, Legend,Export } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, Legend,Export);
import { EmitType } from '@syncfusion/ej2-base';
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
//Initializing Chart title
title: 'Sales Comparision',
}, '#element');
let chart1: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
//Initializing Chart title
title: 'Sales Comparision',
}, '#element1');
document.getElementById('print').onclick = () => {
chart.exportModule.export('PNG', Chart, null, [chart, chart1]);;
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<div id='element1' style="float: left "></div>
<button id= "print" type="button" width ='15%' style="float: right">Export</button>
</div>
</body>
</html>Exporting chart using base64 string
The chart can be exported as an image in the form of a base64 string by utilizing HTML canvas. This process involves rendering the chart onto a canvas element and then converting the canvas content to a base64 string.
import { Chart, ColumnSeries, Category, Legend, Tooltip } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, Legend, Tooltip);
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
valueType: 'Category',
majorGridLines: { width: 0 },
majorTickLines: { width: 0 },
minorTickLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
minimum: 0,
maximum: 40,
interval: 10,
lineStyle: {width : 0},
minorTickLines: {width: 0},
majorTickLines: {width : 0},
},
chartArea: {
border: {
width: 0
}
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [
{ x: 'DEU', y: 35.5 }, { x: 'CHN', y: 18.3 }, { x: 'ITA', y: 17.6 }, { x: 'JPN', y: 13.6 },
{ x: 'US', y: 12 }, { x: 'ESP', y: 5.6 }, { x: 'FRA', y: 4.6 }, { x: 'AUS', y: 3.3 },
{ x: 'BEL', y: 3 }, { x: 'UK', y: 2.9 }
],
xName: 'x', width: 2,
yName: 'y'
}
],
}, '#element');
document.getElementById('export').onclick = () => {
let svg: any = document.querySelector("#element_svg");
var svgData = new XMLSerializer().serializeToString(svg);
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
var svgSize = svg.getBoundingClientRect();
canvas.width = svgSize.width;
canvas.height = svgSize.height;
let ctx: any = canvas.getContext("2d");
var img = document.createElement("img");
img.setAttribute("src", "data:image/svg+xml;base64," + btoa(svgData));
img.onload = function() {
ctx.drawImage(img, 0, 0);
var imagedata = canvas.toDataURL("image/png");
console.log(imagedata); // printed base64 in console
canvas.remove();
};
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<button id= "export" type="button" width ='15%' style="float: right">Export</button>
</div>
</body>
</html>Excel export
You can export the rendered chart data to Excel in either XLSX or CSV format. The excelProperties property in the beforeExport event allows users to customize the exported Excel sheet by modifying row, column, and cell properties before the file is generated. You can customize row titles, column titles, cell values, as well as row and column widths.
import { Chart, ColumnSeries, Category, Legend, Export } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, Legend, Export);
import { EmitType } from '@syncfusion/ej2-base';
let chart: Chart = new Chart({
//Initializing Primary X Axis
primaryXAxis: {
title: 'Manager',
valueType: 'Category',
majorGridLines: { width: 0 }
},
//Initializing Primary Y Axis
primaryYAxis:
{
title: 'Sales',
minimum: 0,
maximum: 20000,
majorGridLines: { width: 0 }
},
//Initializing Chart Series
series: [
{
type: 'Column',
dataSource: [{ x: 'John', y: 10000 }, { x: 'Jake', y: 12000 }, { x: 'Peter', y: 18000 },
{ x: 'James', y: 11000 }, { x: 'Mary', y: 9700 }],
xName: 'x', width: 2,
yName: 'y'
}
],
beforeExport: function (args) {
args.excelProperties.rows[0].cells[0].value = 'Changed Title';
args.excelProperties.rows[1].cells[0].value = 'X Title';
args.excelProperties.rows[1].cells[1].value = 'Y Title';
args.excelProperties.rows[2].cells[1].value = args.excelProperties.rows[2].cells[1].value + 2;
},
//Initializing Chart title
title: 'Sales Comparision',
}, '#element');
document.getElementById('print').onclick = () => {
chart.exportModule.export('XLSX', 'result');
};<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element' style="float: left "></div>
<div id='element1' style="float: left "></div>
<button id= "print" type="button" width ='15%' style="float: right">Export</button>
</div>
</body>
</html>