UNPKG

ag-grid

Version:

Advanced Javascript Datagrid. Supports raw Javascript, AngularJS 1.x, AngularJS 2.0 and Web Components

132 lines (110 loc) 4.92 kB
module ag.grid { var LINE_SEPERATOR = '\r\n'; export interface CsvExportParams { skipHeader?: boolean; skipFooters?: boolean; skipGroups?: boolean; fileName?: string; } export class CsvCreator { constructor( private rowController: InMemoryRowController, private columnController: ColumnController, private grid: Grid, private valueService: ValueService) { } public exportDataAsCsv(params?: CsvExportParams): void { var csvString = this.getDataAsCsv(params); var fileNamePresent = params && params.fileName && params.fileName.length !== 0; var fileName = fileNamePresent ? params.fileName : 'export.csv'; // Internet Explorer if (window.navigator.msSaveOrOpenBlob) { var fileData = [csvString]; var blobObject = new Blob(fileData); window.navigator.msSaveOrOpenBlob(blobObject, fileName); } else { // Chrome var url = "data:text/plain;charset=utf-8," + encodeURIComponent(csvString); var downloadLink = document.createElement("a"); downloadLink.href = url; (<any>downloadLink).download = fileName; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); } } public getDataAsCsv(params?: CsvExportParams): string { if (!this.grid.isUsingInMemoryModel()) { console.log('ag-Grid: getDataAsCsv not available when doing virtual pagination'); return ''; } var result = ''; var skipGroups = params && params.skipGroups; var skipHeader = params && params.skipHeader; var skipFooters = params && params.skipFooters; var columnsToExport = this.columnController.getDisplayedColumns(); if (!columnsToExport || columnsToExport.length === 0) { return ''; } // first pass, put in the header names of the cols if (!skipHeader) { columnsToExport.forEach( (column: Column, index: number)=> { var nameForCol = this.columnController.getDisplayNameForCol(column); if (nameForCol === null || nameForCol === undefined) { nameForCol = ''; } if (index != 0) { result += ','; } result += '"' + this.escape(nameForCol) + '"'; }); result += LINE_SEPERATOR; } this.rowController.forEachNodeAfterFilterAndSort( (node: RowNode) => { if (skipGroups && node.group) { return; } if (skipFooters && node.footer) { return; } columnsToExport.forEach( (column: Column, index: number)=> { var valueForCell: any; if (node.group && index === 0) { valueForCell = this.createValueForGroupNode(node); } else { valueForCell = this.valueService.getValue(column.colDef, node.data, node); } if (valueForCell === null || valueForCell === undefined) { valueForCell = ''; } if (index != 0) { result += ','; } result += '"' + this.escape(valueForCell) + '"'; }); result += LINE_SEPERATOR; }); return result; } private createValueForGroupNode(node: RowNode): string { var keys = [node.key]; while (node.parent) { node = node.parent; keys.push(node.key); } return keys.reverse().join(' -> '); } // replace each " with "" (ie two sets of double quotes is how to do double quotes in csv) private escape(value: any): string { if (value === null || value === undefined) { return ''; } var stringValue: string; if (typeof value === 'string') { stringValue = value; } else if (typeof value.toString === 'function') { stringValue = value.toString(); } else { console.warn('known value type during csv conversio'); stringValue = ''; } return stringValue.replace("\"", "\"\""); } } }