PackageTrack
Sign in Get early access

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 2026
Release Pre-release

Releases

latest 6
  1. 1.1.4 29 Jul 2026
    Release notes

    Text-wrap cascade — per-cell and per-row wrap control (additive).

    • BCellWrapText enum (inherit / wrap / noWrap) with a forced getter. Wrap now resolves as a three-level cascade, cell → row → column: BCellValue.wrapText forces one cell, BCellRow.wrapText forces a row, and inherit (the default at both levels) falls through to the existing BCellColumn.wrapText bool — so untouched cells inherit from their row, then the header column. Display-only, wraps inside the row height (pair with BCellRow.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.
    Open source →
  2. 1.1.3 29 Jul 2026
    Release notes

    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 with LET (=LET(f, LAMBDA(a,b, a*b), f(6,7))). BYROW(array, lambda) and MAP(array, lambda) apply a lambda over an array's rows / elements and spill. (Self-application is depth- capped to #CIRC!; no BYCOL/REDUCE/SCAN yet.)
    • 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 over List<Map>rename/select/drop/where/mapColumn/addColumn/distinct/sortBy — to reshape a JSON payload to the grid's columns before importJson (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.
    Open source →
  3. 1.1.2 29 Jul 2026
    Release notes

    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 leaves oddRowColor null. 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 of BCellPagination / BCellAutoSum).
    • Per-cell lock — BCellValue.locked (default true, Excel semantics): a protected (readOnly) grid still edits cells explicitly marked locked: false; unprotected grids ignore it.
    • Pivot advanced — pivot() gains multi-level row/column fields (List<String> keys), a percentOfTotal value mode (BCellPivotValueMode), and an optional key comparator, keeping the single-String call 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, TOROW over 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] (via defineTable) are unaffected.
    Open source →
  4. 1.1.1 26 Jul 2026
    Release notes

    Excel-parity feature release on top of 1.1.0 — all additive, no breaking API changes.

    • Cell display — per-column formatter (BCellColumnValueFormatter) and per-cell BCellValue.formatter override, wrapText (soft-wrap in the fixed row height), and textAlign (BCellColumnTextAlign auto/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/formula prebuilt validator helpers (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 — BCellAutoFilter controller + BCellColumnFilterButton (Excel column funnel; multiple columns AND together), backed by distinctValues(field) / filterByValues(map) on the state manager.
    • AutoSum — BCellAutoSum status-bar widget (live Count / Sum / Average of the selection).
    • Cell comments — setNote/noteFor now render a corner marker plus a hover tooltip.
    • Per-cell styling — BCellValue.style (a BCellStyle override that wins over the column cellStyle resolver) and per-side cell borders via BCellStyle.border (Flutter Border).
    • Sparklines — BCellSparkline.line/.bar in-cell mini charts via .toRenderer() (bcell_sparkline.dart).
    • Charts — BCellChartType gains area and stackedBar (line/bar/pie/area/ scatter/radar/stackedBar).
    • Formula engine — $A$1 absolute-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) and SUMPRODUCT/TEXTJOIN remain. First-class function values (LAMBDA) stay out of scope.
    • XLSX fidelity — toXlsx({styled, formulas, merged}): bold header, per-column alignment, and cellStyle fill/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).
    Open source →
  5. 1.1.0 20 Jul 2026
    Release notes

    Feature release: charts, pivot tables, workbook security, and styling options on top of 1.0.0 — all additive, no breaking API changes.

    • Charts — BCellChart companion widget (line / bar / pie via fl_chart) that plots the grid's filtered rows through evaluated formula values and redraws live on edits, sorts, and filters.
    • Pivot tables — bcell_pivot.dart aggregation plugin with a toGrid() helper that renders the pivot result as a regular BCellGrid.
    • Shared workbook — bcell_workbook_share.dart collaboration plumbing.
    • Workbook file encryption — toEncryptedBytes / decryptWorkbook / loadEncryptedBytes (AES-256-GCM, PBKDF2-HMAC-SHA256 with hardened iteration bounds). Wrong passwords and tampered files fail with BCellDecryptException, never garbage data.
    • Version history — saveVersion / versions / restoreVersion / removeVersion snapshots 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 — BCellGridStyleConfig gains 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.
    Open source →
  6. 1.0.0 20 Jul 2026
    Release notes

    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 BCellGridStateManager and virtualized rendering, guarded by a 10k-row performance regression test.

    Column types & formatting

    • Date columns — BCellColumnType.date({format}) hold a DateTime, display yyyy-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, plus BCellConditionalFormat.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 (via BCellRichText.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 — BCellGridStyleConfig gains defaultColumnTitlePadding, defaultCellPadding, iconSize, iconColor (pluto_grid names), and fillHandleSize/fillHandleColor/fillHandleBorderColor for the drag-fill handle; defaults are unchanged (the handle outline now theme-resolves to colorScheme.surface instead 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 in changeCellValue (also guards paste/fill), with an onInvalid callback.
    • 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:B2 ranges; 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 decorative Table[Column] whole-column refs, live over displayed rows.

    Import / export

    • Exports — CSV, TSV, HTML, XML, Markdown, JSON, PDF (toPdf, dep: pdf; selectionOnly print 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 (ordered BCellSheets + active sheet) with add/remove/rename/select/move, per-sheet tab color, protect, and hidden flags; BCellSheetTabBar (tab strip with drag-to-reorder and accessible move actions) and BCellWorkbookView.
    • Sheet-protection password — optional password: on BCellWorkbook.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, throwing BCellDecryptException on a wrong password or tampered bytes. Backed by pointycastle.
    • Shared-workbook merge — mergeChanges(base:, theirs:) folds another copy's edits into the workbook via a three-way, cell-level merge over toJson() snapshots; cells both copies changed differently keep the local value and are reported as BCellMergeConflicts. BCellWorkbookView now 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 by fl_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 into BCellGrid columns+rows. Single row/column field.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive