Your search did not match any results.
Data Grid

Export Multiple Grids

The exportDataGrid() method allows users to export multiple grids to one Excel document. Grids are exported consequently in a chain of Promises.

In this demo, this functionality is used to export two DataGrids into separate worksheets in the same workbook. Starting position of each exported grid is set using the topLeftCell option.

Use the customizeCell method to customize the exported worksheets.

Copy to CodeSandBox
Apply
Reset
<div id="exportContainer"> <dx-button text="Export multiple grids" icon="xlsxfile" (onClick)="exportGrids($event)" ></dx-button> </div> <dx-tab-panel id="tabPanel" [deferRendering]="false"> <dxi-item title="Price"> <dx-data-grid #priceDataGrid class="data-grid" width="100%" [dataSource]="priceDataSource" [showBorders]="true" [rowAlternationEnabled]="true"> <dxi-column dataField="Product_ID" caption="ID" [width]="50" ></dxi-column> <dxi-column dataField="Product_Name" caption="Name"></dxi-column> <dxi-column dataField="Product_Sale_Price" caption="Sale Price" dataType="number" format="currency"></dxi-column> <dxi-column dataField="Product_Retail_Price" caption="Retail Price" dataType="number" format="currency"></dxi-column> </dx-data-grid> </dxi-item> <dxi-item title="Rating"> <dx-data-grid #ratingDataGrid class="data-grid" width="100%" [dataSource]="ratingDataSource" [showBorders]="true" [rowAlternationEnabled]="true"> <dxi-column dataField="Product_ID" caption="ID" [width]="50" ></dxi-column> <dxi-column dataField="Product_Name" caption="Name"></dxi-column> <dxi-column dataField="Product_Consumer_Rating" caption="Rating"></dxi-column> <dxi-column dataField="Product_Category" caption="Category"></dxi-column> </dx-data-grid> </dxi-item> </dx-tab-panel>
import { NgModule, Component, ViewChild, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxButtonModule, DxTabPanelModule, DxDataGridModule, DxDataGridComponent } from 'devextreme-angular'; import { exportDataGrid } from 'devextreme/excel_exporter'; import ExcelJS from 'exceljs'; import saveAs from 'file-saver'; /* // Use this import for codeSandBox import * as ExcelJS from 'exceljs/dist/exceljs.min.js'; import * as FileSaver from 'file-saver'; */ import DataGrid from 'devextreme/ui/data_grid'; import 'devextreme/data/odata/store'; if(!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'] }) export class AppComponent { @ViewChild('priceDataGrid', { static: false }) priceDataGrid: DxDataGridComponent; @ViewChild('ratingDataGrid', { static: false }) ratingDataGrid: DxDataGridComponent; priceDataSource: any; ratingDataSource: any; constructor() { this.priceDataSource = { store: { type: 'odata', url: 'https://js.devexpress.com/Demos/DevAV/odata/Products' }, select: ['Product_ID', 'Product_Name', 'Product_Sale_Price', 'Product_Retail_Price'], filter: ['Product_ID', '<', 10] }; this.ratingDataSource = { store: { type: 'odata', url: 'https://js.devexpress.com/Demos/DevAV/odata/Products' }, select: ['Product_ID', 'Product_Name', 'Product_Consumer_Rating', 'Product_Category'], filter: ['Product_ID', '<', 10] }; } exportGrids(e) { const context = this; const workbook = new ExcelJS.Workbook(); const priceSheet = workbook.addWorksheet('Price'); const ratingSheet = workbook.addWorksheet('Rating'); priceSheet.getRow(2).getCell(2).value = 'Price'; priceSheet.getRow(2).getCell(2).font = { bold: true, size: 16, underline: 'double' }; ratingSheet.getRow(2).getCell(2).value = 'Rating'; ratingSheet.getRow(2).getCell(2).font = { bold: true, size: 16, underline: 'double' }; function setAlternatingRowsBackground(gridCell, excelCell) { if(gridCell.rowType === 'header' || gridCell.rowType === 'data') { if(excelCell.fullAddress.row % 2 === 0) { excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D3D3D3' }, bgColor: { argb: 'D3D3D3' }}; } } } exportDataGrid({ worksheet: priceSheet, component: context.priceDataGrid.instance, topLeftCell: { row: 4, column: 2 }, customizeCell: ({ gridCell, excelCell }) => { setAlternatingRowsBackground(gridCell, excelCell) } }).then(() => { return exportDataGrid({ worksheet: ratingSheet, component: context.ratingDataGrid.instance, topLeftCell: { row: 4, column: 2 }, customizeCell: ({ gridCell, excelCell }) => { setAlternatingRowsBackground(gridCell, excelCell) } }); }).then(() => { workbook.xlsx.writeBuffer().then((buffer) => { saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'MultipleGrids.xlsx'); }); }); } } @NgModule({ imports: [ BrowserModule, DxButtonModule, DxTabPanelModule, DxDataGridModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep #exportContainer { text-align: right; } ::ng-deep #tabPanel { padding-top: 10px; } ::ng-deep .data-grid { padding: 10px; }
// In real applications, you should not transpile code in the browser. You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ System.config({ transpiler: 'ts', typescriptOptions: { module: "system", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" }, 'devextreme/localization.js': { "esModule": true } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.5.3/lib/typescript.js', '@angular': 'npm:@angular', 'tslib': 'npm:tslib@2.0.3/tslib.js', 'rxjs': 'npm:rxjs@6.3.3', 'exceljs': 'npm:exceljs@1.7.0/dist/exceljs.js', 'file-saver': 'npm:file-saver@1.3.8/FileSaver.js', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.25.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@20.2.4', 'jszip': 'npm:jszip@3.5.0/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@0.9.7/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.0.5', 'devexpress-gantt': 'npm:devexpress-gantt@2.0.8', 'devextreme-angular': 'npm:devextreme-angular@20.2.4', 'preact': 'npm:preact@10.5.7/dist/preact.js', 'preact/hooks': 'npm:preact@10.5.7/hooks/dist/hooks.js' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js' } }, packageConfigPaths: [ "npm:@angular/*/package.json", "npm:@angular/common/*/package.json", "npm:rxjs/package.json", "npm:rxjs/operators/package.json", "npm:devextreme-angular/*/package.json", "npm:devextreme-angular/ui/*/package.json", "npm:devextreme-angular/package.json", "npm:devexpress-diagram/package.json", "npm:devexpress-gantt/package.json", ] });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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/20.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.2.4/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.10.2/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import('app').catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>