DevExtreme v24.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

Export Several Charts

The DevExpress.viz.exportWidgets(widgetInstances, options) method allows you to export several charts to a single image or document.

The widgetInstances parameter accepts an array with the following format:

[
    [ widgetInstance0_1, widgetInstance0_2, ..., widgetInstance0_N ],
    [ widgetInstance1_1, widgetInstance1_2, ..., widgetInstance1_M ],
    ...
    [ widgetInstanceP_1, widgetInstanceP_2, ..., widgetInstanceP_R ]
]
Backend API
<template> <div id="chart-demo"> <div class="charts"> <DxChart id="chart" ref="chart" :data-source="goldMedals" :rotated="true" title="Olympic Gold Medals in 2008" > <DxSeries type="bar" argument-field="country" value-field="medals" color="#f3c40b" > <DxLabel :visible="true"/> </DxSeries> <DxLegend :visible="false"/> </DxChart> <DxPieChart id="pieChart" ref="pieChart" :data-source="allMedals" palette="Harmony Light" :title="'Total Olympic Medals\n in 2008'" > <DxPieSeries argument-field="country" value-field="medals" > <DxPieLabel :visible="true"> <DxConnector :visible="true"/> </DxPieLabel> </DxPieSeries> </DxPieChart> </div> <div class="controls-pane"> <DxButton id="export" :width="145" icon="export" type="default" text="Export" @click="onClick()" /> </div> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import DxChart, { DxSeries, DxLabel, DxLegend, } from 'devextreme-vue/chart'; import DxPieChart, { DxSeries as DxPieSeries, DxLabel as DxPieLabel, DxConnector, } from 'devextreme-vue/pie-chart'; import { exportWidgets } from 'devextreme/viz/export'; import DxButton from 'devextreme-vue/button'; import { allMedals, goldMedals } from './data.ts'; const chart = ref(); const pieChart = ref(); function onClick() { const chartInstance = chart.value.instance; const pieChartInstance = pieChart.value.instance; exportWidgets([[chartInstance, pieChartInstance]], { fileName: 'chart', format: 'PNG', }); } </script> <style> #chart-demo { height: 460px; } .charts { width: 820px; margin: 0 auto; height: 374px; margin-bottom: 40px; font-size: 0; } #chart, #pieChart { width: 395px; height: 100%; display: inline-block; vertical-align: top; } #chart { margin-right: 30px; } .controls-pane { text-align: center; } </style>
window.exports = window.exports || {}; window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, '*.ts': { loader: 'demo-ts-loader', }, '*.svg': { loader: 'svg-loader', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'root:': '../../../../', 'npm:': 'https://unpkg.com/', }, map: { 'vue': 'npm:vue@3.2.47/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js', 'demo-ts-loader': 'root:utils/demo-ts-loader.js', 'svg-loader': 'root:utils/svg-loader.js', 'mitt': 'npm:mitt/dist/mitt.umd.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@24.1.3/cjs', 'devextreme-vue': 'npm:devextreme-vue@24.1.3/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.8/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'devextreme-vue': { main: 'index.js', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.13/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);
export const allMedals = [{ country: 'USA', medals: 110, }, { country: 'China', medals: 100, }, { country: 'Russia', medals: 71, }, { country: 'UK', medals: 47, }, { country: 'Australia', medals: 46, }, { country: 'Germany', medals: 41, }, { country: 'France', medals: 41, }, { country: 'South Korea', medals: 31, }]; export const goldMedals = [{ country: 'China', medals: 51, }, { country: 'USA', medals: 36, }, { country: 'Russia', medals: 22, }, { country: 'UK', medals: 19, }, { country: 'Germany', medals: 16, }, { country: 'Australia', medals: 14, }, { country: 'South Korea', medals: 13, }, { country: 'France', medals: 7, }];
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!DOCTYPE html> <html lang="en"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.3/css/dx.light.css" /> <script src="https://unpkg.com/typescript@4.9.5/lib/typescript.js"></script> <script type="module"> import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.4.16/dist/compiler-sfc.esm-browser.js"; window.vueCompilerSFC = vueCompilerSFC; </script> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.ts"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>

Each nested array contains component instances that should be in the same row in the exported document. In this demo, chartInstance and pieChartInstance occupy the only row in the document.

The options parameter accepts an object whose fields allow you to configure export properties. In this demo, we specify the fileName and format. Refer to the method description for information on other available fields.