{"id":13393973,"url":"https://github.com/handsontable/handsontable","last_synced_at":"2026-02-20T12:01:49.122Z","repository":{"id":37390863,"uuid":"1790564","full_name":"handsontable/handsontable","owner":"handsontable","description":"JavaScript Data Grid / Data Table with a Spreadsheet Look \u0026 Feel. Works with React, Angular, and Vue. Supported by the Handsontable team ⚡","archived":false,"fork":false,"pushed_at":"2025-09-08T13:31:04.000Z","size":830734,"stargazers_count":21409,"open_issues_count":396,"forks_count":3168,"subscribers_count":457,"default_branch":"develop","last_synced_at":"2025-09-08T15:28:32.643Z","etag":null,"topics":["angular-datagrid","angular-table","component","crud-operations","data-editing","data-grid","data-management","data-tables","datagrid","datatable","excel","excel-javascript","grid","grid-component","react-datatable","react-grid","spreadsheet","table","vue-table"],"latest_commit_sha":null,"homepage":"https://handsontable.com/docs","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/handsontable.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2011-05-23T22:38:58.000Z","updated_at":"2025-09-08T13:30:06.000Z","dependencies_parsed_at":"2024-03-25T08:54:16.862Z","dependency_job_id":"08861cd9-843d-40b6-a0b7-665018194414","html_url":"https://github.com/handsontable/handsontable","commit_stats":{"total_commits":6797,"total_committers":144,"mean_commits":"47.201388888888886","dds":0.681035751066647,"last_synced_commit":"8ca6d36ad5729d83969de41f23ff4d5a4656f1f5"},"previous_names":["warpech/jquery-handsontable"],"tags_count":229,"template":false,"template_full_name":null,"purl":"pkg:github/handsontable/handsontable","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handsontable%2Fhandsontable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handsontable%2Fhandsontable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handsontable%2Fhandsontable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handsontable%2Fhandsontable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/handsontable","download_url":"https://codeload.github.com/handsontable/handsontable/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handsontable%2Fhandsontable/sbom","scorecard":{"id":454273,"data":{"date":"2025-08-11","repo":{"name":"github.com/handsontable/handsontable","commit":"a5726e56c0a9ebc326edddcdf3e412c8714a4ed8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":9,"reason":"Found 29/30 approved changesets -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Dangerous-Workflow","score":0,"reason":"dangerous workflow patterns detected","details":["Warn: untrusted code checkout '${{ github.event.workflow_run.head_branch }}': .github/workflows/publish.yml:19"],"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":2,"reason":"badge detected: InProgress","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'packages' permission set to 'read': .github/workflows/code-quality.yml:40","Info: jobLevel 'actions' permission set to 'read': .github/workflows/code-quality.yml:41","Info: jobLevel 'contents' permission set to 'read': .github/workflows/code-quality.yml:42","Warn: no topLevel permission defined: .github/workflows/audit.yml:1","Warn: no topLevel permission defined: .github/workflows/build-all.yml:1","Warn: no topLevel permission defined: .github/workflows/changelog.yml:1","Warn: no topLevel permission defined: .github/workflows/code-quality.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-algolia-reindex.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-examples.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-linter.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-production.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-staging-delete.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-staging.yml:1","Warn: no topLevel permission defined: .github/workflows/docs-visual-tests.yml:1","Warn: no topLevel permission defined: .github/workflows/ghcr-cleanup.yml:1","Warn: no topLevel permission defined: .github/workflows/linter.yml:1","Warn: no topLevel permission defined: .github/workflows/publish.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Warn: no topLevel permission defined: .github/workflows/visual-tests-linter.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during GetBranch(master): error during branchesHandler.query: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/docs-production.yml:21"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":8,"reason":"dependency not pinned by hash detected -- score normalized to 8","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/code-quality.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/handsontable/handsontable/code-quality.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/code-quality.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/handsontable/handsontable/code-quality.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs-staging-delete.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/handsontable/handsontable/docs-staging-delete.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs-staging.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/handsontable/handsontable/docs-staging.yml/develop?enable=pin","Warn: containerImage not pinned by hash: docs/docker/Dockerfile:2: pin your Docker image by updating nginx:alpine to nginx:alpine@sha256:2459838ed006e699c252db374550c91490068bbf3b35fa8b9d29bfe0e31b8b95","Warn: npmCommand not pinned by hash: .github/workflows/docs-production.yml:82","Warn: npmCommand not pinned by hash: .github/workflows/docs-staging-delete.yml:52","Warn: npmCommand not pinned by hash: .github/workflows/docs-staging.yml:72","Warn: npmCommand not pinned by hash: .github/workflows/docs-staging.yml:73","Warn: npmCommand not pinned by hash: .github/workflows/docs-visual-tests.yml:46","Info: 100 out of 104 GitHub-owned GitHubAction dependencies pinned","Info:  39 out of  39 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   4 out of   9 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (29) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":0,"reason":"79 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-4w2v-q235-vp99","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-hf66-r44g-p7j9","Warn: Project is vulnerable to: GHSA-7wwv-vh3v-89cq","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-4www-5p9h-95mh","Warn: Project is vulnerable to: GHSA-9gqv-wp59-fq42","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-6vfc-qv3f-vr6c","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-8g77-54rh-46hx","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-6g33-8w2q-4hxv","Warn: Project is vulnerable to: GHSA-325j-24f4-qv5x","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-mgfv-m47x-4wqp","Warn: Project is vulnerable to: GHSA-5j4c-8p2g-v4jx","Warn: Project is vulnerable to: GHSA-g3ch-rx76-35fx","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-92r3-m2mg-pj97","Warn: Project is vulnerable to: GHSA-c24v-8rfc-w8vw","Warn: Project is vulnerable to: GHSA-8jhw-289h-jh2g","Warn: Project is vulnerable to: GHSA-64vr-g452-qvp3","Warn: Project is vulnerable to: GHSA-9cwx-2883-4wfx","Warn: Project is vulnerable to: GHSA-vg6x-rcgg-rjx6","Warn: Project is vulnerable to: GHSA-x574-m823-4x7w","Warn: Project is vulnerable to: GHSA-4r4m-qw57-chr8","Warn: Project is vulnerable to: GHSA-xcj6-pq6g-qj4x","Warn: Project is vulnerable to: GHSA-356w-63v5-8wf4","Warn: Project is vulnerable to: GHSA-859w-5945-r5v3","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-vhxf-7vqr-mrjg","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T09:09:28.455Z","repository_id":37390863,"created_at":"2025-08-19T09:09:28.455Z","updated_at":"2025-08-19T09:09:28.455Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274300170,"owners_count":25259713,"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-09-09T02:00:10.223Z","response_time":80,"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":["angular-datagrid","angular-table","component","crud-operations","data-editing","data-grid","data-management","data-tables","datagrid","datatable","excel","excel-javascript","grid","grid-component","react-datatable","react-grid","spreadsheet","table","vue-table"],"created_at":"2024-07-30T17:01:04.226Z","updated_at":"2026-02-20T12:01:49.116Z","avatar_url":"https://github.com/handsontable.png","language":"JavaScript","readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr\u003e\u003cbr\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/handsontable/handsontable/blob/develop/resources/handsontable-logo-white.svg?raw=true\"/\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/handsontable/handsontable/blob/develop/resources/handsontable-logo-black.svg?raw=true\"/\u003e\n    \u003cimg width=\"360\" alt=\"Logo of Handsontable data grid\" src=\"https://github.com/handsontable/handsontable/blob/develop/resources/handsontable-logo-black.svg?raw=true\"/\u003e\n  \u003c/picture\u003e\n  \u003cbr\u003e\u003cbr\u003e\n  \u003ch3\u003eHandsontable is a \u003ca href=\"https://handsontable.com/docs\" target=\"_blank\"\u003eJavaScript Data Grid\u003c/a\u003e with a spreadsheet-like look and feel.\u003c/h3\u003e\n  \u003cp\u003e\n    Use it with JavaScript, TypeScript, or frameworks such as \n    \u003ca href=\"https://github.com/handsontable/handsontable/tree/master/wrappers/react-wrapper\" target=\"_blank\"\u003eReact\u003c/a\u003e, \n    \u003ca href=\"https://github.com/handsontable/handsontable/tree/master/wrappers/angular-wrapper\" target=\"_blank\"\u003eAngular\u003c/a\u003e, and \n    \u003ca href=\"https://github.com/handsontable/handsontable/tree/master/wrappers/vue3\" target=\"_blank\"\u003eVue\u003c/a\u003e. With its spreadsheet-like editing features, it’s perfect for building data-rich internal apps. It allows users to enter, edit, validate, and process data from various sources. Common use cases include resource planning software (ERP), inventory management systems, digital platforms, and data modeling applications.\n  \u003c/p\u003e\n\n\u003ca href=\"https://handsontable.com\"\u003eWebsite\u003c/a\u003e \u0026nbsp;\u0026nbsp;—\u0026nbsp;\u0026nbsp; \u003ca href=\"https://handsontable.com/docs\"\u003eDocumentation\u003c/a\u003e \u0026nbsp;\u0026nbsp;—\u0026nbsp;\u0026nbsp; \u003ca href=\"https://handsontable.com/docs/themes\"\u003eThemes\u003c/a\u003e \u0026nbsp;\u0026nbsp;—\u0026nbsp;\u0026nbsp; \u003ca href=\"https://handsontable.com/docs/api\"\u003eAPI\u003c/a\u003e \u0026nbsp;\u0026nbsp;—\u0026nbsp;\u0026nbsp; \u003ca href=\"https://github.com/handsontable/handsontable/discussions\"\u003eCommunity\u003c/a\u003e\n\n  \u003cbr\u003e\n\n[![NPM version](https://img.shields.io/npm/v/handsontable?style=for-the-badge)](https://npmjs.com/package/handsontable)\n[![Total downloads](https://img.shields.io/npm/dt/handsontable.svg?style=for-the-badge)](https://npmjs.com/package/handsontable)\n[![Monthly downloads](https://img.shields.io/npm/dm/handsontable.svg?style=for-the-badge)](https://npmjs.com/package/handsontable)\n[![Contributors](https://img.shields.io/github/contributors/handsontable/handsontable?style=for-the-badge)](https://github.com/handsontable/handsontable/graphs/contributors)\n\u003cbr\u003e\n[![CI status](https://github.com/handsontable/handsontable/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/handsontable/handsontable/actions/workflows/test.yml?query=branch%3Amaster)\n[![Quality gate status](https://sonarcloud.io/api/project_badges/measure?project=handsontable_handsontable\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=handsontable_handsontable)\n[![FOSSA status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fhandsontable%2Fhandsontable.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fhandsontable%2Fhandsontable?ref=badge_shield)\n\n  \u003cbr\u003e\n\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/handsontable/handsontable/blob/develop/resources/handsontable-preview-dark-theme.png?raw=true\"/\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/handsontable/handsontable/blob/develop/resources/handsontable-preview-light-theme.png?raw=true\"/\u003e\n    \u003cimg width=\"780\" alt=\"JavaScript data grid preview\" src=\"https://github.com/handsontable/handsontable/blob/develop/resources/handsontable-preview-light-theme.png?raw=true\"/\u003e\n  \u003c/picture\u003e\n\u003c/div\u003e\n\n## ✨ Key Features\n\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Built-in themes](https://handsontable.com/docs/themes/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Flexible API](https://handsontable.com/docs/api/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Virtualization](https://handsontable.com/docs/row-virtualization/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [IME support](https://handsontable.com/docs/ime-support/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Internationalization](https://handsontable.com/docs/language/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [RTL support](https://handsontable.com/docs/layout-direction/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Accessibility](https://handsontable.com/docs/accessibility/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Keyboard shortcuts](https://handsontable.com/docs/keyboard-shortcuts/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Sorting data](https://handsontable.com/docs/rows-sorting/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Filtering data](https://handsontable.com/docs/column-filter/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [400 built-in formulas](https://handsontable.com/docs/formula-calculation/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Configurable selection](https://handsontable.com/docs/selection/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Data validation](https://handsontable.com/docs/cell-validator/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Conditional formatting](https://handsontable.com/docs/conditional-formatting/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Merged cells](https://handsontable.com/docs/merge-cells/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Frozen rows and columns](https://handsontable.com/docs/column-freezing/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Hiding rows and columns](https://handsontable.com/docs/column-hiding/) \u003cbr\u003e\n\u0026nbsp;\u0026nbsp;✅\u0026nbsp; [Right-click context menu](https://handsontable.com/docs/context-menu/) \u003cbr\u003e\n\n\u003cbr\u003e\n\n\u003cdiv id=\"installation\"\u003e\n\n## 🪄 Installation\nBelow, you'll find the installation guide for the JavaScript component. If you're using a specific framework, refer to its dedicated wrapper for installation instructions:\n\n- \u003cimg src=\"https://raw.githubusercontent.com/handsontable/handsontable/develop/resources/icons/react-icon.svg\" width=\"12\" height=\"12\"\u003e\u003ca href=\"https://github.com/handsontable/handsontable/tree/master/wrappers/react-wrapper\"\u003e React\u003c/a\u003e\n- \u003cimg src=\"https://raw.githubusercontent.com/handsontable/handsontable/develop/resources/icons/angular-icon.svg\" width=\"12\" height=\"12\" alt=\"Angular\"\u003e \u003ca href=\"https://github.com/handsontable/handsontable/tree/master/wrappers/angular-wrapper\"\u003e Angular\u003c/a\u003e\n- \u003cimg src=\"https://raw.githubusercontent.com/handsontable/handsontable/develop/resources/icons/vue-icon.svg\" width=\"12\" height=\"12\" alt=\"Vue\"\u003e \u003ca href=\"https://github.com/handsontable/handsontable/tree/master/wrappers/vue3\"\u003e Vue\u003c/a\u003e\n\n---\n\n### Install with npm\n\nYou can also use [Yarn](https://yarnpkg.com/package/handsontable), [NuGet](https://www.nuget.org/packages/Handsontable) or load the package from [CDN](https://jsdelivr.com/package/npm/handsontable).\n\n  ```bash\n  npm install handsontable\n  ```\n\n### Provide an HTML container\n\n  ```html\n  \u003c!-- Set the container's ID --\u003e\n  \u003cdiv id=\"handsontable-grid\"\u003e\u003c/div\u003e\n  ```\n\n### Setup\n\n  ```js\n  import Handsontable from 'handsontable';\n  \n  const element = document.getElementById('handsontable-grid');\n  \n  new Handsontable(element, {\n    data: [\n      { company: 'Tagcat', country: 'United Kingdom', rating: 4.4 },\n      { company: 'Zoomzone', country: 'Japan', rating: 4.5 },\n      { company: 'Meeveo', country: 'United States', rating: 4.6 },\n    ],\n    columns: [\n      { data: 'company', title: 'Company', width: 100 },\n      { data: 'country', title: 'Country', width: 170, type: 'dropdown', source: ['United Kingdom', 'Japan', 'United States'] },\n      { data: 'rating', title: 'Rating', width: 100, type: 'numeric' },\n    ],\n    rowHeaders: true,\n    navigableHeaders: true,\n    tabNavigation: true,\n    multiColumnSorting: true,\n    headerClassName: 'htLeft',\n    licenseKey: 'non-commercial-and-evaluation',\n  });\n\n  ```\n\n[![Static Badge](https://img.shields.io/badge/Live%20demo%20on%20StackBlitz-1a42e8?style=for-the-badge)](https://stackblitz.com/edit/handsontable-readme-example?file=src%2Fmain.js)\n\n### CDN-based setup\n\n\u003cdetails close\u003e\n  \u003csummary\u003e\u0026nbsp; Show/Hide code\u003c/summary\u003e\n  \u003cbr\u003e\n  If your environment does not support imports, you can use the code below to quickly set up and run a data grid with basic configuration options.\n  \u003cbr\u003e\u003cbr\u003e\n\n  ```html\n  \u003c!DOCTYPE html\u003e\n  \u003chtml lang=\"en\"\u003e\n    \u003chead\u003e\n      \u003cmeta charset=\"UTF-8\" /\u003e\n      \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /\u003e\n      \u003ctitle\u003eHandsontable - JavaScript Data Grid Example\u003c/title\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n      \u003cdiv id=\"handsontable-grid\"\u003e\u003c/div\u003e\n      \u003cscript src=\"https://cdn.jsdelivr.net/npm/handsontable/dist/handsontable.full.min.js\"\u003e\u003c/script\u003e\n      \u003cscript\u003e\n        const element = document.getElementById(\"handsontable-grid\");\n  \n        new Handsontable(element, {\n          data: [\n            { company: \"Tagcat\", country: \"United Kingdom\", rating: 4.4 },\n            { company: \"Zoomzone\", country: \"Japan\", rating: 4.5 },\n            { company: \"Meeveo\", country: \"United States\", rating: 4.6 },\n          ],\n          columns: [\n            { data: \"company\", title: \"Company\", width: 100 },\n            { data: \"country\", title: \"Country\", width: 170, type: \"dropdown\", source: [\"United Kingdom\", \"Japan\", \"United States\"] },\n            { data: \"rating\", title: \"Rating\", width: 100, type: \"numeric\" },\n          ],\n          rowHeaders: true,\n          navigableHeaders: true,\n          tabNavigation: true,\n          multiColumnSorting: true,\n          headerClassName: \"htLeft\",\n          licenseKey: \"non-commercial-and-evaluation\",\n        });\n      \u003c/script\u003e\n    \u003c/body\u003e\n  \u003c/html\u003e\n  ```\n\n\u003c/details\u003e\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n## 🚀 Resources\n\n- [Website](https://handsontable.com)\n- [Demo](https://handsontable.com/demo)\n- [Documentation](https://handsontable.com/docs)\n- [npm](https://www.npmjs.com/package/handsontable)\n- [CDN](https://www.jsdelivr.com/package/npm/handsontable)\n- [Forum](https://forum.handsontable.com/)\n- [Blog](https://handsontable.com/blog)\n- [Contact support team](https://handsontable.com/contact?category=technical_support)\n- [Get a quote](https://handsontable.com/get-a-quote)\n\n\u003cbr\u003e\n\n## 🤔 Is Handsontable a Data Grid or a Spreadsheet?\n\nHandsontable is a data grid component written in JavaScript, not a spreadsheet. However, it brings in many features typically found in spreadsheet software. We designed it this way because spreadsheet-like patterns are often the most user-friendly when it comes to data entry and management.\n\n### Spreadsheet-like features in Handsontable:\n\n- Keyboard shortcuts compliant with either Google Sheets or Excel\n- 400 spreadsheet formulas via native integration with [HyperFormula](https://github.com/handsontable/hyperformula)\n- Keyboard navigation across headers that can be disabled, making only cells navigable\n- TAB navigation across cells that can be disabled\n- Built-in undo-redo functionality\n- Powerful clipboard capabilities for copy-paste operations\n- Ability to scroll the grid within the container (`div`) or window\n- Data binding in the form of an array of objects or arrays of arrays\n- Built-in cell editors like a date picker or dropdown list\n\nAt first glance, it might seem that a data table, spreadsheet, and data grid are just different names for the same thing - an interactive table displaying data. In reality, these tools serve different purposes and offer distinct functionalities, designed to meet specific needs. Handsontable sits comfortably in the data grid category while incorporating many of the best aspects of spreadsheet software.\n\n\u003cbr\u003e\n\n## 🛟 Support\n\n**We're here to help!**\n\nIf you're using Handsontable with a free, non-commercial license, you can:\n- Join the conversation on [GitHub Discussions](https://github.com/handsontable/handsontable/discussions) to share ideas, suggest features, or discuss changes.\n- Report any bugs you find on our [GitHub Issue Board](https://github.com/handsontable/handsontable/issues).\n- Connect with other developers and find answers on our [Developer Forum](https://forum.handsontable.com).\n\nIf you have a commercial license, feel free to contact us directly at [support@handsontable.com](mailto:support@handsontable.com) or use our [contact form](https://handsontable.com/contact?category=technical_support).\n\n\u003cbr\u003e\n\n## 📖 Licenses\n\nHandsontable is available under two licensing options, allowing you to choose the one that best fits your needs. Each license comes with its own terms and conditions, as outlined below:\n\n### ① Free license for non-commercial use, and evaluation purposes\nThis license is available for non-commercial purposes such as teaching, academic research, or evaluation. It allows you to use Handsontable free of charge under the terms specified in the non-commercial license agreement.  \n[Learn more here](https://github.com/handsontable/handsontable/blob/master/handsontable-non-commercial-license.pdf).\n\n### ② Commercial license\nFor commercial use, a paid license is required. This license includes support and maintenance to ensure you get the most out of Handsontable. The commercial license can be purchased directly from Handsoncode or through an [authorized reseller](https://handsontable.com/resellers). See the [pricing page](https://handsontable.com/pricing) for details.\n\n\u003cbr\u003e\n\n## 🔑 License Key\n\nFor projects covered by the free non-commercial license, simply use the phrase `'non-commercial-and-evaluation'` as your license key. \n\nIf you're using Handsontable in a project that supports commercial activities, you'll need to purchase a license key at [handsontable.com/pricing](https://handsontable.com/pricing). You can find more details in [our documentation](https://handsontable.com/docs/license-key/).\n\n\u003cbr\u003e\n\n## 🙌 Contributing\n\nContributions are welcome, but before you make them, please read the [Contributing Guide](https://github.com/handsontable/handsontable/blob/develop/CONTRIBUTING.md) and accept the [Contributor License Agreement](https://goo.gl/forms/yuutGuN0RjsikVpM2).\n\n\u003cbr\u003e\n\u003cbr\u003e\n\nCreated and maintained by the [Handsontable Team](https://handsontable.com/team) 👋\n\n---\n\n© 2012 - 2025 Handsoncode\n","funding_links":[],"categories":["JavaScript","Libraries","UI Components","Javascript","Spreadsheet","Spreadsheet [🔝](#readme)","others","22. 文档/表格/PDF ##","Vue","Repository","Tools","电子表格","22. 文档/表格/PDF","open source grid/spreadsheet editors","UI Components / UI Tools"],"sub_categories":["Spreadsheet","Editable data grid / spreadsheet","Runner","13.20 视差滚动(Parallax Scrolling) ###","库","Table","Office","WebTools","运行器","13.20 视差滚动(Parallax Scrolling)","运行器e2e测试"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhandsontable%2Fhandsontable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhandsontable%2Fhandsontable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhandsontable%2Fhandsontable/lists"}