Your search did not match any results.
Charts

Export Custom Markup

The DevExpress.viz.exportFromMarkup(markup, options) method allows you to export SVG content, including SVG-based DevExtreme components, to an image or document.

The markup parameter accepts valid SVG markup (see the prepareMarkup() function in the code). To get the markup of a component, call its svg() method. The options parameter accepts an object whose fields configure export properties. In this demo, we specify the width, height, format, and svgToCanvas fields. Refer to the method description for more information on these and other available fields.

Backend API
Copy to CodeSandBox
Apply
Reset
<template> <div id="chart-demo"> <div class="chart_environment"> <Form ref="form"/> <DxChart id="chart" ref="chart" :data-source="dataSource" palette="Violet" > <DxCommonSeriesSettings :bar-padding="0.3" argument-field="state" type="bar" /> <DxSeries value-field="year1990" name="1990" /> <DxSeries value-field="year2000" name="2000" /> <DxSeries value-field="year2010" name="2010" /> <DxSeries value-field="year2016" name="2016" /> <DxSeries value-field="year2017" name="2017" /> <DxLegend vertical-alignment="bottom" horizontal-alignment="center" /> <DxTitle text="Oil Production" subtitle="(in millions tonnes)" /> </DxChart> </div> <div class="controls-pane"> <DxButton id="export" :width="145" icon="export" type="default" text="Export" @click="onClick()" /> </div> </div> </template> <script> import { DxChart, DxSeries, DxCommonSeriesSettings, DxLegend, DxExport, DxTitle, } from 'devextreme-vue/chart'; import { exportFromMarkup } from 'devextreme/viz/export'; import DxButton from 'devextreme-vue/button'; import toCanvas from 'canvg'; import { dataSource } from './data.js'; import Form from './Form.vue'; function prepareMarkup(chartSVG, markup) { return '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="820px" height="420px">' + `${markup}<g transform="translate(305,12)">${chartSVG}</g></svg>`; } export default { components: { DxChart, DxSeries, DxCommonSeriesSettings, DxLegend, DxExport, DxTitle, Form, DxButton, }, data() { return { dataSource, }; }, methods: { onClick() { const chartSVG = this.$refs.chart.instance.svg(); const formContent = this.$refs.form.getMarkup(); exportFromMarkup(prepareMarkup(chartSVG, formContent), { width: 820, height: 420, margin: 0, format: 'png', svgToCanvas(svg, canvas) { return new Promise((resolve) => { toCanvas(canvas, new XMLSerializer().serializeToString(svg), { ignoreDimensions: true, ignoreClear: true, renderCallback: resolve, }); }); }, }); }, }, }; </script> <style> #chart-demo { height: 460px; } #chart { position: absolute; top: 12px; right: 35px; width: 480px; height: 347px; } .chart_environment { width: 820px; position: relative; margin: 0 auto; } .controls-pane { display: block; text-align: center; } </style>
<!-- eslint-disable vue/max-len --> <template> <div class="custom_markup_container"> <svg version="1.1" width="820px" height="420px" > <path d="M 13 407 L 128 407 L 232 39 L 13 39" fill="#6D39C3" /> <path d="M 46 381 L 161 381 L 265 13 L 46 13" opacity="0.5" fill="#6D39C3" /> <text transform="translate(30,89)" style="fill: #fff; font-family: 'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana, sans-serif; font-size: 36px; font-weight: bold;" > <tspan x="0" y="0" >Export </tspan> <tspan x="0" y="38" >Custom</tspan> <tspan x="0" y="76" >Markup</tspan> </text> <text transform="translate(32,199)" style="opacity: 0.8; fill: #fff; font-family: 'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana, sans-serif; font-size: 14px;" > <tspan x="0" y="0" >Export a chart with</tspan> <tspan x="0" y="19.2" >custom elements</tspan> </text> <path opacity="0.8" d="M 0 0 L 820 0 L 820 420 L 0 420 L 0 0" stroke="#999999" stroke-width="1" stroke-linecap="butt" fill="none" stroke-linejoin="miter" /> </svg> </div> </template> <script> export default { methods: { getMarkup() { return this.$el.innerHTML; }, }, }; </script>
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!DOCTYPE html> <html> <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=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/22.2.6/css/dx.light.css" /> <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.js"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>
export const dataSource = [{ state: 'Saudi Arabia', year1990: 319.6, year2000: 408.4, year2010: 407, year2016: 523, year2017: 496.6, }, { state: 'USA', year1990: 362.8, year2000: 287.9, year2010: 270.2, year2016: 438, year2017: 461.4, }, { state: 'China', year1990: 138.3, year2000: 163, year2010: 203, year2016: 199.7, year2017: 191.5, }];
window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, 'devextreme/localization.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, map: { 'vue': 'npm:vue@3.2.47/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.0.15/index.js', 'stackblur-canvas': 'npm:stackblur-canvas@2.5.0/dist/stackblur.min.js', 'rgbcolor': 'npm:rgbcolor@1.0.1/index.js', 'canvg': 'npm:canvg@2.0.0/dist/browser/canvg.min.js', 'mitt': 'npm:mitt/dist/mitt.umd.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@22.2.6/cjs', 'devextreme-vue': 'npm:devextreme-vue@22.2.6', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.5.20/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.1.72/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.43/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.11', '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.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/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.11/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);