gridjs-spreadsheet 26.6.2 → 26.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/angular.d.ts +67 -0
  2. package/angular.js +174 -0
  3. package/example/README.md +242 -41
  4. package/example/angular-gridjs/.nvmrc +1 -0
  5. package/example/angular-gridjs/angular.json +66 -0
  6. package/example/angular-gridjs/package.json +31 -0
  7. package/example/angular-gridjs/proxy.conf.json +12 -0
  8. package/example/angular-gridjs/src/app/api.ts +7 -0
  9. package/example/angular-gridjs/src/app/app.component.html +57 -0
  10. package/example/angular-gridjs/src/app/app.component.ts +153 -0
  11. package/example/angular-gridjs/src/app/routing.ts +52 -0
  12. package/example/angular-gridjs/src/favicon.ico +0 -0
  13. package/example/angular-gridjs/src/index.html +12 -0
  14. package/example/angular-gridjs/src/main.ts +7 -0
  15. package/example/angular-gridjs/src/styles.css +37 -0
  16. package/example/angular-gridjs/tsconfig.app.json +9 -0
  17. package/example/angular-gridjs/tsconfig.json +29 -0
  18. package/example/pom.xml +3 -3
  19. package/example/react-gridjs/index.html +12 -0
  20. package/example/react-gridjs/package.json +20 -0
  21. package/example/react-gridjs/src/App.jsx +188 -0
  22. package/example/react-gridjs/src/api.js +7 -0
  23. package/example/react-gridjs/src/main.jsx +9 -0
  24. package/example/react-gridjs/src/routing.js +51 -0
  25. package/example/react-gridjs/src/styles.css +37 -0
  26. package/example/react-gridjs/vite.config.js +16 -0
  27. package/example/src/main/java/com/aspose/gridjs/demo/controller/DataController.java +80 -2
  28. package/example/src/main/java/com/aspose/gridjs/demo/controller/GridJs2Controller.java +12 -0
  29. package/example/vanilla-gridjs/npm/index.html +29 -0
  30. package/example/vanilla-gridjs/npm/main.js +8 -0
  31. package/example/vanilla-gridjs/npm/package.json +16 -0
  32. package/example/vanilla-gridjs/npm/vite.config.js +11 -0
  33. package/example/vanilla-gridjs/script/index.html +32 -0
  34. package/example/vanilla-gridjs/script/main.js +9 -0
  35. package/example/vanilla-gridjs/script/package.json +12 -0
  36. package/example/vanilla-gridjs/script/vite.config.js +11 -0
  37. package/example/vanilla-gridjs/shared/demo-app.js +205 -0
  38. package/example/vanilla-gridjs/shared/styles.css +36 -0
  39. package/example/vue-gridjs/index.html +12 -0
  40. package/example/vue-gridjs/package.json +19 -0
  41. package/example/vue-gridjs/src/App.vue +199 -0
  42. package/example/vue-gridjs/src/api.js +7 -0
  43. package/example/vue-gridjs/src/main.js +9 -0
  44. package/example/vue-gridjs/src/routing.js +51 -0
  45. package/example/vue-gridjs/src/styles.css +37 -0
  46. package/example/vue-gridjs/vite.config.js +21 -0
  47. package/index.d.ts +58 -1
  48. package/index.js +1 -1
  49. package/package.json +170 -50
  50. package/react.d.ts +27 -0
  51. package/react.js +111 -0
  52. package/readme.md +470 -318
  53. package/shared.d.ts +66 -0
  54. package/shared.js +204 -0
  55. package/vue.d.ts +20 -0
  56. package/vue.js +125 -0
  57. package/xspreadsheet.css +7 -0
  58. package/xspreadsheet.js +3 -3
  59. package/example/.mvn/wrapper/maven-wrapper.properties +0 -18
  60. package/example/src/test/java/com/aspose/gridjs/demo/GridjsdemoApplicationTests.java +0 -1441
package/readme.md CHANGED
@@ -1,443 +1,595 @@
1
1
  # gridjs-spreadsheet | Lightweight Online Excel Editor & Web Spreadsheet API
2
-
2
+
3
3
  > **GridJs-Spreadsheet** is a high-performance, lightweight JavaScript library for building online Excel editors and web-based spreadsheet applications. It provides seamless Excel viewing, editing, and cross-platform deployment with an easy-to-use API.
4
+ >
5
+ > **Now with first-class support for Vue 3, React, and Angular.**
6
+
7
+ ## Why Choose GridJs-Spreadsheet?
8
+
9
+ Whether you are building a collaborative document platform, a data management tool, or an Excel viewer for your web app, GridJs-Spreadsheet offers a comprehensive solution with a tiny footprint.
10
+
11
+ - Rich Excel-compatible editing experience — formulas, formatting, charts, images, form controls
12
+ - First-class framework wrappers for **React**, **Vue 3**, and **Angular** — drop-in components with zero boilerplate
13
+ - Full TypeScript declarations for IntelliSense and type safety
14
+ - Server-backed or client-only mode — works with any backend (.NET, Java, Python, Node.js)
15
+ - 17+ UI languages out of the box
16
+ - MIT licensed — free for commercial and open-source projects
17
+
18
+ ## Preview
4
19
 
5
- ## Why Choose GridJs-Spreadsheet?
20
+ <img alt="GridJS spreadsheet preview" src="https://unpkg.com/gridjs-spreadsheet@26.7.0/preview.gif">
6
21
 
7
- Whether you are building a collaborative document platform, an internal data management tool, or an Excel viewer for your web app, GridJs-Spreadsheet offers a comprehensive solution.
22
+ Quick online demo: <https://products.aspose.app/cells/editor>
8
23
 
