{"id":20012133,"url":"https://github.com/fslaborg/fsspreadsheet","last_synced_at":"2025-05-04T20:31:26.040Z","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":"2024-11-29T09:34:56.000Z","size":5897,"stargazers_count":30,"open_issues_count":24,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-27T17:30:48.438Z","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}},"created_at":"2021-12-09T15:12:25.000Z","updated_at":"2025-04-27T13:36:27.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":9,"template":false,"template_full_name":null,"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","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252395293,"owners_count":21741009,"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","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-11-13T07:28:52.353Z","updated_at":"2025-05-04T20:31:24.289Z","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"}