fslaborg/FsSpreadsheet
64.4
Adequate · 3 October 2026
9.1k
lines of production code
F#
primary language
2
measurements over time
What this system is
FsSpreadsheet is a cross-platform library for constructing, manipulating, and serializing spreadsheet data, supporting .NET, JavaScript, and Python environments. It provides a type-safe DSL for building workbooks and handles I/O for XLSX and JSON formats across all supported targets. The system includes utilities for interactive visualization in notebooks and ensures data integrity through deep-copy capabilities and comprehensive cross-language testing.
How it got here
2021–2022 — Core data model and DSL implementation
9 changes.
This period focused on establishing the foundational data model for FsSpreadsheet, introducing core types for cells, ranges, rows, columns, and tables with deep-copy capabilities. It also implemented a new Domain Specific Language (DSL) to enable declarative, type-safe spreadsheet construction via F\# computation expressions. The work was supported by initializing multi-language build infrastructure and adding a comprehensive initial test suite to verify these new components.
2023 — Multi-language build and test expansion
8 changes.
The project expanded its ecosystem by introducing CSV export capabilities and Polyglot Notebook visualization support. Simultaneously, the build infrastructure was migrated to FAKE to enable unified packaging for .NET, JavaScript, and Python, while a comprehensive test suite was established to validate Excel I/O and interactive rendering across these platforms.
2024 — Multi-language I/O expansion
9 changes.
This period focused on establishing comprehensive input and output capabilities for the FsSpreadsheet library across .NET, JavaScript, and Python environments. The work involved implementing low-level XLSX parsing, high-level serialization layers, and JSON support for each target platform, accompanied by extensive test suites to ensure data integrity and cross-format compatibility.
Features
Add CSV export capabilities for spreadsheets
Users can now export spreadsheet data to CSV format. This change introduces extension methods on FsWorkbook to write to a stream, byte array, or file, supporting a configurable separator character (defaulting to comma). It also adds helper methods on FsRow and FsWorksheet to convert cell data into sparse row and table representations, enabling the serialization of the workbook's content into standard CSV text.
src/FsSpreadsheet.CsvIO · high confidence
Add FsSpreadsheet.Interactive for Polyglot Notebook visualization
Introduces the FsSpreadsheet.Interactive package, which registers a kernel extension to automatically render FsWorkbook and FsWorksheet objects as HTML tables in Polyglot Notebooks. This includes new Formatters that convert spreadsheet data into styled HTML tables and an FsSparseMatrix helper to efficiently handle cell data for display.
src/FsSpreadsheet.Interactive · high confidence
Add Python-based XLSX and JSON I/O bindings
Introduces a new Python-backed implementation for reading and writing XLSX files and JSON data within the FsSpreadsheet.Py module. Users can now load workbooks from XLSX files, streams, or bytes, and export them back to XLSX or convert workbooks to/from JSON strings (supporting both row-based and column-based formats). The implementation handles cell type conversions (boolean, number, date, string) and table structures, with specific logic to manage Python datetime timezone constraints during XLSX export.
src/FsSpreadsheet.Py · high confidence
Initial JSON import and export support for spreadsheets
Users can now read from and write to JSON files for spreadsheet data. This change introduces a complete serialization layer (using Thoth.Json.Core) that handles workbook, worksheet, row, column, cell, and table structures. It supports two encoding modes: with explicit row/column indices or without (index-less), and includes specific logic to handle datetime values across different compilation targets (Fable/Python vs .NET).
src/FsSpreadsheet/Json · high confidence
Initial implementation of FsCell and FsCellsCollection
This change introduces the core cell data structures for the FsSpreadsheet library, including the FsCell type for storing cell values, data types, and addresses, and the FsCellsCollection type for managing collections of cells with support for adding, removing, and deep copying. The FsCell type includes methods for inferring data types from values and supports various numeric, string, boolean, and date types, while the FsCellsCollection provides functionality for tracking used rows and columns and managing cell storage.
src/FsSpreadsheet/Cells · high confidence
Initial implementation of FsSpreadsheet.Net XLSX I/O layer
This change introduces the FsSpreadsheet.Net library, providing a new set of modules for reading and writing .xlsx files. It adds low-level wrappers for OpenXML components (Cell, Row, Sheet, SharedStringTable, Stylesheet) and high-level extension methods on the core FsSpreadsheet types to convert between FsCell/FsTable structures and their XLSX representations. The implementation includes logic to handle shared strings, infer data types (including dates and booleans), and manage workbook parts, effectively establishing the foundation for spreadsheet persistence in this namespace.
src/FsSpreadsheet.Net · high confidence
Initial release of FsSpreadsheet.Js bindings for Excel and JSON I/O
This change introduces the FsSpreadsheet.Js library, providing F\# bindings for reading and writing Excel (.xlsx) files and JSON data in a JavaScript/Fable environment. It adds new source files (Cell.fs, Table.fs, Workbook.fs, Worksheet.fs, Xlsx.fs, Json.fs, FsExtensions.fs) that map FsSpreadsheet data structures to and from the Fable.ExcelJs library, enabling operations like loading workbooks from files, streams, or bytes, and exporting them. Additionally, it introduces JSON serialization support for workbook data in both row-based and column-based formats via the new Json.fs module.
src/FsSpreadsheet.Js · high confidence
Introduce DSL for spreadsheet construction
This change adds a new Domain Specific Language (DSL) to FsSpreadsheet, enabling users to build spreadsheets using computation expressions. The new files define core types such as \SheetEntity\ (handling optional/required values and messages), \CellBuilder\ (providing the computation expression syntax for cells), and \SheetBuilder\ (providing extension methods to populate worksheets and tables from data sequences using field mappings). This allows for a more declarative and type-safe approach to creating spreadsheet structures compared to the previous API.
FsSpreadsheet · high confidence
Introduce F\# DSL for spreadsheet construction
A new domain-specific language (DSL) has been added to the \FsSpreadsheet\ library, enabling users to define spreadsheets using F\# computation expressions. This DSL provides builders for creating workbooks, sheets, tables, rows, and columns, allowing for a more declarative and type-safe approach to spreadsheet generation. The implementation includes support for optional and required values, error handling via message passing, and compatibility with both .NET and Fable (JavaScript) targets.
src/FsSpreadsheet/DSL · high confidence
Introduce FsAddress, FsRow, FsColumn, and FsTable types with deep-copy and dense-conversion capabilities
The spreadsheet data model now includes dedicated types for cell addresses (FsAddress), rows (FsRow), columns (FsColumn), and tables (FsTable). FsAddress provides A1-style reference parsing and manipulation, while FsRow and FsColumn expose Min/Max indices, safe item retrieval (TryItem), and the ability to convert sparse structures into dense ones (ToDenseRow/ToDenseColumn). FsTable support is added to worksheets and workbooks, enabling table creation and retrieval. All core types support deep copying via Copy methods, ensuring that modifications to copies do not affect the original data structures.
src/FsSpreadsheet · high confidence
Introduce FsTable, FsTableField, and FsTableRow types for spreadsheet table support
Added new F\# types (FsTable, FsTableField, FsTableRow) in the Tables module to model Excel tables, enabling users to create, access, and manipulate table structures including headers, body rows, and fields within spreadsheets.
src/FsSpreadsheet/Tables · high confidence
New ZipArchiveReader module for parsing spreadsheet XML structures
A new FsSpreadsheet.Net.ZipArchiveReader module has been added to handle the low-level parsing of Excel file internals. This module provides functions to extract shared strings, cell styles (including number formats and date detection logic), and table metadata from the underlying ZIP archive structure, serving as the foundation for reading spreadsheet data.
FsSpreadsheet.Net · high confidence
Behavioural changes
Build system migrated to FAKE with multi-language packaging support
The build infrastructure has been replaced with a FAKE-based system (F\#), introducing structured tasks for building, testing, and packaging. This change adds support for publishing to PyPI via Poetry alongside existing NuGet and NPM releases, and expands the test suite to include Python tests executed via Fable transpilation. Documentation generation is now handled by FsDocs, and the release process supports both stable and prerelease workflows with automatic version synchronization across .NET, JavaScript, and Python package manifests.
build · high confidence
FsSpreadsheet 7.0.1: Python datetime handling adjustment
This release includes a minor adjustment to how Python datetime values are handled within the FsSpreadsheet library, addressing specific edge cases in datetime processing for Python-based spreadsheet operations.
(repo-wide) · high confidence
Introduce structured range types and boundary utilities
The spreadsheet library now exposes a structured type hierarchy for working with cell areas: FsRange, FsRangeRow, FsRangeColumn, and FsRangeAddress all inherit from FsRangeBase, which provides core operations like Cell access, Cells retrieval, and Row/Column counts. FsRangeAddress includes helper functions for parsing and manipulating A1-style boundaries (e.g., moving, extending, and validating ranges), and FsRangeColumn and FsRangeRow offer convenient accessors and deep-copy capabilities. This change improves type safety and usability when selecting or iterating over specific rows, columns, or arbitrary rectangular ranges in a sheet.
src/FsSpreadsheet/Ranges · high confidence
Test coverage
Added JavaScript test suite for FsSpreadsheet Excel I/O; Added Python binding tests for FsSpreadsheet; Added comprehensive test suite for FsSpreadsheet.Net; Added documentation for test file conventions; Added speedtest benchmark for FsSpreadsheet; Added test coverage for spreadsheet IO, JSON serialization, and workbook conversion; Added test harness scripts for Excel I/O libraries; Added test utilities for cross-platform async and standardized workbook validation; Added tests for FsSpreadsheet.Interactive formatters; Initial test suite for FsSpreadsheet core components.
Dependencies
Initialize multi-language build infrastructure and dependency manifests
This change introduces the foundational build and dependency management files for the FsSpreadsheet project across .NET, JavaScript, and Python ecosystems. It adds the FAKE-based build script (Build.fsproj) targeting .NET 8, establishes the core F\# project (FsSpreadsheet.fsproj) with Fable 5 and Thoth.Json dependencies, and sets up platform-specific IO extensions (FsSpreadsheet.Net, FsSpreadsheet.Js, FsSpreadsheet.Py) with their respective Fable bindings and native libraries (DocumentFormat.OpenXml, @nfdi4plants/exceljs, openpyxl). Additionally, it includes the Python project configuration (pyproject.toml, poetry.lock) and a comprehensive suite of .NET test projects (FsSpreadsheet.Tests, FsSpreadsheet.Net.Tests, etc.) targeting .NET 10, alongside a speed test utility.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 63 → 64 (+0.9)
- Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.
Lenses
- Code Health 84 → 84 (+0.0)
- Architecture 100 → 92 (-7.4)
- Maturity 56 → 56 (+0.0)
- Readiness 55 → 57 (+1.6)
- Security 82 → 81 (-1.3)
- Performance 100 (new)
Resolved (3)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- Off-boarding risk: anonymized user #1
New (7)
- Documentation: no architecture or design documentation (docs/index.md)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- Off-boarding risk: anonymized user #1
- Outdated: Fable.Core
- Projects may be oversized for their cohesion
Architecture
- Unchanged — 0 containers · 2 contexts · 1 edges
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
fslaborg/FsSpreadsheet was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit c21572a6df724fb424da631d42643d5c0a9a0583 — the exact code this score is about.
- Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.