9
- - [API](#api)
10
- - [Preview](#preview)
11
- - [Github Demos](#github-demos)
24
+ ## Table of Contents
25
+
26
+ - [Installation](#installation)
27
+ - [Package Exports](#package-exports)
28
+ - [Usage](#usage)
29
+ - [Vanilla JavaScript (npm)](#vanilla-javascript-with-npm)
30
+ - [Vanilla HTML (CDN)](#vanilla-html-with-script-tags)
31
+ - [React](#react)
32
+ - [Vue 3](#vue-3)
33
+ - [Angular](#angular)
34
+ - [Framework Adapter API](#framework-adapter-api)
35
+ - [Core API](#core-api)
12
36
  - [Features](#features)
13
- - [Documentation](#documentation)
14
- - [Support](#support)
37
+ - [Backend Endpoints](#backend-endpoints)
38
+ - [Example Project](#example-project)
39
+ - [Browser Support](#browser-support)
40
+ - [Version History](#version-history)
41
+ - [Resources](#resources)
15
42
  - [License](#license)
16
43
 
17
44
  ## About
18
45
 
19
- It allows you to view and edit spreadsheet files with ease.
20
-
21
- this is developed based on https://github.com/myliang/x-spreadsheet
46
+ GridJs-Spreadsheet allows you to view and edit spreadsheet files directly in the browser. It is developed based on [x-spreadsheet](https://github.com/myliang/x-spreadsheet) and extended with enterprise-grade features including chart rendering, form controls, data redaction, multi-sheet support, and server-side integration APIs.
22
47
 
23
- Quick online demo: https://products.aspose.app/cells/editor
48
+ The package includes the core GridJS runtime, TypeScript declarations, and ready-to-use adapters for **React**, **Vue 3**, and **Angular**.
24
49
 
25
- ## Preview
50
+ ## Installation
26
51
 
27
- <img alt='demo' src='https://unpkg.com/gridjs-spreadsheet@25.1.0/preview.gif' />
52
+ ```bash
53
+ npm install gridjs-spreadsheet
54
+ ```
28
55
 
56
+ The framework packages are optional peer dependencies — install only the framework used by your application:
29
57
 
30
- ## API
58
+ ```bash
59
+ # install for React
60
+ npm install react react-dom
31
61
 
32
- APIs are available on the [API page](https://docs.aspose.com/cells/net/aspose-cells-gridjs/how-to-use-gridjs-client-api/).
33
-
34
- ## CDN
35
- ```html
36
- <head>
37
- <!-- other dependency start -->
38
- <link rel="stylesheet" href="https://unpkg.com/bootstrap@5.2.3/dist/css/bootstrap.min.css">
39
- <link rel="stylesheet" href="https://unpkg.com/jquery-ui@1.13.2/dist/themes/ui-lightness/jquery-ui.min.css">
40
- <script src="https://unpkg.com/jquery@3.6.0/dist/jquery.min.js"></script>
41
- <script src="https://unpkg.com/jquery-ui@1.13.2/dist/jquery-ui.min.js"></script>
42
- <script src="https://unpkg.com/jszip@3.10.1/dist/jszip.min.js"></script>
43
- <!-- other dependency end -->
44
- <link rel="stylesheet" href="https://unpkg.com/gridjs-spreadsheet/xspreadsheet.css">
45
- <script src="https://unpkg.com/gridjs-spreadsheet/xspreadsheet.js"></script>
62
+ # install for Vue 3
63
+ npm install vue
46
64
 
47
- <script>
48
- const option = {
49
- updateMode: 'server',
50
- updateUrl: '/GridJs2/UpdateCell',
51
- showToolbar: true,
52
- //mode: 'edit' or 'read'
53
- mode: 'read',
54
- //support multiple language ,the locale is:en, cn, es, pt, de, ru, nl, ar, fr,id,it,ja, ko,th,tr,vi,cht
55
- local: 'en',
56
- };
57
- const sheetstr="[{\"name\":\"Sheet1\",\"sheetid\":\"s0\",\"showGrid\":true,\"sprotected\":false,\"canselectlocked\":true,\"displayRight2Left\":false,\"canselectunlocked\":true,\"styles\":[{\"textwrap\":true,\"color\":\"#000000\",\"valign\":\"middle\",\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"italic\":false}},{\"textwrap\":false,\"color\":\"#000000\",\"valign\":\"middle\",\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"italic\":false}}],\"cols\":{\"0\":{\"width\":72},\"1\":{\"width\":72},\"2\":{\"width\":532},\"3\":{\"width\":72},\"4\":{\"width\":72},\"5\":{\"width\":72},\"6\":{\"width\":72},\"7\":{\"width\":72},\"8\":{\"width\":72},\"9\":{\"width\":72},\"10\":{\"width\":72},\"11\":{\"width\":72},\"12\":{\"width\":72},\"13\":{\"width\":72},\"14\":{\"width\":72},\"15\":{\"width\":72},\"len\":16},\"rows\":{\"3\":{\"height\":122,\"cells\":{\"2\":{\"text\":\"FFF呜呜呜\\n呜我 我我我我\\nnice wwwwww\\nexample work 测的的的的的的的到\\n到手 一级 一季报 击败发发发发发发发发发发发\",\"style\":0,\"rtxt\":[{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"F\"},{\"font\":{\"name\":\"arial\",\"size\":18,\"bold\":false,\"color\":\"#953735\",\"italic\":false},\"txt\":\"FF呜\"},{\"font\":{\"name\":\"arial\",\"size\":18,\"bold\":false,\"color\":\"#953735\",\"underline\":\"single\",\"italic\":false},\"txt\":\"呜\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"underline\":\"single\",\"italic\":false},\"txt\":\"呜\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"\\n呜\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#0070C0\",\"italic\":false},\"txt\":\"我 我我\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"我我\\nni\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":true,\"color\":\"#C00000\",\"italic\":true},\"txt\":\"ce wwwwww\\nexample\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\" work \"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#C0504D\",\"italic\":false},\"txt\":\"测的的的\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#C0504D\",\"underline\":\"double\",\"italic\":false},\"txt\":\"的的\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"underline\":\"double\",\"italic\":false},\"txt\":\"的\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"的到\\n到手 \"},{\"font\":{\"name\":\"arial\",\"size\":18,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"一级 一季\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"报 击败发\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#9BBB59\",\"italic\":false},\"txt\":\"发发发发发发\"},{\"font\":{\"name\":\"arial\",\"size\":11,\"bold\":false,\"color\":\"#000000\",\"italic\":false},\"txt\":\"发发发发\"}],\"html\":\"<Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">F</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 18pt;COLOR: #953735;\\\">FF呜</Font><Font Style=\\\"TEXT-DECORATION: underline;FONT-FAMILY: arial;FONT-SIZE: 18pt;COLOR: #953735;\\\">呜</Font><Font Style=\\\"TEXT-DECORATION: underline;FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">呜</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\"><Br>呜</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #0070c0;\\\">我 我我</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">我我<Br>ni</Font><Font Style=\\\"FONT-WEIGHT: bold;FONT-STYLE: italic;FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #c00000;\\\">ce wwwwww<Br>example</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">&nbsp;work </Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #c0504d;\\\">测的的的</Font><Font Style=\\\"TEXT-DECORATION: underline;FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #c0504d;\\\">的的</Font><Font Style=\\\"TEXT-DECORATION: underline;FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">的</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">的到<Br>到手 </Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 18pt;COLOR: #000000;\\\">一级 一季</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">报 击败发</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #9bbb59;\\\">发发发发发发</Font><Font Style=\\\"FONT-FAMILY: arial;FONT-SIZE: 11pt;COLOR: #000000;\\\">发发发发</Font>\"},\"4\":{\"text\":\"\",\"style\":1}}},\"len\":13,\"height\":19}},{\"name\":\"Sheet2\",\"sheetid\":\"s1\",\"showGrid\":true,\"sprotected\":false,\"canselectlocked\":true,\"displayRight2Left\":false,\"canselectunlocked\":true,\"cols\":{\"0\":{\"width\":72},\"1\":{\"width\":72},\"2\":{\"width\":72},\"3\":{\"width\":72},\"4\":{\"width\":72},\"5\":{\"width\":72},\"6\":{\"width\":72},\"7\":{\"width\":72},\"8\":{\"width\":72},\"9\":{\"width\":72},\"10\":{\"width\":72},\"11\":{\"width\":72},\"12\":{\"width\":72},\"13\":{\"width\":72},\"14\":{\"width\":72},\"15\":{\"width\":72},\"len\":16},\"rows\":{\"12\":{\"height\":19,\"cells\":{\"15\":{\"text\":\"\"}}},\"len\":13,\"height\":19}},{\"name\":\"Sheet3\",\"sheetid\":\"s2\",\"showGrid\":true,\"sprotected\":false,\"canselectlocked\":true,\"displayRight2Left\":false,\"canselectunlocked\":true,\"cols\":{\"0\":{\"width\":72},\"1\":{\"width\":72},\"2\":{\"width\":72},\"3\":{\"width\":72},\"4\":{\"width\":72},\"5\":{\"width\":72},\"6\":{\"width\":72},\"7\":{\"width\":72},\"8\":{\"width\":72},\"9\":{\"width\":72},\"10\":{\"width\":72},\"11\":{\"width\":72},\"12\":{\"width\":72},\"13\":{\"width\":72},\"14\":{\"width\":72},\"15\":{\"width\":72},\"len\":16},\"rows\":{\"12\":{\"height\":19,\"cells\":{\"15\":{\"text\":\"\"}}},\"len\":13,\"height\":19}}]";
58
- xs = x_spreadsheet('#gridjs-demo', option).loadData(JSON.parse(sheetstr)).change((cdata) => {
59
- console.log(cdata);
60
- console.log(xs.validate());
61
- }
62
- </script>
63
- </head>
64
- <body>
65
- <div id="gridjs-demo"></div>
66
- </body>
65
+ # install for Angular
66
+ npm install @angular/core @angular/common
67
67
  ```
68
68
 
69
- ## NPM
69
+ ## Package Exports
70
70
 
71
- ```shell
72
- npm install gridjs-spreadsheet
73
- ```
71
+ | Usage | Import |
72
+ | --- | --- |
73
+ | Core runtime | `gridjs-spreadsheet` |
74
+ | Styles | `gridjs-spreadsheet/xspreadsheet.css` |
75
+ | React component | `gridjs-spreadsheet/react` |
76
+ | Vue 3 component | `gridjs-spreadsheet/vue` |
77
+ | Angular component | `gridjs-spreadsheet/angular` |
78
+ | Shared adapter | `gridjs-spreadsheet/shared` |
79
+
80
+ ## Usage
81
+
82
+ ### Vanilla JavaScript with npm
74
83
 
75
84
  ```html
76
85
  <div id="gridjs-demo"></div>
77
86
  ```
78
87
 
79
- ```javascript
80
- //includ all the dependencies
81
- //Including jszip
88
+ ```js
89
+ import Spreadsheet from 'gridjs-spreadsheet';
82
90
  import JSZip from 'jszip';
83
- window.JSZip = JSZip;
84
- //Including jQuery
85
- import $ from 'jquery';
86
- window.$ = $;
87
- //Including gridjs-spreadsheet
88
91
  import 'gridjs-spreadsheet/xspreadsheet.css';
89
- import Spreadsheet from "gridjs-spreadsheet";
90
-
91
- // If you need to override the default options, you can set the override
92
- // const options = {};
93
- // new Spreadsheet('#gridjs-demo', options);
94
- const s = new Spreadsheet("#gridjs-demo")
95
- .loadData({}) // load data
96
- .change(data => {
97
- // save data to db
98
- });
99
92
 
100
-
93
+ window.JSZip = JSZip;
94
+
95
+ const spreadsheet = new Spreadsheet('#gridjs-demo', {
96
+ updateMode: 'server',
97
+ updateUrl: '/GridJs2/UpdateCell',
98
+ mode: 'edit',
99
+ // Support 17+ languages: en, cn, es, pt, de, ru, nl, ar, fr, id, it, ja, ko, th, tr, vi, cht
100
+ local: 'en',
101
+ });
102
+
103
+ spreadsheet.loadData(workbookJson.data, workbookJson.actname);
104
+ spreadsheet.setUniqueId(workbookJson.uniqueid);
105
+ spreadsheet.setFileName(workbookJson.filename);
101
106
  ```
102
107
 
108
+ ### Vanilla HTML with script tags
109
+
110
+ ```html
111
+ <link
112
+ rel="stylesheet"
113
+ href="https://unpkg.com/gridjs-spreadsheet@26.7.0/xspreadsheet.css"
114
+ >
103
115
 
104
- ## simple usage
105
-
106
- ```javascript
107
-
108
- // If you need to override the default options, you can set the override
109
- const option = {
110
- updateMode: 'server',
111
- updateUrl: '/GridJs2/UpdateCell',
112
- showToolbar: true,
113
- //mode: 'edit' or 'read'
114
- mode: 'read',
115
- //support multiple language ,the locale is:en, cn, es, pt, de, ru, nl, ar, fr,id,it,ja, ko,th,tr,vi,cht
116
- local: 'en',
117
- };
118
-
119
- xs = x_spreadsheet('#gridjs-demo', option).loadData(sheets).change((cdata) => {
120
- console.log(cdata);
121
-
122
- }
123
-
124
-
116
+ <script src="https://unpkg.com/jszip@3.10.1/dist/jszip.min.js"></script>
117
+ <script src="https://unpkg.com/gridjs-spreadsheet/xspreadsheet.js"></script>
118
+
119
+ <div id="gridjs-demo"></div>
120
+
121
+ <script>
122
+ const spreadsheet = x_spreadsheet('#gridjs-demo', {
123
+ updateMode: 'server',
124
+ updateUrl: '/GridJs2/UpdateCell',
125
+ mode: 'edit',
126
+ local: 'en',
127
+ });
128
+
129
+ spreadsheet.loadData(workbookJson.data, workbookJson.actname);
130
+ </script>
125
131
  ```
126
132
 
127
- ```javascript
128
- // default options
129
- {
130
- mode: 'edit', // edit | read
131
- showToolbar: true,
132
- showGrid: true,
133
- showContextmenu: true,
134
- view: {
135
- height: () => document.documentElement.clientHeight,
136
- width: () => document.documentElement.clientWidth,
137
- },
138
- row: {
139
- len: 100,
140
- height: 25,
141
- },
142
- col: {
143
- len: 26,
144
- width: 100,
145
- indexWidth: 60,
146
- minWidth: 60,
147
- },
148
- style: {
149
- bgcolor: '#ffffff',
150
- align: 'left',
151
- valign: 'middle',
152
- textwrap: false,
153
- strike: false,
154
- underline: false,
155
- color: '#0a0a0a',
156
- font: {
157
- name: 'Helvetica',
158
- size: 10,
159
- bold: false,
160
- italic: false,
161
- },
162
- },
133
+ ### React
134
+
135
+ ```jsx
136
+ import { useState } from 'react';
137
+ import { GridJsSpreadsheet } from 'gridjs-spreadsheet/react';
138
+ import 'gridjs-spreadsheet/xspreadsheet.css';
139
+
140
+ export default function App() {
141
+ const [data] = useState(null);
142
+
143
+ return (
144
+ <GridJsSpreadsheet
145
+ data={data}
146
+ apiBase=""
147
+ mode="edit"
148
+ locale="en"
149
+ height="600px"
150
+ onReady={(instance, adapter) => console.log('ready', instance, adapter)}
151
+ onChange={(...args) => console.log('changed', args)}
152
+ onCellSelected={(...args) => console.log('cell selected', args)}
153
+ onError={(error) => console.error(error)}
154
+ />
155
+ );
163
156
  }
164
157
  ```
165
158
 
166
-
167
-
168
- ## Bind events
169
- ```javascript
170
- // single selection
171
- xs.on('cell-selected', (cell, ri, ci) => {});
172
- // range selection
173
- xs.on('cells-selected', (cell, { sri, sci, eri, eci }) => {});
174
- // shape/image selection
175
- xs.on('object-selected', (obj) => { console.log('obj id:', obj.id, ', type: ', obj.type); })
176
- // edited on cell
177
- xs.on('cell-edited', (text, ri, ci) => {});
178
- // cells updated
179
- xs.on('cells-updated', (name, cells) => {
180
- console.log('cells updated for sheet name:', name);
181
- cells.forEach((acell, index, array) => {
182
- console.log('acell got updated:', acell);
183
- })
184
- })
185
- // cells deleted
186
- xs.on('cells-deleted', (range) => {
187
- console.log('cells deleted :', range);
188
- })
189
- // rows deleted
190
- xs.on('rows-deleted', (ri, n) => {
191
- console.log('rows-deleted :', ri, ",size", n);
192
- })
193
- // columns deleted
194
- xs.on('columns-deleted', (ci, n) => {
195
- console.log('columns-deleted :', ci, ",size", n);
196
- })
197
- // rows inserted
198
- xs.on('rows-inserted', (ri, n) => {
199
- console.log('rows-inserted :', ri, ",size", n);
200
- })
201
- // columns inserted
202
- xs.on('columns-inserted', (ci, n) => {
203
- console.log('columns-inserted :', ci, ",size", n);
204
- })
159
+ ### Vue 3
160
+
161
+ ```vue
162
+ <template>
163
+ <GridJsSpreadsheet
164
+ :data="sheetData"
165
+ mode="edit"
166
+ locale="en"
167
+ height="600px"
168
+ @ready="onReady"
169
+ @change="onChange"
170
+ @cell-selected="onCellSelected"
171
+ @error="onError"
172
+ />
173
+ </template>
174
+
175
+ <script setup>
176
+ import { ref } from 'vue';
177
+ import { GridJsSpreadsheet } from 'gridjs-spreadsheet/vue';
178
+ import 'gridjs-spreadsheet/xspreadsheet.css';
205
179
 
180
+ const sheetData = ref(null);
181
+ const onReady = (instance, adapter) => console.log('ready', instance, adapter);
182
+ const onChange = (...args) => console.log('changed', args);
183
+ const onCellSelected = (...args) => console.log('cell selected', args);
184
+ const onError = error => console.error(error);
185
+ </script>
206
186
  ```
207
187
 
208
- ## update cell-text
209
- ```javascript
210
-
211
- // cellText(ri, ci, text, sheetIndex = 0)
212
- xs.cellText(5, 5, 'xxxx',0).cellText(6, 5, 'yyy',0).reRender();
188
+ ### Angular
189
+
190
+ ```ts
191
+ import { Component } from '@angular/core';
192
+ import { GridJsSpreadsheetComponent } from 'gridjs-spreadsheet/angular';
193
+
194
+ @Component({
195
+ selector: 'app-root',
196
+ standalone: true,
197
+ imports: [GridJsSpreadsheetComponent],
198
+ template: `
199
+ <gridjs-spreadsheet
200
+ [data]="sheetData"
201
+ mode="edit"
202
+ locale="en"
203
+ height="600px"
204
+ (ready)="onReady($event)"
205
+ (change)="onChange($event)"
206
+ (cellSelected)="onCellSelected($event)"
207
+ (error)="onError($event)"
208
+ />
209
+ `,
210
+ })
211
+ export class AppComponent {
212
+ sheetData: any = null;
213
+ onReady(event: any) { console.log('ready', event); }
214
+ onChange(args: any[]) { console.log('changed', args); }
215
+ onCellSelected(args: any[]) { console.log('cell selected', args); }
216
+ onError(error: any) { console.error(error); }
217
+ }
213
218
  ```
214
219
 
215
- ## get cell and cell-style
216
- ```javascript
217
-
218
- // cell(ri, ci, sheetIndex = 0)
219
- xs.cell(ri, ci);
220
- // cellStyle(ri, ci, sheetIndex = 0)
221
- xs.cellStyle(ri, ci);
220
+ Add the GridJS stylesheet to `angular.json`:
221
+
222
+ ```json
223
+ "styles": [
224
+ "node_modules/gridjs-spreadsheet/xspreadsheet.css",
225
+ "src/styles.css"
226
+ ]
222
227
  ```
223
-
224
228
 
225
- ## Features
229
+ ## Framework Adapter API
226
230
 
227
- ### Rich Editing & Formatting
228
- - Font/Font size/ bold/italic/Underline/Strike
229
- - Text color/Align/wrapping
230
- - Fill color / Highlight
231
- - Number Format / RichText
232
- - Borders / Condition Format
233
- - Paint format / Clear format
231
+ The React, Vue, and Angular adapters share the same configuration model:
234
232
 
235
- ### Data Management & Analysis
236
- - Formula support
237
- - Filter / Sort row and column
238
- - Data validations
239
- - Copy, Cut, Paste / Autofill
240
- - Merge cells / Freeze cell
241
- - Insert/Delete row, column
242
- - Resize row-height, col-width
243
- - Zoom in/out
244
- - Search
233
+ | Option | Type | Default | Description |
234
+ | --- | --- | --- | --- |
235
+ | `apiBase` | `string` | `''` | Prefix for GridJS backend endpoints |
236
+ | `data` | `object` | `null` | Workbook JSON returned by the GridJS backend |
237
+ | `loader` | `function` | `null` | Async function that returns workbook JSON |
238
+ | `mode` | `'edit' \| 'read'` | `'edit'` | Editing mode |
239
+ | `locale` | `string` | `'en'` | UI language locale |
240
+ | `token` | `string` | `''` | Authorization token for server requests |
241
+ | `height` | `string \| number` | `'calc(100vh - 96px)'` | Component height |
242
+ | `showToolbar` | `boolean` | `true` | Show or hide the toolbar |
243
+ | `showContextmenu` | `boolean` | `true` | Show or hide the context menu |
245
244
 
246
- ### Visuals & Objects
247
- - Display chart/shapes
248
- - Display condition icons
249
- - Shape/Image resize/rotate/position adjustment
250
- - Insert/Delete/Copy common shapes for autoshape
251
- - Insert/Delete/Copy Image
252
- - Display form controls / ActiveX controls
253
- - Insert/Delete form controls
254
- - Support display two colors gradient in fill effects
245
+ **Events:** All adapters expose `ready`, `change`, `error`, `cellSelected`, `cellEdited`, `sheetSelected`, and `sheetLoaded` events using each framework's normal event conventions.
255
246
 
256
- ### Security & Advanced Tools
257
- - Redact sensitive data
258
- - Add/delete Comment
259
- - Add/delete Links
260
- - Print
261
- - Localization/Multiple language UI
262
- - Mobile compatibility
247
+ > **Note:** GridJS requires a browser DOM. When using SSR frameworks (Next.js, Nuxt, Angular Universal), mount the adapters on the client side only.
263
248
 
249
+ ## Core API
264
250
 
265
- ## Github-Demos
251
+ The core `Spreadsheet` class provides a rich JavaScript API:
266
252
 
267
- Visit the GridJs demo to find more detail info:
253
+ ```js
254
+ const xs = new Spreadsheet('#container', options);
268
255
 
269
- https://github.com/aspose-cells/Aspose.Cells.Grid-for-.NET/tree/master/Examples_GridJs
256
+ // Load data
257
+ xs.loadData(jsonData);
270
258
 
271
- https://github.com/aspose-cells/Aspose.Cells.Grid-for-Java/tree/master/Examples.GridJs
259
+ // Bind events
260
+ xs.on('cell-selected', (cell, ri, ci) => { });
261
+ xs.on('cells-selected', (cell, { sri, sci, eri, eci }) => { });
262
+ xs.on('cell-edited', (text, ri, ci) => { });
263
+ xs.on('object-selected', (obj) => { });
264
+ xs.on('cells-updated', (name, cells) => { });
265
+ xs.on('rows-inserted', (ri, n) => { });
266
+ xs.on('columns-inserted', (ci, n) => { });
267
+ xs.on('rows-deleted', (ri, n) => { });
268
+ xs.on('columns-deleted', (ci, n) => { });
269
+ xs.on('cells-deleted', (range) => { });
272
270
 
273
- https://github.com/aspose-cells/Aspose.Cells.Grid-for-Python-via-.NET/tree/main/Examples.GridJs
271
+ // Cell operations
272
+ xs.cellText(5, 5, 'Hello');
273
+ xs.cell(ri, ci);
274
+ xs.cellStyle(ri, ci);
274
275
 
276
+ // Sheet operations
277
+ xs.setActiveSheet(index);
278
+ xs.setActiveSheetByName('Sheet2');
279
+ xs.setActiveCell(rowIndex, colIndex);
280
+ xs.getData();
275
281
 
282
+ // Server integration
283
+ xs.setUniqueId('workbook-id');
284
+ xs.setFileName('report.xlsx');
285
+ xs.refreshToken(token);
276
286
 
277
- ## Documentation
287
+ // Cleanup
288
+ xs.destroy();
289
+ ```
278
290
 
279
- Online documentation is available here:
291
+ Full API documentation: [API Reference](https://docs.aspose.com/cells/net/aspose-cells-gridjs/how-to-use-gridjs-client-api/)
280
292
 
281
- - [Developer's Guide C#](https://docs.aspose.com/cells/net/aspose-cells-gridjs/)
282
- - [API Reference C#](https://docs.aspose.com/cells/net/aspose-cells-gridjs/client/)
283
- - [Developer's Guide Python](https://docs.aspose.com/cells/python-net/aspose-cells-gridjs/)
284
- - [API Reference Python](https://docs.aspose.com/cells/python-net/aspose-cells-gridjs/client/)
285
- - [Developer's Guide JAVA](https://docs.aspose.com/cells/java/aspose-cells-gridjs/)
286
- - [API Reference JAVA](https://docs.aspose.com/cells/java/aspose-cells-gridjs/client/)
293
+ ### Default Options
287
294
 
288
- ## Browser Support
295
+ ```js
296
+ {
297
+ mode: 'edit', // 'edit' | 'read'
298
+ showToolbar: true,
299
+ showGrid: true,
300
+ showContextmenu: true,
301
+ view: {
302
+ height: () => document.documentElement.clientHeight,
303
+ width: () => document.documentElement.clientWidth,
304
+ },
305
+ row: { len: 100, height: 25 },
306
+ col: { len: 26, width: 100, indexWidth: 60, minWidth: 60 },
307
+ style: {
308
+ bgcolor: '#ffffff',
309
+ align: 'left',
310
+ valign: 'middle',
311
+ textwrap: false,
312
+ color: '#0a0a0a',
313
+ font: { name: 'Helvetica', size: 10, bold: false, italic: false },
314
+ },
315
+ }
316
+ ```
289
317
 
290
- Modern browsers(chrome, firefox, Safari).
318
+ ## Features
291
319
 
292
- ## Version History
320
+ ### Rich Editing & Formatting
321
+ - Font / Font size / Bold / Italic / Underline / Strikethrough
322
+ - Text color / Alignment / Text wrapping
323
+ - Fill color / Highlight
324
+ - Number format / Rich text support
325
+ - Borders / Conditional formatting
326
+ - Format painter / Clear format
327
+
328
+ ### Data Management & Analysis
329
+ - Full formula support
330
+ - Filter / Sort rows and columns
331
+ - Data validations (including multi-select lists)
332
+ - Copy / Cut / Paste / Autofill — including from MS Excel
333
+ - Merge cells / Freeze panes
334
+ - Insert / Delete rows and columns
335
+ - Resize row height / column width
336
+ - Zoom in / out
337
+ - Search and replace
338
+ - Statistics information in the status bar
339
+
340
+ ### Visuals & Objects
341
+ - Charts rendering (bar, line, pie, area, and more)
342
+ - Conditional formatting icons
343
+ - Shape / Image resize, rotate, and position adjustment
344
+ - Insert / Delete / Copy shapes and images
345
+ - Form controls / ActiveX controls display
346
+ - Insert / Delete form controls
347
+ - Two-color gradient fill effects
348
+
349
+ ### Security & Advanced Tools
350
+ - Data redaction — burn sensitive data permanently
351
+ - Comments — add / edit / delete
352
+ - Hyperlinks — add / delete
353
+ - Print support
354
+ - Localization — 17+ UI languages
355
+ - Mobile responsive compatibility
356
+ - Custom toolbar buttons
357
+ - Lazy loading for large workbooks
358
+
359
+ ## Backend Endpoints
360
+
361
+ The adapters use the standard Aspose.Cells GridJs endpoints:
362
+
363
+ - `/GridJs2/UpdateCell` — cell update
364
+ - `/GridJs2/ImageUrl` — image retrieval
365
+ - `/GridJs2/AddImage` — upload local image
366
+ - `/GridJs2/AddImageByURL` — upload image by URL
367
+ - `/GridJs2/CopyImage` — copy image
368
+ - `/GridJs2/Download` — file download
369
+ - `/GridJs2/Ole` — OLE object download
370
+ - `/GridJs2/LazyLoadingStreamJson` — lazy loading
371
+
372
+ ## Example Project
373
+
374
+ From version 26.7.0 the package includes a complete `example/` directory with a Spring Boot backend and five independent frontend demos (React, Vue 3, Angular, Vanilla npm, Vanilla CDN).
375
+
376
+ ```bash
377
+ cp -R node_modules/gridjs-spreadsheet/example ./gridjs-example
378
+ cd gridjs-example
379
+ ./mvnw spring-boot:run -Dmaven.test.skip=true
380
+ ```
293
381
 
294
- v24.9.1:
382
+ See [`example/README.md`](example/README.md) for all framework commands, ports, backend configuration, and troubleshooting.
295
383
 
296
- - Fix bug that fail to insert column in the new added worksheet
297
- - Fix bug that fail to rename worksheet
298
- - Support lazy loading
384
+ Additional demos for .NET, Java, and Python:
299
385
 
300
- v24.10:
386
+ - <https://github.com/aspose-cells/Aspose.Cells.Grid-for-.NET/tree/master/Examples_GridJs>
387
+ - <https://github.com/aspose-cells/Aspose.Cells.Grid-for-Java/tree/master/Examples.GridJs>
388
+ - <https://github.com/aspose-cells/Aspose.Cells.Grid-for-Python-via-.NET/tree/main/Examples.GridJs>
301
389
 
302
- - Support a view option to show formulas
390
+ ## Browser Support
303
391
 
304
- v24.11:
392
+ Modern browsers — Chrome, Firefox, Safari, Edge.
305
393
 
306
- - improve the display of rich text cell values
394
+ ## Version History
307
395
 
308
- v24.12:
396
+ <details>
397
+ <summary><strong>v26.7.1</strong> — Improve performance for redaction</summary>
309
398
 
310
- - Support API to show HTML nodes and interact with HTML nodes at specified cell positions
311
- - Support pre-check event for row/column delete/insert operations
312
- - Support row/column insert/delete events for client APIs
313
- - Support events for updating cells
314
- - Support multiple instances on one page
399
+ - Improve performance for redaction
400
+ </details>
315
401
 
316
- v25.1:
402
+ <details>
403
+ <summary><strong>v26.7</strong> — Fix issue for filter in merge area</summary>
317
404
 
318
- - Support copy/paste from MS-Excel
405
+ - Fix issue for filter in merge area
406
+ </details>
319
407
 
320
- v25.2:
408
+ <details>
409
+ <summary><strong>v26.6</strong> — Improve redaction</summary>
321
410
 
322
- - Support copy/paste from MS-Excel
323
- - Enhancement for automatic operations for user’s convenience, such as extending blank row/column, page scrolling, …
411
+ - Improve redaction feature
412
+ - Fix redaction font issue
413
+ - Fix redaction transparent view issue
414
+ </details>
324
415
 
325
- v25.3:
416
+ <details>
417
+ <summary><strong>v26.5</strong> — Custom toolbar buttons, date picker, filter, print</summary>
326
418
 
327
- - Support more shotcut keys
328
- - Support pasting the content copied from excel to multiple target areas
419
+ - Support add custom buttons in toolbar
420
+ - Improve date picker
421
+ - Improve filter display
422
+ - Improve print
423
+ - Improve scroll in zoom
424
+ </details>
329
425
 
330
- v25.4:
426
+ <details>
427
+ <summary><strong>v26.4</strong> — Redaction, shape lock, zoom snap</summary>
331
428
 
332
- - Support show statistics information in the lower right corner when cells are selected
429
+ - Add redaction features
430
+ - Fix paste scroll issue
431
+ - Support shape lock
432
+ - Support snap to cell area in zoom in/out
433
+ - Add boundary check for redaction
434
+ </details>
333
435
 
334
- v25.5:
436
+ <details>
437
+ <summary><strong>v26.3</strong> — Improve filter/validations/charts</summary>
335
438
 
336
- - Add support for Polish menus.
337
- - Support APIs for insert/delete rows/columns
439
+ - Improve filter/validations/charts
440
+ </details>
338
441
 
339
- v25.6:
442
+ <details>
443
+ <summary><strong>v26.2</strong> — Performance improvement for large rows</summary>
340
444
 
341
- - Support APIs for resize rows/columns
342
- - Support APIs for hide/unhide rows/columns
445
+ - Improve client performance for large rows
446
+ </details>
343
447
 
344
- v25.7:
448
+ <details>
449
+ <summary><strong>v26.1</strong> — Rotated text highlight, more charts</summary>
345
450
 
346
- - Support APIs to enable /disable editable range
347
- - Support APIs to add/modify/delete worksheet 
348
- - Support APIs to add/modify/delete comment
349
- - Support APIs to set attribute for range of cells
350
- - Support APIs to delete for range of cells
451
+ - Support highlight text with rotation
452
+ - Support more charts rendering in client
453
+ </details>
351
454
 
352
- v25.8:
455
+ <details>
456
+ <summary><strong>v25.12</strong> — Sort by color, multi-select validation</summary>
353
457
 
354
- - Support automatic text wrapping
355
- - Support API to apply font setting in textbox control
458
+ - Support sort by cell color/font color
459
+ - Support add multiple selection validation list
460
+ </details>
356
461
 
357
- v25.9:
462
+ <details>
463
+ <summary><strong>v25.11</strong> — Chart fill colors, color picker</summary>
358
464
 
359
- - Support to render pattern style for cell
465
+ - Support fill color settings for charts
466
+ - Support 'Fill Color' and 'Font Color' button dropdown selection and click to fill
467
+ </details>
360
468
 
361
- v25.10:
469
+ <details>
470
+ <summary><strong>v25.10</strong> — Custom toast, modal CSS</summary>
362
471
 
363
- - Support APIs to set customToast
472
+ - Support APIs to set customToast
364
473
  - Support CSS identify for model window
474
+ </details>
365
475
 
366
- v25.11:
476
+ <details>
477
+ <summary><strong>v25.9</strong> — Pattern fill style</summary>
367
478
 
368
- - Support fill color settings for charts
369
- - Support 'Fill Color ' and 'Font Color' button dropdown selection and click to fill
479
+ - Support to render pattern style for cell
480
+ </details>
370
481
 
371
- v25.12:
482
+ <details>
483
+ <summary><strong>v25.8</strong> — Auto text wrap, textbox font</summary>
372
484
 
373
- - Support sort by cell color/font color
374
- - Support add multiple selection validation list
485
+ - Support automatic text wrapping
486
+ - Support API to apply font setting in textbox control
487
+ </details>
375
488
 
376
- v26.1:
489
+ <details>
490
+ <summary><strong>v25.7</strong> — Editable range, worksheet/comment/range APIs</summary>
377
491
 
378
- - Support highlight text with rotation
379
- - Support more charts rendering in client
492
+ - Support APIs to enable/disable editable range
493
+ - Support APIs to add/modify/delete worksheet
494
+ - Support APIs to add/modify/delete comment
495
+ - Support APIs to set attribute for range of cells
496
+ - Support APIs to delete for range of cells
497
+ </details>
380
498
 
381
- v26.2:
499
+ <details>
500
+ <summary><strong>v25.6</strong> — Resize/hide rows and columns</summary>
382
501
 
383
- - Improve client performance for large rows
384
-
385
- v26.3:
502
+ - Support APIs for resize rows/columns
503
+ - Support APIs for hide/unhide rows/columns
504
+ </details>
386
505
 
387
- - Improve filter/validations/charts
506
+ <details>
507
+ <summary><strong>v25.5</strong> — Polish locale, row/column APIs</summary>
388
508
 
389
- v26.4:
509
+ - Add support for Polish menus
510
+ - Support APIs for insert/delete rows/columns
511
+ </details>
390
512
 
391
- - Add redaction features
392
- - Fix paste scroll issue
513
+ <details>
514
+ <summary><strong>v25.4</strong> Status bar statistics</summary>
393
515
 
394
- v26.4.1:
516
+ - Support show statistics information in the lower right corner when cells are selected
517
+ </details>
395
518
 
396
- - Support shape lock
519
+ <details>
520
+ <summary><strong>v25.3</strong> — Shortcut keys, multi-area paste</summary>
397
521
 
398
- v26.4.2:
522
+ - Support more shortcut keys
523
+ - Support pasting the content copied from Excel to multiple target areas
524
+ </details>
399
525
 
400
- - Support snap to cell area in zoom in/out
526
+ <details>
527
+ <summary><strong>v25.2</strong> — Excel paste, auto operations</summary>
401
528
 
402
- v26.4.3:
529
+ - Support copy/paste from MS-Excel
530
+ - Enhancement for automatic operations — extending blank row/column, page scrolling, etc.
531
+ </details>
403
532
 
404
- - Add boundary check for redaction
533
+ <details>
534
+ <summary><strong>v25.1</strong> — Excel copy/paste</summary>
405
535
 
406
- v26.5:
536
+ - Support copy/paste from MS-Excel
537
+ </details>
407
538
 
408
- - Support add custom buttons in toolbar
539
+ <details>
540
+ <summary><strong>v24.12</strong> — HTML nodes, multi-instance, row/column events</summary>
409
541
 
410
- v26.5.1:
542
+ - Support API to show HTML nodes and interact with HTML nodes at specified cell positions
543
+ - Support pre-check event for row/column delete/insert operations
544
+ - Support row/column insert/delete events for client APIs
545
+ - Support events for updating cells
546
+ - Support multiple instances on one page
547
+ </details>
411
548
 
412
- - Improve date picker
549
+ <details>
550
+ <summary><strong>v24.11</strong> — Rich text display</summary>
413
551
 
414
- v26.5.2:
552
+ - Improve the display of rich text cell values
553
+ </details>
415
554
 
416
- - Improve filter display
417
- - Improve print
555
+ <details>
556
+ <summary><strong>v24.10</strong> Show formulas</summary>
418
557
 
419
- v26.5.3:
558
+ - Support a view option to show formulas
559
+ </details>
420
560
 
421
- - Improve scroll in zoom
561
+ <details>
562
+ <summary><strong>v24.9.1</strong> — Initial release</summary>
422
563
 
423
- v26.6:
564
+ - Fix bug that fail to insert column in the new added worksheet
565
+ - Fix bug that fail to rename worksheet
566
+ - Support lazy loading
567
+ </details>
424
568
 
425
- - Improve redaction feature
569
+ ## Resources
426
570
 
427
- v26.6.1:
571
+ ### Documentation
572
+ - [Developer's Guide — .NET / C#](https://docs.aspose.com/cells/net/aspose-cells-gridjs/)
573
+ - [Developer's Guide — Java](https://docs.aspose.com/cells/java/aspose-cells-gridjs/)
574
+ - [Developer's Guide — Python](https://docs.aspose.com/cells/python-net/aspose-cells-gridjs/)
575
+ - [Client API How-To](https://docs.aspose.com/cells/net/aspose-cells-gridjs/how-to-use-gridjs-client-api/)
428
576
 
429
- - Fix redaction font issue
577
+ ### Product Links
578
+ - [Aspose.Cells Product Page](https://products.aspose.com/cells)
579
+ - [GridJs Online Demo](https://products.aspose.app/cells/editor)
580
+ - [API Reference — .NET / C#](https://reference.aspose.com/cells/net/aspose.cells.gridjs/)
581
+ - [API Reference — Java](https://reference.aspose.com/cells/java/com.aspose.gridjs/)
582
+ - [API Reference — Python](https://reference.aspose.com/cells/python-net/aspose.cellsgridjs/)
583
+ - [Blog](https://blog.aspose.com/categories/aspose.cells-product-family/)
430
584
 
431
- v26.6.2:
585
+ ### Source Code & Samples
586
+ - [.NET Examples](https://github.com/aspose-cells/Aspose.Cells.Grid-for-.NET/tree/main/Examples_GridJs)
587
+ - [Java Examples](https://github.com/aspose-cells/Aspose.Cells.Grid-for-Java/tree/master/Examples.GridJs)
588
+ - [Python Examples](https://github.com/aspose-cells/Aspose.Cells.Grid-for-Python-via-.NET/tree/main/Examples.GridJs)
432
589
 
433
- - Fix redaction transparent view issue
590
+ ### Free Support
591
+ - [Aspose.Cells Forum](https://forum.aspose.com/c/cells) — ask questions, request features, report bugs
434
592
 
435
593
  ## License
436
594
 
437
595
  MIT
438
-
439
- ## Support
440
-
441
- You can ask any question or request features or report bugs using the [Forum](https://forum.aspose.com/c/cells).
442
-
443
- [Product Page](https://products.aspose.com/cells) | [Product Documentation](https://docs.aspose.com/cells/net/aspose-cells-gridjs/) | [Blog](https://blog.aspose.com/category/cells/) |[API Reference](https://reference.aspose.com/cells/net/aspose.cells.gridjs/) | [Source Code Samples](https://github.com/aspose-cells/Aspose.Cells.Grid-for-.NET/tree/main/Examples_GridJs) | [Free Support](https://forum.aspose.com/c/cells)