AG Grid’s row grouping, aggregation, tree data, master/detail and Excel export are Enterprise features: production use needs a commercial license, and without a key the grid shows a watermark and logs an error. The Needless UI data grid has grouping with totals, tree data, row details and .xlsx export under MIT. This guide moves an Angular app from one to the other: what carries over, what doesn’t, and how the code changes.

It uses AG Grid 36’s names. AG Grid 36 supports Angular 20 to 22; Needless UI needs Angular 22.

What you get

AG Grid and the Needless UI data grid
FeatureAG GridNeedless UI
Row grouping, with aggregates and a totals rowEnterpriseYes: several levels, with sum, average, minimum, maximum, count or a function
Tree dataEnterpriseYes, from nested rows
Details under a row (master/detail)EnterpriseYes: any template under the row, another grid included
Excel exportEnterprise: styles, several sheets, images and formulasYes: one sheet of typed cells, with number formats and a frozen header with filters
Column menu with a column chooserEnterpriseYes: sort, filter, pin, move, fit and hide each column, and show or hide them all
Sorting by several columns, quick search, pages, row selectionCommunityYes
Column filtersCommunity: up to two conditions, joined by AND or OROne condition per column
Set, multi and advanced filtersEnterprisePartly: a checklist of a column’s options, not of the values in the data
Resize, move, pin and hide columns, and save their stateCommunityYes
Virtual scrollingCommunity: rows and columnsRows
Cell editingCommunity; some editors are EnterpriseYes, by column type, with validation; no custom editors and no undo
Pivoting, integrated chartsEnterpriseNo
Clipboard, cell range selection, context menu, status bar, side barEnterpriseNo
Data from a serverServer-side row model: Enterprise; loading in blocks: CommunityPages from your server, with its sort, filters and search; no grouping on the server
Column groups, row dragging, pinned rowsCommunityNo
FrameworksReact, Angular 20 to 22, Vue and plain JavaScriptAngular 22 and React 19

What maps to what

AG Grid options and their Needless UI counterparts
AG GridNeedless UI grid
<ag-grid-angular>, module registration, LicenseManager.setLicenseKey()<nui-grid>; nothing to register and no key
rowData, columnDefs[(rows)], [columns]
field, headerNameid, header
valueGetter, valueFormatter, cellDataTypevalue, format (Intl options or a function), type
cellRendererAn nuiGridCell template
pinned: 'left', hidepinned: 'start', hidden
Column rowGroup, groupDefaultExpanded[(groupBy)], a list of column ids. Groups start open; [(collapsed)] closes them.
aggFunc, grandTotalRowaggregate, totals
treeData with treeDataChildrenFieldchildren: (row) => row.children
masterDetail, detailCellRendererAn nuiGridDetail template, and [(details)]
quickFilterText[(search)]
rowSelection, getSelectedRows()selection, and [(selected)]: the selected rows’ keys
pagination, paginationPageSize[(pageSize)], [(page)], pageSizes
getColumnState(), applyColumnState()[(columnState)]
exportDataAsExcel(), exportDataAsCsv()exportXlsx() returns a Blob, and exportCsv() text
cellValueChanged, rowDoubleClicked(cellEdit), (rowActivate)
rowModelType: 'serverSide'mode="server", total, (queryChange)
localeText, enableRtllabels; right to left follows the page’s dir

Orders grouped by country, both ways

The task: orders grouped by country, with a total for each country and one for all, an Excel export, a quick search and multiple selection. With AG Grid 36, where the grouping, the totals and the Excel export need Enterprise:

With the Needless UI grid:

A few things work differently. The selection holds keys, the rows’ ids, so it survives new data; map them back to rows when you need the rows. Groups start open. A group’s label sits in the first visible column, and search reads visible columns only, so keep the grouped column shown if search should match it. And exportXlsx() returns the file instead of downloading it: one sheet of the filtered, sorted rows, without group rows.

If you need what’s missing

If your app relies on pivoting, charts, the clipboard and range selection, grouping on the server or column groups, the Needless UI grid can’t replace AG Grid yet. Open an issue for what you need. For everything else, the data grid’s page has every input, output and example.