bcell
A Flutter data-grid widget with a pluto_grid-shaped API and spreadsheet features: a formula engine, multi-sheet workbooks, charts, pivot tables, and CSV/XLSX/PDF import-export.
1.1.4
Thiraphat-DEV/bcell
What this package is like to depend on
Last release 26 days ago
29 Jul 2026
Too new to tell
only 2 release windows
Nearly every release is documented
notes for 6 of 6 stable releases
Nothing withdrawn
no release was ever pulled
1 months old
6 releases · first in 2026
6 releases in the last 12 months
see the full history below
Release timeline
6 releases · Jul 2026 to Jul 2026Releases
latest 6-
1.1.429 Jul 2026Release notes
Open source →Text-wrap cascade — per-cell and per-row wrap control (additive).
BCellWrapTextenum (inherit/wrap/noWrap) with aforcedgetter. Wrap now resolves as a three-level cascade, cell → row → column:BCellValue.wrapTextforces one cell,BCellRow.wrapTextforces a row, andinherit(the default at both levels) falls through to the existingBCellColumn.wrapTextbool — so untouched cells inherit from their row, then the header column. Display-only, wraps inside the row height (pair withBCellRow.height); XLSX export still writes wrap per column.- Widgetbook: the Wrap text use case gained a "Row 1 override" knob; docs
(
reference/cells.md) show the cascade.
-
1.1.329 Jul 2026Release notes
Open source →Tier-3 release on top of 1.1.2 — advanced formula, what-if, and import features, all additive.
- Formula engine —
LAMBDA(params, calc)produces a callable value; call it directly (=LAMBDA(x, x+1)(5)) or bind it withLET(=LET(f, LAMBDA(a,b, a*b), f(6,7))).BYROW(array, lambda)andMAP(array, lambda)apply a lambda over an array's rows / elements and spill. (Self-application is depth- capped to#CIRC!; noBYCOL/REDUCE/SCANyet.) - Solver —
stateManager.solve({targetCell, targetValue, byChanging: [...]})(bcell_solver.dart): a multi-cell what-if solver (coordinate descent over the Goal Seek bisection) that drives several input cells until a target formula cell reaches a value; restores all inputs on failure. Unconstrained / target-value only. - Scenario Manager —
stateManager.saveScenario(name, cells)/applyScenario(name)/scenarios/removeScenario(name)(bcell_scenario.dart): save and restore named sets of input-cell values. - Import transforms —
BCellImportTransform(rows)(bcell_import_transform.dart): a chainable, non-mutating pipeline overList<Map>—rename/select/drop/where/mapColumn/addColumn/distinct/sortBy— to reshape a JSON payload to the grid's columns beforeimportJson(Power-Query "lite"). - Performance — incremental formula recalc: a single-cell edit now invalidates
only the cached formula results whose reference set covers the edited cell
(plus transitive dependents), instead of clearing the whole formula cache.
Structural changes (sort/filter/paging/row+column ops), edits under an active
filter, and volatile formulas (
TODAY/NOW) still full-clear — correctness first, over-invalidate never under. No API change; the 10k-row tripwire stays green. - Widgetbook — a use-case for every feature above.
- Formula engine —
-
1.1.229 Jul 2026Release notes
Open source →Excel-parity Tier-2 release on top of 1.1.1. Additive except for the removal of the this-row structured reference (see the Removed note below).
- Table object —
stateManager.defineTable({name, totals, bandRows})(bcell_table.dart): registers the grid as an Excel table and unlocks the[#Headers]/[#Totals]structured references (headers resolve to the column titles, totals to the computed per-column aggregate).bandRows(default true) paints the Excel zebra stripe automatically when the widget leavesoddRowColornull.table/removeTable. - Conditional-formatting rules —
BCellConditionalFormat.duplicates(),.topN(n, {bottom}), and.formulaRule(formula, style)(the formula engine evaluates the rule per row), alongside the existing color-scale / data-bar / icon-set. - Slicers —
BCellSlicer(stateManager, field:)companion widget: a chip bar of the field's distinct values, multi-select filters the grid (sibling ofBCellPagination/BCellAutoSum). - Per-cell lock —
BCellValue.locked(default true, Excel semantics): a protected (readOnly) grid still edits cells explicitly markedlocked: false; unprotected grids ignore it. - Pivot advanced —
pivot()gains multi-level row/column fields (List<String>keys), apercentOfTotalvalue mode (BCellPivotValueMode), and an optional key comparator, keeping the single-Stringcall path. - Goal Seek —
stateManager.goalSeek(targetCell:, targetValue:, byChanging:)(bcell_goal_seek.dart): bisection solver that drives one input cell until a target formula cell hits a value. - Formula engine — array-reshape functions
TAKE,DROP,HSTACK,VSTACK,TOCOL,TOROWover the existing dynamic-array (spill) values. - Widgetbook — a use-case for every feature above.
- Removed: the this-row structured reference. Structured references now name
a whole column only (
[Sales]→ the column's data range); use plain relative A1 refs (=B1-C1) for per-row math.[#Headers]/[#Totals](viadefineTable) are unaffected.
- Table object —
-
1.1.126 Jul 2026Release notes
Open source →Excel-parity feature release on top of 1.1.0 — all additive, no breaking API changes.
- Cell display — per-column
formatter(BCellColumnValueFormatter) and per-cellBCellValue.formatteroverride,wrapText(soft-wrap in the fixed row height), andtextAlign(BCellColumnTextAlignauto/left/center/right, cells and header). - Select column —
BCellColumnType.select([...])edits via an inline dropdown of fixed options (Excel data-validation list), mirroring pluto_grid. - Number format — multi-section codes (
positive;negative;zero;text, with accounting-style(1,234)negatives), scientific notation (0.00E+00), and[Red]/[Blue]colour tokens parsed-and-stripped. - Data validation —
BCellValidation.number/date/time/list/formulaprebuiltvalidatorhelpers (bcell_data_validation.dart). - Freeze rows —
setFrozenRowCount(n)pins the top N rows below the header while the rest scroll (freeze panes; composes with frozen columns). - Find & Replace —
replaceAll(query, replacement)(case-insensitive, routes through the edit path so validator/undo apply; skips formula/non-text cells). - AutoFilter —
BCellAutoFiltercontroller +BCellColumnFilterButton(Excel column funnel; multiple columns AND together), backed bydistinctValues(field)/filterByValues(map)on the state manager. - AutoSum —
BCellAutoSumstatus-bar widget (live Count / Sum / Average of the selection). - Cell comments —
setNote/noteFornow render a corner marker plus a hover tooltip. - Per-cell styling —
BCellValue.style(aBCellStyleoverride that wins over the columncellStyleresolver) and per-side cell borders viaBCellStyle.border(FlutterBorder). - Sparklines —
BCellSparkline.line/.barin-cell mini charts via.toRenderer()(bcell_sparkline.dart). - Charts —
BCellChartTypegainsareaandstackedBar(line/bar/pie/area/ scatter/radar/stackedBar). - Formula engine —
$A$1absolute-ref markers parse (bcell treats all refs as fixed);XLOOKUP;LET(name, value, …, calc);A1#spill-range refs; array broadcasting at operator combine points (scalar⊗array and same-shape array⊗array). Dynamic-array spill (FILTER/SORT/UNIQUE/SEQUENCE) andSUMPRODUCT/TEXTJOINremain. First-class function values (LAMBDA) stay out of scope. - XLSX fidelity —
toXlsx({styled, formulas, merged}): bold header, per-column alignment, andcellStylefill/font colour (default on);=…cells as real Excel formulas (opt-in); colspan/rowspan as Excel merges with value round-trip (default on). - Widgetbook — a use-case for every feature above, plus more composite custom
knobs (
EdgeInsets/TextStyle/BorderSide/Size).
- Cell display — per-column
-
1.1.020 Jul 2026Release notes
Open source →Feature release: charts, pivot tables, workbook security, and styling options on top of 1.0.0 — all additive, no breaking API changes.
- Charts —
BCellChartcompanion widget (line / bar / pie viafl_chart) that plots the grid's filtered rows through evaluated formula values and redraws live on edits, sorts, and filters. - Pivot tables —
bcell_pivot.dartaggregation plugin with atoGrid()helper that renders the pivot result as a regularBCellGrid. - Shared workbook —
bcell_workbook_share.dartcollaboration plumbing. - Workbook file encryption —
toEncryptedBytes/decryptWorkbook/loadEncryptedBytes(AES-256-GCM, PBKDF2-HMAC-SHA256 with hardened iteration bounds). Wrong passwords and tampered files fail withBCellDecryptException, never garbage data. - Version history —
saveVersion/versions/restoreVersion/removeVersionsnapshots on the workbook (in-memory, JSON-based). - Sheet-protection password — SHA-256 hashed, persisted in workbook JSON.
- Number-format codes now persist through the workbook JSON round-trip.
- Styling —
BCellGridStyleConfiggains cell padding, header sort-icon, and fill-handle (fillHandleSize/fillHandleColor/fillHandleBorderColor) options, all theme-resolved like the existing style fields. - Docs — live Widgetbook demo linked from the README; pluto_grid LICENSE attribution added.
- Performance — profile-mode scroll baselines re-verified on the expanded feature set (all three render paths stay well under the 8 ms frame-build budget); layout regression guard added for auto-size, frozen, colspan, rowspan, and hidden-column sizing.
- Dependency:
pointycastle^4.0.0.
- Charts —
-
1.0.020 Jul 2026Release notes
Open source →First stable release. BCell grows from the minimal 0.0.1 data grid into a spreadsheet-capable widget: a formula engine, a multi-sheet workbook, a full import/export surface, and a large set of Excel-style cell, column, and selection features — all still built on the flat
BCellGridStateManagerand virtualized rendering, guarded by a 10k-row performance regression test.Column types & formatting
- Date columns —
BCellColumnType.date({format})hold aDateTime, displayyyyy-MM-dd(or a custom formatter), edit via a native date picker, and coerce ISO strings / Excel date serials on import and paste. - Number format codes —
BCellColumnType.number(format: '#,##0.00' | '0%' | '$#,##0.00' | '000')apply display grouping/decimals/percent/prefix while cells stay raw numbers, so sort and export are unaffected. - Custom cell renderer —
BCellColumn(renderer:)draws any widget in place of the default cell text. - Conditional formatting —
BCellColumn(cellStyle:)colors a cell by its value, plusBCellConditionalFormat.colorScale/dataBar/iconSet(...)renderers for color scales, data bars, and threshold icon sets. - Rich text — a cell can hold a
BCellRichText([BCellTextRun(...)])with bold/italic/underline/color runs (viaBCellRichText.column().toRenderer()); exports flatten to plain text automatically. - Hyperlink cells —
BCellHyperlink.column(onTap:).toRenderer()renders styled, tappable, accessible link text (no launcher dependency). - Cell notes —
setNote/noteFor/hasNote/clearNotes. - Merge cells —
BCellValue(colspan:, rowspan:)(display-only; colspan stays on the virtualized path, rowspan switches to a non-virtualized body). - Banded rows —
BCellGridStyleConfig(oddRowColor:)zebra striping. - More style knobs —
BCellGridStyleConfiggainsdefaultColumnTitlePadding,defaultCellPadding,iconSize,iconColor(pluto_grid names), andfillHandleSize/fillHandleColor/fillHandleBorderColorfor the drag-fill handle; defaults are unchanged (the handle outline now theme-resolves tocolorScheme.surfaceinstead of hardcoded white). - Per-row height —
BCellRow(height:)with virtualization preserved.
Columns & selection
- Freeze columns —
BCellColumn(frozen: BCellColumnFrozen.start | .end)pins a column left/right with synced vertical scroll across sections. - Column reorder —
moveColumn(from, to)plus header drag-to-reorder and accessible "Move left/right" actions. - Range/multi selection — anchor+focus range with Shift+click/arrow,
extendSelectionTo/isInRange/selectedCells/rangeAsTsv, range copy / clear / fill, and a drag-fill handle. - Fill —
fillDown(Ctrl+D),fillRight(Ctrl+R),fillSeriesDown()(series/ auto fill),flashFillDown()(flash fill by inferred transform). - Checkbox row selection —
setRowChecked/toggleRowChecked/setAllRowsChecked/checkedRows/isAllChecked/isAnyChecked. - Clipboard —
copySelectionToClipboard/cutSelectionToClipboard/pasteFromClipboard(TSV block paste, anchored and clipped). - Data validation —
BCellColumn(validator:)enforced centrally inchangeCellValue(also guards paste/fill), with anonInvalidcallback. - Undo/redo (
undo/redo/canUndo/canRedo), find (find('q')), and go-to (goToCell/goToRow). - Read-only mode —
BCellGrid(mode: BCellGridMode.readOnly)/setGridMode(...)blocks every edit and structural row change.
Formula engine
=formulas evaluate on display, sort, and export, with error results (#DIV/0!/#NAME?/#CIRC!/#NUM!/#REF!/#VALUE!/#N/A) and a cycle guard; results memoized per notification. Formula cells never leak a live=...into CSV.- A1 refs and
A1:B2ranges; arithmetic, comparison,&concat, string literals. - Function library: Math/Trig, Statistical, Financial (PMT/FV/PV/NPV/IRR), Lookup (VLOOKUP/HLOOKUP/INDEX/MATCH), Date & Time, Information, Logical, and Text categories.
- Named ranges —
defineName/removeName/clearNames/namedRange/definedNames. - Structured references —
enableStructuredRefs()for[Column]and decorativeTable[Column]whole-column refs, live over displayed rows.
Import / export
- Exports — CSV, TSV, HTML, XML, Markdown, JSON, PDF (
toPdf, dep:pdf;selectionOnlyprint area), and XLSX (toXlsx, dep:excel). Markup exports escape every cell value and title. - Imports —
importTsv/importCsv(RFC 4180)/importHtml/importMarkdown/importJson/importXlsx, mapping onto visible columns and coercing to each column type.
Workbook & infrastructure
- Multi-sheet workbook —
BCellWorkbook(orderedBCellSheets + active sheet) withadd/remove/rename/select/move, per-sheet tab color, protect, and hidden flags;BCellSheetTabBar(tab strip with drag-to-reorder and accessible move actions) andBCellWorkbookView. - Sheet-protection password — optional
password:onBCellWorkbook.setProtected; unprotecting a password-protected sheet requires the matching password. Only a SHA-256 hash is stored and persisted in the workbook JSON, never the plaintext. - Workbook persistence —
BCellWorkbook.toJson()/BCellWorkbook.fromJson()round-trip sheets, flags, column definitions (incl. number-format codes), and row data;loadJson()loads a map into an existing workbook in place. - Version history —
saveVersion()/versions/restoreVersion()/removeVersion()/clearVersions(): in-memory named, timestamped workbook snapshots built on the JSON persistence, restorable in place. - Encrypted workbook file —
toEncryptedBytes(password)seals the workbook JSON into an authenticated AES-256-GCM blob (PBKDF2-HMAC-SHA256 key derivation, random per-file salt and nonce);decryptWorkbook()/loadEncryptedBytes()open it, throwingBCellDecryptExceptionon a wrong password or tampered bytes. Backed bypointycastle. - Shared-workbook merge —
mergeChanges(base:, theirs:)folds another copy's edits into the workbook via a three-way, cell-level merge overtoJson()snapshots; cells both copies changed differently keep the local value and are reported asBCellMergeConflicts.BCellWorkbookViewnow rebuilds its grid after any in-place load (loadJson/restoreVersion/loadEncryptedBytes/mergeChanges), fixing stale rows when the active index was unchanged. - Event bus —
BCellGridEventManager(addEvent/listener/stream) on a broadcast stream, allocated lazily. - Font scope —
BCellFontController+BCellFontScope(InheritedNotifier) re-font every BCell widget under one controller live. - Charts —
BCellChart(stateManager, type: BCellChartType.line/.bar/.pie, categoryField:, valueFields:), a companion widget that plots the grid's filtered rows (formula-evaluated) and re-draws live. Backed byfl_chart. - Pivot tables —
stateManager.pivot(rowField:, columnField:, valueField:, aggregate: BCellPivotAgg.sum/count/average/min/max)aggregates the filtered rows into a rows × columns matrix (value/rowTotal/columnTotal/grandTotal); totals re-aggregate the raw numbers.toGrid()renders the result intoBCellGridcolumns+rows. Single row/column field.
- Date columns —