From 6b33f51aa0e7493211d2b4be9f702af0ea82dfa9 Mon Sep 17 00:00:00 2001 From: Maria Tsvyatkova Date: Fri, 9 Jan 2026 13:41:40 +0200 Subject: [PATCH 1/5] fix(export): add checks for missing data --- .../excel/excel-exporter-grid.spec.ts | 26 +++++++++++- .../exporter-common/base-export-service.ts | 36 +++++++++------- .../hierarchical-grid-components.spec.ts | 41 +++++++++++++++++++ 3 files changed, 87 insertions(+), 16 deletions(-) diff --git a/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts b/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts index 45d15167a3d..82b4bcd5ca2 100644 --- a/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts +++ b/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts @@ -34,7 +34,9 @@ import { IgxHierarchicalGridExportComponent, IgxHierarchicalGridMCHCollapsibleComponent, IgxHierarchicalGridMultiColumnHeaderIslandsExportComponent, IgxHierarchicalGridMultiColumnHeadersExportComponent, - IgxHierarchicalGridSummariesExportComponent + IgxHierarchicalGridSummariesExportComponent, + IgxHierarchicalGridEmptyDataExportComponent, + IgxHierarchicalGridMissingChildDataExportComponent } from '../../../../../test-utils/hierarchical-grid-components.spec'; import { GridFunctions } from '../../../../../test-utils/grid-functions.spec'; import { IgxPivotGridMultipleRowComponent, IgxPivotGridTestComplexHierarchyComponent, SALES_DATA } from '../../../../../test-utils/pivot-grid-samples.spec'; @@ -75,6 +77,8 @@ describe('Excel Exporter', () => { IgxPivotGridTestComplexHierarchyComponent, IgxTreeGridSummariesKeyComponent, IgxHierarchicalGridSummariesExportComponent, + IgxHierarchicalGridEmptyDataExportComponent, + IgxHierarchicalGridMissingChildDataExportComponent, GroupedGridWithSummariesComponent, GridCurrencySummariesComponent, GridUserMeetingDataComponent, @@ -931,6 +935,26 @@ describe('Excel Exporter', () => { await exportAndVerify(hGrid, options, actualData.exportHierarchicalDataWithSkippedRows); }); + + it('should export hierarchical grid with empty data without throwing error', async () => { + fix = TestBed.createComponent(IgxHierarchicalGridEmptyDataExportComponent); + fix.detectChanges(); + + hGrid = fix.componentInstance.hGrid; + options = createExportOptions('HierarchicalGridEmptyDataExcelExport'); + + await expectAsync(getExportedData(hGrid, options)).toBeResolved(); + }); + + it('should export hierarchical grid with missing child data key without throwing error', async () => { + fix = TestBed.createComponent(IgxHierarchicalGridMissingChildDataExportComponent); + fix.detectChanges(); + + hGrid = fix.componentInstance.hGrid; + options = createExportOptions('HierarchicalGridMissingChildDataExcelExport'); + + await expectAsync(getExportedData(hGrid, options)).toBeResolved(); + }); }); describe('', () => { diff --git a/projects/igniteui-angular/grids/core/src/services/exporter-common/base-export-service.ts b/projects/igniteui-angular/grids/core/src/services/exporter-common/base-export-service.ts index 91ad1ffafff..4e120508d3c 100644 --- a/projects/igniteui-angular/grids/core/src/services/exporter-common/base-export-service.ts +++ b/projects/igniteui-angular/grids/core/src/services/exporter-common/base-export-service.ts @@ -247,7 +247,8 @@ export abstract class IgxBaseExporter { const childLayoutList = grid.childLayoutList; for (const island of childLayoutList) { - this.mapHierarchicalGridColumns(island, grid.data[0]); + const gridData = grid.data && grid.data.length > 0 ? grid.data[0] : {}; + this.mapHierarchicalGridColumns(island, gridData); } } else if (grid.type === 'pivot') { this.pivotGridColumns = []; @@ -1212,22 +1213,27 @@ export abstract class IgxBaseExporter { let keyData; if (island.autoGenerate) { - keyData = gridData[island.key]; - const islandKeys = island.children.map(i => i.key); + keyData = gridData && gridData[island.key] ? gridData[island.key] : undefined; + const islandKeys = island.children && island.children.length > 0 ? island.children.map(i => i.key) : []; - const islandData = keyData.map(i => { - const newItem = {}; + if (keyData && Array.isArray(keyData) && keyData.length > 0) { + const islandData = keyData.map(i => { + const newItem = {}; - Object.keys(i).map(k => { - if (!islandKeys.includes(k)) { - newItem[k] = i[k]; - } - }); + Object.keys(i).map(k => { + if (!islandKeys.includes(k)) { + newItem[k] = i[k]; + } + }); - return newItem; - }); + return newItem; + }); - columnList = this.getAutoGeneratedColumns(islandData); + columnList = this.getAutoGeneratedColumns(islandData); + } else { + // If no data available, create empty column list + columnList = this.getAutoGeneratedColumns([{}]); + } } else { const islandColumnList = island.columns; columnList = this.getColumns(islandColumnList); @@ -1235,9 +1241,9 @@ export abstract class IgxBaseExporter { this._ownersMap.set(island, columnList); - if (island.children.length > 0) { + if (island.children && island.children.length > 0) { for (const childIsland of island.children) { - const islandKeyData = keyData !== undefined ? keyData[0] : {}; + const islandKeyData = keyData && Array.isArray(keyData) && keyData.length > 0 ? keyData[0] : {}; this.mapHierarchicalGridColumns(childIsland, islandKeyData); } } diff --git a/projects/igniteui-angular/test-utils/hierarchical-grid-components.spec.ts b/projects/igniteui-angular/test-utils/hierarchical-grid-components.spec.ts index 081cd33f2a8..1e3bbef5bc5 100644 --- a/projects/igniteui-angular/test-utils/hierarchical-grid-components.spec.ts +++ b/projects/igniteui-angular/test-utils/hierarchical-grid-components.spec.ts @@ -748,3 +748,44 @@ export class IgxHierarchicalGridDefaultComponent { this.data = SampleTestData.hierarchicalGridSingersFullData(); } } + +@Component({ + template: ` + + + + + + + + + + `, + imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent] +}) +export class IgxHierarchicalGridEmptyDataExportComponent { + @ViewChild('hierarchicalGrid', { read: IgxHierarchicalGridComponent, static: true }) public hGrid: IgxHierarchicalGridComponent; + public data = []; +} + +@Component({ + template: ` + + + + + + + + + + `, + imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent] +}) +export class IgxHierarchicalGridMissingChildDataExportComponent { + @ViewChild('hierarchicalGrid', { read: IgxHierarchicalGridComponent, static: true }) public hGrid: IgxHierarchicalGridComponent; + // Data without the 'Albums' key that the row island expects + public data = [ + { Artist: 'Artist1', Debut: 2000, GrammyNominations: 5, GrammyAwards: 2 } + ]; +} From 1d2e105205e938bce8cf08c7531ec00a184c6703 Mon Sep 17 00:00:00 2001 From: Maria Tsvyatkova Date: Mon, 12 Jan 2026 15:21:53 +0200 Subject: [PATCH 2/5] test(exporter): empty data and summaries should not throw an error --- .../services/excel/excel-exporter-grid.spec.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts b/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts index 82b4bcd5ca2..44f66555ff9 100644 --- a/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts +++ b/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter-grid.spec.ts @@ -946,6 +946,21 @@ describe('Excel Exporter', () => { await expectAsync(getExportedData(hGrid, options)).toBeResolved(); }); + it('should export hierarchical grid with empty data and summaries without throwing error', async () => { + fix = TestBed.createComponent(IgxHierarchicalGridEmptyDataExportComponent); + fix.detectChanges(); + + hGrid = fix.componentInstance.hGrid; + const artistColumn = hGrid.columns.find(col => col.field === 'Artist'); + artistColumn.hasSummary = true; + fix.detectChanges(); + + options = createExportOptions('HierarchicalGridEmptyDataWithSummariesExcelExport'); + options.exportSummaries = true; + + await expectAsync(getExportedData(hGrid, options)).toBeResolved(); + }); + it('should export hierarchical grid with missing child data key without throwing error', async () => { fix = TestBed.createComponent(IgxHierarchicalGridMissingChildDataExportComponent); fix.detectChanges(); From e98f06720a09874854b725a3c5b276c9d4b6b9d2 Mon Sep 17 00:00:00 2001 From: Maria Tsvyatkova Date: Mon, 12 Jan 2026 16:29:06 +0200 Subject: [PATCH 3/5] fix(export): export empty grid with summaries - Excel and CSV --- .../services/csv/char-separated-value-data.ts | 12 ++++-- .../core/src/services/csv/csv-exporter.ts | 37 +++++++++++++++---- .../core/src/services/excel/excel-exporter.ts | 36 ++++++++++++------ .../core/src/services/excel/excel-files.ts | 8 +++- 4 files changed, 71 insertions(+), 22 deletions(-) diff --git a/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts b/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts index 660f6098e9c..536b20fff4f 100644 --- a/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts +++ b/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts @@ -42,13 +42,15 @@ export class CharSeparatedValueData { return this._headerRecord + this._dataRecords; } - public prepareDataAsync(done: (result: string) => void) { + public prepareDataAsync(done: (result: string) => void, alwaysExportHeaders: boolean = true) { const columns = this.columns?.filter(c => !c.skip) .sort((a, b) => a.startIndex - b.startIndex) .sort((a, b) => a.pinnedIndex - b.pinnedIndex); const keys = columns && columns.length ? columns.map(c => c.field) : ExportUtilities.getKeysFromData(this._data); - this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]); + if (this._data && this._data.length > 0) { + this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]); + } this._escapeCharacters.push(this._delimiter); const headers = columns && columns.length ? @@ -57,7 +59,11 @@ export class CharSeparatedValueData { this._headerRecord = this.processHeaderRecord(headers, this._data.length); if (keys.length === 0 || ((!this._data || this._data.length === 0) && keys.length === 0)) { - done(''); + if (alwaysExportHeaders && headers && headers.length > 0) { + done(this._headerRecord); + } else { + done(''); + } } else { this.processDataRecordsAsync(this._data, keys, (dr) => { done(this._headerRecord + dr); diff --git a/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts b/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts index 5013fdc57e8..fd1e0201790 100644 --- a/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts +++ b/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts @@ -1,5 +1,5 @@ import { EventEmitter, Injectable } from '@angular/core'; -import { DEFAULT_OWNER, ExportHeaderType, IColumnInfo, IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service'; +import { DEFAULT_OWNER, ExportHeaderType, ExportRecordType, IColumnInfo, IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service'; import { ExportUtilities } from '../exporter-common/export-utilities'; import { CharSeparatedValueData } from './char-separated-value-data'; import { CsvFileTypes, IgxCsvExporterOptions } from './csv-exporter-options'; @@ -50,10 +50,33 @@ export class IgxCsvExporterService extends IgxBaseExporter { private _stringData: string; protected exportDataImplementation(data: IExportRecord[], options: IgxCsvExporterOptions, done: () => void) { - const dimensionKeys = data[0]?.dimensionKeys; - data = dimensionKeys?.length ? - data.map((item) => item.rawData): - data.map((item) => item.data); + const firstDataElement = data[0]; + const dimensionKeys = firstDataElement?.dimensionKeys; + + const dataRecords = dimensionKeys?.length ? + data.filter(item => item.type !== ExportRecordType.SummaryRecord).map((item) => item.rawData): + data.filter(item => item.type !== ExportRecordType.SummaryRecord).map((item) => item.data); + + const summaryRecords: any[] = []; + if (options.exportSummaries) { + const summaries = data.filter(item => item.type === ExportRecordType.SummaryRecord); + for (const summary of summaries) { + const summaryData: any = {}; + if (summary.data) { + for (const [key, value] of Object.entries(summary.data)) { + if (value && typeof value === 'object' && 'label' in value && 'value' in value) { + summaryData[key] = `${value.label}: ${value.value}`; + } else { + summaryData[key] = value; + } + } + } + summaryRecords.push(summaryData); + } + } + + const allRecords = [...dataRecords, ...summaryRecords]; + const columnList = this._ownersMap.get(DEFAULT_OWNER); const columns = columnList?.columns.filter(c => c.headerType === ExportHeaderType.ColumnHeader); if (dimensionKeys) { @@ -72,13 +95,13 @@ export class IgxCsvExporterService extends IgxBaseExporter { columns.unshift(...dimensionCols); } - const csvData = new CharSeparatedValueData(data, options.valueDelimiter, columns); + const csvData = new CharSeparatedValueData(allRecords, options.valueDelimiter, columns); csvData.prepareDataAsync((r) => { this._stringData = r; this.saveFile(options); this.exportEnded.emit({ csvData: this._stringData }); done(); - }); + }, options.alwaysExportHeaders); } private saveFile(options: IgxCsvExporterOptions) { diff --git a/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter.ts b/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter.ts index 00824131b91..8061064328a 100644 --- a/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter.ts +++ b/projects/igniteui-angular/grids/core/src/services/excel/excel-exporter.ts @@ -77,6 +77,10 @@ export class IgxExcelExporterService extends IgxBaseExporter { const firstDataElement = data[0]; const isHierarchicalGrid = firstDataElement?.type === ExportRecordType.HierarchicalGridRecord; const isPivotGrid = firstDataElement?.type === ExportRecordType.PivotGridRecord; + const ownersKeys = Array.from(this._ownersMap.keys()); + const firstKey = ownersKeys[0]; + const isHierarchicalGridByMap = firstKey && typeof firstKey !== 'string'; + const filterColumns = (columns) => columns.filter(col => col.field !== GRID_LEVEL_COL && !col.skip && col.headerType === ExportHeaderType.ColumnHeader); let rootKeys; let columnCount; @@ -113,20 +117,30 @@ export class IgxExcelExporterService extends IgxBaseExporter { rootKeys = this._ownersMap.get(firstDataElement.owner).columns.filter(c => !c.skip).map(c => c.field); defaultOwner = this._ownersMap.get(firstDataElement.owner); } else { - defaultOwner = this._ownersMap.get(DEFAULT_OWNER); - const columns = defaultOwner.columns.filter(col => col.field !== GRID_LEVEL_COL && !col.skip && col.headerType === ExportHeaderType.ColumnHeader); - - columnWidths = defaultOwner.columnWidths; - indexOfLastPinnedColumn = defaultOwner.indexOfLastPinnedColumn; - columnCount = isPivotGrid ? columns.length + this.pivotGridFilterFieldsCount : columns.length; - rootKeys = columns.map(c => c.field); + // Check if this is actually a hierarchical grid (when data only contains summary records) + defaultOwner = isHierarchicalGridByMap + ? this._ownersMap.get(firstKey) + : this._ownersMap.get(DEFAULT_OWNER) || this._ownersMap.get(firstKey); + + if (defaultOwner) { + const columns = filterColumns(defaultOwner.columns); + + columnWidths = defaultOwner.columnWidths; + indexOfLastPinnedColumn = defaultOwner.indexOfLastPinnedColumn; + columnCount = isPivotGrid ? columns.length + this.pivotGridFilterFieldsCount : columns.length; + rootKeys = columns.map(c => c.field); + } } } else { - const ownersKeys = Array.from(this._ownersMap.keys()); + // For hierarchical grids with empty data, use the grid instance; otherwise try DEFAULT_OWNER first + defaultOwner = isHierarchicalGridByMap + ? this._ownersMap.get(firstKey) + : this._ownersMap.get(DEFAULT_OWNER) || this._ownersMap.get(firstKey); - defaultOwner = this._ownersMap.get(ownersKeys[0]); - columnWidths = defaultOwner.columnWidths; - columnCount = defaultOwner.columns.filter(col => col.field !== GRID_LEVEL_COL && !col.skip && col.headerType === ExportHeaderType.ColumnHeader).length; + if (defaultOwner) { + columnWidths = defaultOwner.columnWidths; + columnCount = filterColumns(defaultOwner.columns).length; + } } const worksheetData = diff --git a/projects/igniteui-angular/grids/core/src/services/excel/excel-files.ts b/projects/igniteui-angular/grids/core/src/services/excel/excel-files.ts index 0d5d81882c7..58940f0d587 100644 --- a/projects/igniteui-angular/grids/core/src/services/excel/excel-files.ts +++ b/projects/igniteui-angular/grids/core/src/services/excel/excel-files.ts @@ -551,9 +551,15 @@ export class WorksheetFile implements IExcelFile { } private getSummaryFunction(type: string, key: string, dimensionMapKey: any, recordLevel: number, col: IColumnInfo): string { - const dimensionMap = dimensionMapKey ? this.hierarchicalDimensionMap.get(dimensionMapKey) : this.dimensionMap; + const dimensionMap = dimensionMapKey ? (this.hierarchicalDimensionMap.get(dimensionMapKey) ?? this.dimensionMap) : this.dimensionMap; + if (!dimensionMap) { + return ''; + } const dimensions = dimensionMap.get(key); const levelDimensions = dimensionMap.get(GRID_LEVEL_COL); + if (!dimensions || !levelDimensions) { + return ''; + } let func = ''; let funcType = ''; From 41fb3d8876803a0c64c1d65561bcf6ff197ab527 Mon Sep 17 00:00:00 2001 From: Maria Tsvyatkova Date: Tue, 13 Jan 2026 15:29:05 +0200 Subject: [PATCH 4/5] chore(exporter): revert csv summaries export fix --- .../services/csv/char-separated-value-data.ts | 12 ++---- .../core/src/services/csv/csv-exporter.ts | 37 ++++--------------- 2 files changed, 10 insertions(+), 39 deletions(-) diff --git a/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts b/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts index 536b20fff4f..660f6098e9c 100644 --- a/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts +++ b/projects/igniteui-angular/grids/core/src/services/csv/char-separated-value-data.ts @@ -42,15 +42,13 @@ export class CharSeparatedValueData { return this._headerRecord + this._dataRecords; } - public prepareDataAsync(done: (result: string) => void, alwaysExportHeaders: boolean = true) { + public prepareDataAsync(done: (result: string) => void) { const columns = this.columns?.filter(c => !c.skip) .sort((a, b) => a.startIndex - b.startIndex) .sort((a, b) => a.pinnedIndex - b.pinnedIndex); const keys = columns && columns.length ? columns.map(c => c.field) : ExportUtilities.getKeysFromData(this._data); - if (this._data && this._data.length > 0) { - this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]); - } + this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]); this._escapeCharacters.push(this._delimiter); const headers = columns && columns.length ? @@ -59,11 +57,7 @@ export class CharSeparatedValueData { this._headerRecord = this.processHeaderRecord(headers, this._data.length); if (keys.length === 0 || ((!this._data || this._data.length === 0) && keys.length === 0)) { - if (alwaysExportHeaders && headers && headers.length > 0) { - done(this._headerRecord); - } else { - done(''); - } + done(''); } else { this.processDataRecordsAsync(this._data, keys, (dr) => { done(this._headerRecord + dr); diff --git a/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts b/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts index fd1e0201790..8c26d2db0cf 100644 --- a/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts +++ b/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts @@ -1,5 +1,5 @@ import { EventEmitter, Injectable } from '@angular/core'; -import { DEFAULT_OWNER, ExportHeaderType, ExportRecordType, IColumnInfo, IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service'; +import { DEFAULT_OWNER, ExportHeaderType, IColumnInfo, IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service'; import { ExportUtilities } from '../exporter-common/export-utilities'; import { CharSeparatedValueData } from './char-separated-value-data'; import { CsvFileTypes, IgxCsvExporterOptions } from './csv-exporter-options'; @@ -50,33 +50,10 @@ export class IgxCsvExporterService extends IgxBaseExporter { private _stringData: string; protected exportDataImplementation(data: IExportRecord[], options: IgxCsvExporterOptions, done: () => void) { - const firstDataElement = data[0]; - const dimensionKeys = firstDataElement?.dimensionKeys; - - const dataRecords = dimensionKeys?.length ? - data.filter(item => item.type !== ExportRecordType.SummaryRecord).map((item) => item.rawData): - data.filter(item => item.type !== ExportRecordType.SummaryRecord).map((item) => item.data); - - const summaryRecords: any[] = []; - if (options.exportSummaries) { - const summaries = data.filter(item => item.type === ExportRecordType.SummaryRecord); - for (const summary of summaries) { - const summaryData: any = {}; - if (summary.data) { - for (const [key, value] of Object.entries(summary.data)) { - if (value && typeof value === 'object' && 'label' in value && 'value' in value) { - summaryData[key] = `${value.label}: ${value.value}`; - } else { - summaryData[key] = value; - } - } - } - summaryRecords.push(summaryData); - } - } - - const allRecords = [...dataRecords, ...summaryRecords]; - + const dimensionKeys = data[0]?.dimensionKeys; + data = dimensionKeys?.length ? + data.map((item) => item.rawData): + data.map((item) => item.data); const columnList = this._ownersMap.get(DEFAULT_OWNER); const columns = columnList?.columns.filter(c => c.headerType === ExportHeaderType.ColumnHeader); if (dimensionKeys) { @@ -95,13 +72,13 @@ export class IgxCsvExporterService extends IgxBaseExporter { columns.unshift(...dimensionCols); } - const csvData = new CharSeparatedValueData(allRecords, options.valueDelimiter, columns); + const csvData = new CharSeparatedValueData(data, options.valueDelimiter, columns); csvData.prepareDataAsync((r) => { this._stringData = r; this.saveFile(options); this.exportEnded.emit({ csvData: this._stringData }); done(); - }, options.alwaysExportHeaders); + }); } private saveFile(options: IgxCsvExporterOptions) { From 9748f6af4731c54ed22cb30a4cad6aa030fde926 Mon Sep 17 00:00:00 2001 From: Maria Tsvyatkova Date: Tue, 13 Jan 2026 15:36:46 +0200 Subject: [PATCH 5/5] chore(*): trim space in csv exporter --- .../grids/core/src/services/csv/csv-exporter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts b/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts index 8c26d2db0cf..5013fdc57e8 100644 --- a/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts +++ b/projects/igniteui-angular/grids/core/src/services/csv/csv-exporter.ts @@ -51,7 +51,7 @@ export class IgxCsvExporterService extends IgxBaseExporter { protected exportDataImplementation(data: IExportRecord[], options: IgxCsvExporterOptions, done: () => void) { const dimensionKeys = data[0]?.dimensionKeys; - data = dimensionKeys?.length ? + data = dimensionKeys?.length ? data.map((item) => item.rawData): data.map((item) => item.data); const columnList = this._ownersMap.get(DEFAULT_OWNER);