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
| Feature | AG Grid | Needless UI |
|---|---|---|
| Row grouping, with aggregates and a totals row | Enterprise | Yes: several levels, with sum, average, minimum, maximum, count or a function |
| Tree data | Enterprise | Yes, from nested rows |
| Details under a row (master/detail) | Enterprise | Yes: any template under the row, another grid included |
| Excel export | Enterprise: styles, several sheets, images and formulas | Yes: one sheet of typed cells, with number formats and a frozen header with filters |
| Column menu with a column chooser | Enterprise | Yes: sort, filter, pin, move, fit and hide each column, and show or hide them all |
| Sorting by several columns, quick search, pages, row selection | Community | Yes |
| Column filters | Community: up to two conditions, joined by AND or OR | One condition per column |
| Set, multi and advanced filters | Enterprise | Partly: a checklist of a column’s options, not of the values in the data |
| Resize, move, pin and hide columns, and save their state | Community | Yes |
| Virtual scrolling | Community: rows and columns | Rows |
| Cell editing | Community; some editors are Enterprise | Yes, by column type, with validation; no custom editors and no undo |
| Pivoting, integrated charts | Enterprise | No |
| Clipboard, cell range selection, context menu, status bar, side bar | Enterprise | No |
| Data from a server | Server-side row model: Enterprise; loading in blocks: Community | Pages from your server, with its sort, filters and search; no grouping on the server |
| Column groups, row dragging, pinned rows | Community | No |
| Frameworks | React, Angular 20 to 22, Vue and plain JavaScript | Angular 22 and React 19 |
What maps to what
| AG Grid | Needless UI grid |
|---|---|
<ag-grid-angular>, module registration, LicenseManager.setLicenseKey() | <nui-grid>; nothing to register and no key |
rowData, columnDefs | [(rows)], [columns] |
field, headerName | id, header |
valueGetter, valueFormatter, cellDataType | value, format (Intl options or a function), type |
cellRenderer | An nuiGridCell template |
pinned: 'left', hide | pinned: 'start', hidden |
Column rowGroup, groupDefaultExpanded | [(groupBy)], a list of column ids. Groups start open; [(collapsed)] closes them. |
aggFunc, grandTotalRow | aggregate, totals |
treeData with treeDataChildrenField | children: (row) => row.children |
masterDetail, detailCellRenderer | An 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, enableRtl | labels; 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.