{"id":23106919,"url":"https://github.com/fslaborg/FsSpreadsheet","last_synced_at":"2025-08-16T17:31:07.253Z","repository":{"id":40387594,"uuid":"436661272","full_name":"fslaborg/FsSpreadsheet","owner":"fslaborg","description":"Spreadsheet creation and manipulation in F#, Javascript, and Python.","archived":false,"fork":false,"pushed_at":"2025-07-16T12:48:20.000Z","size":4593,"stargazers_count":36,"open_issues_count":25,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-31T20:23:07.247Z","etag":null,"topics":["csv","dotnet","excel","fsharp","openxml","spreadsheet","xlsx"],"latest_commit_sha":null,"homepage":"http://fslab.org/FsSpreadsheet/","language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fslaborg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-09T15:12:25.000Z","updated_at":"2025-07-31T10:49:54.000Z","dependencies_parsed_at":"2023-02-18T06:46:02.944Z","dependency_job_id":"ee39849e-ad45-4306-84be-03bf8cb16958","html_url":"https://github.com/fslaborg/FsSpreadsheet","commit_stats":{"total_commits":395,"total_committers":7,"mean_commits":56.42857142857143,"dds":0.6329113924050633,"last_synced_commit":"1ab4da0a7abf1b724230a75f108a6d71a06a739f"},"previous_names":["fslaborg/fsspreadsheet","csbiology/fsspreadsheet"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/fslaborg/FsSpreadsheet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fslaborg%2FFsSpreadsheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fslaborg%2FFsSpreadsheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fslaborg%2FFsSpreadsheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fslaborg%2FFsSpreadsheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fslaborg","download_url":"https://codeload.github.com/fslaborg/FsSpreadsheet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fslaborg%2FFsSpreadsheet/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269312319,"owners_count":24396160,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-07T02:00:09.698Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csv","dotnet","excel","fsharp","openxml","spreadsheet","xlsx"],"created_at":"2024-12-17T01:11:52.463Z","updated_at":"2025-08-16T17:31:06.812Z","avatar_url":"https://github.com/fslaborg.png","language":"F#","readme":"﻿# FsSpreadsheet\r\nSpreadsheet creation and manipulation in FSharp\r\n\r\n\u003ctable\u003e\r\n  \u003cthead\u003e\r\n    \u003ctr\u003e\r\n      \u003cth\u003eLatest Release\u003c/th\u003e\r\n      \u003cth\u003eDownloads\u003c/th\u003e\r\n      \u003cth\u003eTarget\u003c/th\u003e\r\n    \u003c/tr\u003e\r\n  \u003c/thead\u003e\r\n  \u003ctbody\u003e\r\n    \u003ctr\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://pypi.org/project/fsspreadsheet/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/pypi/v/fsspreadsheet?logo=pypi\" alt=\"latest release\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://pepy.tech/project/siren-dsl\"\u003e\r\n          \u003cimg alt=\"Pepy Total Downlods\" src=\"https://img.shields.io/pepy/dt/siren-dsl?label=fsspreadsheet\u0026color=blue\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003ePython\u003c/td\u003e\r\n    \u003c/tr\u003e\r\n    \u003c!-- js package --\u003e\r\n    \u003ctr\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.npmjs.com/package/@fslab/fsspreadsheet\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/npm/v/@fslab/fsspreadsheet?logo=npm\" alt=\"latest release\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.npmjs.com/package/@fslab/fsspreadsheet\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/npm/dt/@fslab/fsspreadsheet?label=@fslab/fsspreadsheet\" alt=\"downloads\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003eJavaScript\u003c/td\u003e\r\n    \u003c/tr\u003e\r\n    \u003c!-- f# nuget package core --\u003e\r\n    \u003ctr\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/v/FsSpreadsheet?logo=nuget\" alt=\"latest release\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/dt/FsSpreadsheet?label=FsSpreadsheet\" alt=\"downloads\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\u003c/td\u003e\r\n    \u003c/tr\u003e\r\n    \u003c!-- f# nuget package net --\u003e\r\n    \u003ctr\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet.Net/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/v/FsSpreadsheet.Net?logo=nuget\" alt=\"latest release\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet.Net/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/dt/FsSpreadsheet.Net?label=FsSpreadsheet.Net\" alt=\"downloads\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e.NET\u003c/td\u003e\r\n    \u003c/tr\u003e\r\n    \u003c!-- f# nuget package js --\u003e\r\n    \u003ctr\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet.Js/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/v/FsSpreadsheet.Js?logo=nuget\" alt=\"latest release\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet.Js/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/dt/FsSpreadsheet.Js?label=FsSpreadsheet.Js\" alt=\"downloads\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003eFable JavaScript\u003c/td\u003e\r\n    \u003c/tr\u003e\r\n    \u003c!-- f# nuget package py --\u003e\r\n    \u003ctr\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet.Py/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/v/FsSpreadsheet.Py?logo=nuget\" alt=\"latest release\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003e\r\n        \u003ca href=\"https://www.nuget.org/packages/FsSpreadsheet.Py/\"\u003e\r\n          \u003cimg src=\"https://img.shields.io/nuget/dt/FsSpreadsheet.Py?label=FsSpreadsheet.Py\" alt=\"downloads\" /\u003e\r\n        \u003c/a\u003e\r\n      \u003c/td\u003e\r\n      \u003ctd\u003eFable Python\u003c/td\u003e\r\n    \u003c/tr\u003e\r\n  \u003c/tbody\u003e\r\n\r\n\u003c/table\u003e\r\n\r\n## DSL \r\n```fsharp\r\n#r \"nuget: FsSpreadsheet\"\r\n\r\nopen FsSpreadsheet.DSL\r\n\r\nlet dslTree = \r\n\r\n    workbook {\r\n        sheet \"MySheet\" {\r\n            row {\r\n                cell {1}\r\n                cell {2}\r\n                cell {3}\r\n            }\r\n            row {\r\n                4\r\n                5\r\n                6\r\n            }\r\n        }\r\n    }\r\n\r\n\r\nlet spreadsheet = dslTree.Value.Parse()\r\n```\r\n## ExcelIO\r\n\r\n```fsharp\r\n\r\n#r \"nuget: FsSpreadsheet.Net\"\r\n\r\nopen FsSpreadsheet.Net\r\n\r\nspreadsheet.ToFile(excelFilePath)\r\n\r\n```\r\n\r\n-------\u003e\r\n\r\n![image](https://user-images.githubusercontent.com/17880410/167841765-f67e1fa2-3806-4f32-9223-bdecc8253568.png)\r\n\r\n## Code Examples\r\n\r\n```fsharp\r\nlet tables = workbook.GetTables()\r\nlet worksheets = workbook.GetWorksheets()\r\n// get worksheet and its table as tuple\r\nlet worksheetsAndTables =\r\ntables\r\n|\u003e List.map (\r\n    fun t -\u003e\r\n\tlet associatedWs = \r\n\t    worksheets\r\n\t    |\u003e List.find (\r\n\t\tfun ws -\u003e \r\n\t\t    ws.Tables\r\n\t\t    |\u003e List.exists (fun t2 -\u003e t2.Name = t.Name)\r\n\t    )\r\n\tassociatedWs, t\r\n)\r\n```\r\n\r\n\r\n## Development\r\n\r\n### Requirements\r\n\r\n- [nodejs and npm](https://nodejs.org/en/download)\r\n    - verify with `node --version` (Tested with v18.16.1)\r\n    - verify with `npm --version` (Tested with v9.2.0)\r\n- [.NET SDK](https://dotnet.microsoft.com/en-us/download)\r\n    - verify with `dotnet --version` (Tested with 7.0.306)\r\n- [Python](https://www.python.org/downloads/)\r\n    - verify with `py --version` (Tested with 3.12.2)\r\n\r\n### Local Setup\r\n\r\n1. Setup dotnet tools\r\n\r\n   `dotnet tool restore`\r\n\r\n2. Install NPM dependencies\r\n   \r\n   `npm install`\r\n\r\n3. Setup python environment\r\n    \r\n   `py -m venv .venv`\r\n\r\n4. Install [Poetry](https://python-poetry.org/) and dependencies\r\n\r\n   1. `.\\.venv\\Scripts\\python.exe -m pip install -U pip setuptools`\r\n   2. `.\\.venv\\Scripts\\python.exe -m pip install poetry`\r\n   3. `.\\.venv\\Scripts\\python.exe -m poetry install --no-root`\r\n\r\nVerify correct setup with `./build.cmd runtests` \r\n\r\n5. `build.cmd \u003ctarget\u003e` where `\u003ctarget\u003e` may be\r\n    - if `\u003ctarget\u003e` is empty, it just runs dotnet build after cleaning everything\r\n    - `runtests` to run unit tests\r\n      - `runtestsjs` to only run JS unit tests\r\n\t  - `runtestsdotnet` to only run .NET unit tests\r\n      - `runtestpy` to only run Python unit tests\r\n    - `releasenotes semver:\u003cversion\u003e` where `\u003cversion\u003e` may be `major`, `minor`, or `patch` to update RELEASE_NOTES.md\r\n    - `pack` to create a NuGet release\r\n      - `packprelease` to create a NuGet prerelease\r\n    - `builddocs` to create docs\r\n      - `builddocsprerelease` to create prerelease docs\r\n  \t- `watchdocs` to create docs and run them locally\r\n  \t- `watchdocsprelease` to create prerelease docs and run them locally\r\n    - `release` to create a NuGet, NPM, PyPI and GitHub release \r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffslaborg%2FFsSpreadsheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffslaborg%2FFsSpreadsheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffslaborg%2FFsSpreadsheet/lists"}