diff --git a/docz/docs/02-getting-started/01-installation/03-nodejs.md b/docz/docs/02-getting-started/01-installation/03-nodejs.md index 9eb09ca4..a5cf7466 100644 --- a/docz/docs/02-getting-started/01-installation/03-nodejs.md +++ b/docz/docs/02-getting-started/01-installation/03-nodejs.md @@ -47,6 +47,8 @@ new versions are released! ::: +### Legacy Endpoints + :::warning Older releases are technically available on the public npm registry as `xlsx`, diff --git a/docz/docs/03-demos/02-grid/01-xs.md b/docz/docs/03-demos/02-grid/01-xs.md index 8d617795..f2198ef3 100644 --- a/docz/docs/03-demos/02-grid/01-xs.md +++ b/docz/docs/03-demos/02-grid/01-xs.md @@ -14,14 +14,20 @@ With a familiar UI, `x-spreadsheet` is an excellent choice for a modern editor. [Click here for a live standalone integration demo.](pathname:///xspreadsheet/) +:::note + +This demo was last verified on 2023 September 03. + +::: + ## Live Demo -:::note +:::note pass Due to CSS conflicts between the data grid and the documentation generator, features like scrolling may not work as expected. -[The linked demo uses a simple HTML page.](pathname:///xspreadsheet/) +[The standalone demo uses a simple HTML page.](pathname:///xspreadsheet/) ::: @@ -114,5 +120,9 @@ var grid = x_spreadsheet(document.getElementById("gridctr")); #### Additional Features +:::tip pass + This demo barely scratches the surface. The underlying grid component includes many additional features that work with [SheetJS Pro](https://sheetjs.com/pro). + +::: \ No newline at end of file diff --git a/docz/docs/03-demos/02-grid/02-cdg.md b/docz/docs/03-demos/02-grid/02-cdg.md index cae6f7aa..5e726354 100644 --- a/docz/docs/03-demos/02-grid/02-cdg.md +++ b/docz/docs/03-demos/02-grid/02-cdg.md @@ -8,11 +8,17 @@ pagination_next: demos/net/index -After extensive testing, `canvas-datagrid` stood out as a high-performance grid +[Canvas Datagrid](https://canvas-datagrid.js.org/) is a high-performance grid with a straightforward API. [Click here for a live standalone integration demo.](pathname:///cdg/) +:::note + +This demo was last verified on 2023 September 03. + +::: + ## Live Demo :::note @@ -133,5 +139,9 @@ XLSX.writeFile(wb, "SheetJS.xlsx"); #### Additional Features +:::tip pass + This demo barely scratches the surface. The underlying grid component includes many additional features that work with [SheetJS Pro](https://sheetjs.com/pro). + +::: \ No newline at end of file diff --git a/docz/docs/03-demos/03-net/01-network.mdx b/docz/docs/03-demos/03-net/01-network.mdx index 3c8daf08..7ece1de5 100644 --- a/docz/docs/03-demos/03-net/01-network.mdx +++ b/docz/docs/03-demos/03-net/01-network.mdx @@ -773,6 +773,6 @@ Other demos show network operations in special platforms: - [React Native "Fetching Remote Data"](/docs/demos/mobile/reactnative#fetching-remote-data) - [NativeScript "Fetching Remote Files"](/docs/demos/mobile/nativescript#fetching-remote-files) -[^1]: See [`dataType` in `jQuery.ajax`](https://api.jquery.com/jQuery.ajax/#:~:text=the%20%27dataType%27%20parameter.-,dataType,-(default%3A%20Intelligent) in the official jQuery documentation. +[^1]: See [`dataType` in `jQuery.ajax`](https://api.jquery.com/jQuery.ajax/) in the official jQuery documentation. [^2]: See [the official `jquery.binarytransport.js` repo](https://github.com/henrya/js-jquery/tree/master/BinaryTransport) for more details. [^3]: See ["Fluent interface"](https://en.wikipedia.org/wiki/Fluent_interface) on Wikipedia. \ No newline at end of file diff --git a/docz/docs/03-demos/05-mobile/01-reactnative.md b/docz/docs/03-demos/05-mobile/01-reactnative.md index 40cf09b8..1ce14d65 100644 --- a/docz/docs/03-demos/05-mobile/01-reactnative.md +++ b/docz/docs/03-demos/05-mobile/01-reactnative.md @@ -215,11 +215,11 @@ const wb = XLSX.read(ab); :::note -This demo was tested on an Intel Mac on 2023 August 20 with RN `0.72.4`. +The Android demo was last tested on 2023 September 03 with RN `0.72.4`. The +simulator used Android 13 ("Tiramisu") API 33 on a Pixel 3. -The iOS simulator runs iOS 16.2 on an iPhone SE (3rd generation). - -The Android simulator runs Android 12.0 (S) API 31 on a Pixel 3. +The iOS demo was last tested on 2023 September 03 with RN `0.72.4`. The +simulator used iOS 16.4 on an iPhone SE (3rd generation). ::: diff --git a/docz/docs/03-demos/05-mobile/03-quasar.md b/docz/docs/03-demos/05-mobile/03-quasar.md index 63dea30f..c9d22c6d 100644 --- a/docz/docs/03-demos/05-mobile/03-quasar.md +++ b/docz/docs/03-demos/05-mobile/03-quasar.md @@ -178,7 +178,7 @@ cordova plugin add cordova-plugin-wkwebview-engine cordova plugin add cordova-plugin-file ``` -:::note +:::note pass If there is an error `Could not load API for iOS project`, it needs to be reset: diff --git a/docz/docs/03-demos/05-mobile/04-ionic.md b/docz/docs/03-demos/05-mobile/04-ionic.md index dda3eea1..8369cbbb 100644 --- a/docz/docs/03-demos/05-mobile/04-ionic.md +++ b/docz/docs/03-demos/05-mobile/04-ionic.md @@ -57,7 +57,7 @@ npx @capacitor/cli telemetry ## Integration Details -:::caution +:::caution pass The latest version of Ionic uses CapacitorJS. These notes are for Cordova apps. The [CapacitorJS demo](/docs/demos/mobile/capacitor) covers CapacitorJS apps. diff --git a/docz/docs/03-demos/05-mobile/05-capacitor.md b/docz/docs/03-demos/05-mobile/05-capacitor.md index cc8cc3c1..d7252b3a 100644 --- a/docz/docs/03-demos/05-mobile/05-capacitor.md +++ b/docz/docs/03-demos/05-mobile/05-capacitor.md @@ -115,17 +115,31 @@ async function exportFile() { :::note -This demo was tested on an Intel Mac on 2023 April 01 with Capacitor 4.7.3 and -`@capacitor/filesystem` 4.1.4 +The Android demo was last tested on 2023 September 03 with CapacitorJS `5.3.0` +and filesystem `5.1.3` on an emulated Pixel 3 + Android 13 ("Tiramisu") API 33. -The iOS simulator runs iOS 16.2 on an iPhone 14 Pro Max. - -The Android simulator runs Android 12.0 (S) API 31 on a Pixel 3. +The iOS demo was last tested on 2023 September 03 with CapacitorJS `5.3.0` +and filesystem `5.1.3` on an emulated iPhone SE (3rd generation) + iOS 16.4. ::: ### Base Project +0) Follow the official "Environment Setup"[^1] instructions to set up Android +and iOS targets + +:::caution pass + +iOS development is only supported on macOS. + +::: + +
Installation Notes (click to show) + +CapacitorJS requires Java 17. + +
+ 1) Disable telemetry. ```bash @@ -167,22 +181,63 @@ npm run build curl -o src/App.svelte -L https://docs.sheetjs.com/cap/App.svelte ``` +### Android + +6) Create Android app + +```bash +npm i --save @capacitor/android +npx cap add android +``` + +7) Enable file reading and writing in the Android app. + +The following lines must be added to `android/app/src/main/AndroidManifest.xml` +after the `Permissions` comment: + +```xml title="android/app/src/main/AndroidManifest.xml (add to file)" + + + + + + + + +``` + +8) Run the app in the simulator + +```bash +npm run build +npx cap sync +npx cap run android +``` + +9) Test the app + +Open the app and observe that presidents are listed in the table. + +Touch "Export XLSX" and the emulator will ask for permission: + +Tap "Allow" and a popup will be displayed with a path. + +To see the generated file, switch to the "Files" app in the simulator, tap the +`≡` icon and tap "Documents". Tap "Documents" folder to find `SheetJSCap.xlsx`. + ### iOS -6) Follow the [React Native demo](/docs/demos/mobile/reactnative#demo) to -ensure the iOS simulator is ready. - -7) Create iOS app +10) Create iOS app ```bash npm i --save @capacitor/ios npx cap add ios ``` -8) Enable file sharing and make the documents folder visible in the iOS app. +11) Enable file sharing and make the documents folder visible in the iOS app. The following lines must be added to `ios/App/App/Info.plist`: -```xml title="ios/App/App/Info.plist" +```xml title="ios/App/App/Info.plist (add to file)" @@ -196,7 +251,7 @@ The following lines must be added to `ios/App/App/Info.plist`: (The root element of the document is `plist` and it contains one `dict` child) -9) Run the app in the simulator +12) Run the app in the simulator ```bash npm run build @@ -204,7 +259,7 @@ npx cap sync npx cap run ios ``` -10) Test the app +13) Test the app Open the app and observe that presidents are listed in the table. @@ -213,48 +268,4 @@ Touch "Export XLSX" and a popup will be displayed. To see the generated file, switch to the "Files" app in the simulator and look for `SheetJSCap.xlsx` in "On My iPhone" > "`sheetjs-cap`" -### Android - -11) Follow the [React Native demo](/docs/demos/mobile/reactnative#demo) to -ensure the Android simulator is ready. - -12) Create Android app - -```bash -npm i --save @capacitor/android -npx cap add android -``` - -13) Enable file reading and writing in the Android app. -The following lines must be added to `android/app/src/main/AndroidManifest.xml` -after the `Permissions` comment: - -```xml title="android/app/src/main/AndroidManifest.xml" - - - - - - - - -``` - -14) Run the app in the simulator - -```bash -npm run build -npx cap sync -npx cap run android -``` - -15) Test the app - -Open the app and observe that presidents are listed in the table. - -Touch "Export XLSX" and the emulator will ask for permission: - -Tap "Allow" and a popup will be displayed with a path. - -To see the generated file, switch to the "Files" app in the simulator, tap the -`≡` icon and tap "Documents". Tap "Documents" folder to find `SheetJSCap.xlsx`. +[^1]: See ["Environment Setup"](https://capacitorjs.com/docs/getting-started/environment-setup) in the CapacitorJS documentation. \ No newline at end of file diff --git a/docz/docs/03-demos/05-mobile/06-flutter.md b/docz/docs/03-demos/05-mobile/06-flutter.md index 13c8e7cf..da0f8d8f 100644 --- a/docz/docs/03-demos/05-mobile/06-flutter.md +++ b/docz/docs/03-demos/05-mobile/06-flutter.md @@ -197,12 +197,13 @@ class SheetJSFlutterState extends State { :::note -This demo was tested on an Intel Mac on 2023-08-18 with Flutter 3.13.0, Dart -3.1.0, and `flutter_js` 0.8.0. +The Android demo was last tested on 2023 September 03 with Flutter `3.13.2`. The +simulator used Android 13 ("Tiramisu") API 33 on a Pixel 3. -The iOS simulator runs iOS 16.2 on an iPhone 14 Pro Max. +The iOS demo was last tested on 2023 September 03 with Flutter `3.13.2`. The +simulator used iOS 16.4 on an iPhone SE (3rd generation). -The Android simulator runs Android 12.0 (S) API 31 on a Pixel 3. +Both tests used Dart 3.1.0 and Flutter JS plugin version `0.8.0`. ::: @@ -257,7 +258,7 @@ Run `flutter emulators` and check for both `ios` and `android` emulators: ``` apple_ios_simulator • iOS Simulator • Apple • ios -Pixel_3_API_31 • Pixel 3 API 31 • Google • android +Pixel_3_API_33 • Pixel 3 API 33 • Google • android ``` 1) Disable telemetry. @@ -278,14 +279,76 @@ flutter create sheetjs_flutter cd sheetjs_flutter ``` -3) Open the iOS simulator. +3) Start the Android emulator. -4) While the iOS simulator is open, start the application: +
Details (click to hide) + +**Android Studio** + +In Android Studio, click "More actions" > "Virtual Device Manager". Look for the +emulated device in the list and click the ▶ button to play. + +**Command Line** + +List the available emulators with `flutter emulators`: + +``` +% flutter emulators +2 available emulators: + +apple_ios_simulator • iOS Simulator • Apple • ios +Pixel_3_API_33 • Pixel 3 API 33 • Google • android +^^^^^^^^^^^^^^--- the first column is the name +``` + +The first column shows the name that should be passed to `emulator -avd`. In a +previous test, the name was `Pixel_3_API_33` and the launch command was: + +``` +% emulator -avd Pixel_3_API_33 +``` + +
+ +4) While the Android emulator is open, start the application: ```bash flutter run ``` +
If emulator is not detected (click to show) + +In some test runs, `flutter run` did not automatically detect the emulator. + +Run `flutter -v -d sheetjs run` and the command will fail. Inspect the output: + +```text title="Command output" +// highlight-next-line +[ +6 ms] No supported devices found with name or id matching 'sheetjs'. +[ ] The following devices were found: +... +// highlight-next-line +[ +26 ms] sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 13 (API 33) (emulator) +[ ] macOS (desktop) • macos • darwin-arm64 • macOS 13.5.1 22G90 darwin-arm64 +... +``` + +Search the output for `sheetjs`. After that line, search for the emulator list. +One of the lines will correspond to the running emulator: + +``` +[ +26 ms] sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 13 (API 33) (emulator) + ^^^^^^^^^^^^^--- the second column is the name +``` + +The second column is the device name. Assuming the name is `emulator-5554`, run: + +```bash +flutter -v -d emulator-5554 run +``` + +
+ Once the app loads, stop the terminal process and close the simulator. 5) Install Flutter / Dart dependencies: @@ -323,38 +386,11 @@ cd ..`} curl -L -o lib/main.dart https://docs.sheetjs.com/flutter/main.dart ``` -### iOS - -9) Start the iOS simulator again. - -10) Launch the app: - -```bash -flutter run -``` - -The app fetches , parses, converts data to an -array of arrays, and presents the data in a Flutter `Table` widget. - -11) Close the iOS simulator. - ### Android -12) Start the Android emulator with `emulator -avd name_of_device`. The actual -emulator name can be found with `flutter emulators`: +9) Start the Android emulator using the same instructions as Step 3. -``` -% flutter emulators -2 available emulators: - -apple_ios_simulator • iOS Simulator • Apple • ios -Pixel_3_API_31 • Pixel 3 API 31 • Google • android -^^^^^^^^^^^^^^--- the first column is the name - -% emulator -avd Pixel_3_API_31 -``` - -13) Launch the app: +10) Launch the app: ```bash flutter run @@ -387,13 +423,27 @@ Searching for `minSdkVersion` should reveal the following line: `flutter.minSdkVersion` should be replaced with `21`: -```diff title="android\app\build.gradle (diff)" -- minSdkVersion flutter.minSdkVersion -+ minSdkVersion 21 +```text title="android\app\build.gradle" + minSdkVersion 21 ``` ::: +11) Close the Android emulator. + +### iOS + +12) Start the iOS simulator. + +13) Launch the app: + +```bash +flutter run +``` + +The app fetches , parses, converts data to an +array of arrays, and presents the data in a Flutter `Table` widget. + [^1]: is the official site for the Dart Programming Language. [^2]: is the official site for the Flutter Framework. [^3]: [The `flutter_js` package](https://pub.dev/packages/flutter_js) is hosted on the Dart package repository. diff --git a/docz/docs/03-demos/06-desktop/01-electron.md b/docz/docs/03-demos/06-desktop/01-electron.md index ff2a19be..709c0df7 100644 --- a/docz/docs/03-demos/06-desktop/01-electron.md +++ b/docz/docs/03-demos/06-desktop/01-electron.md @@ -180,7 +180,15 @@ function exportFile(workbook) { :::note -This demo was tested on 2023 February 20 with Electron 23.0.0. +This demo was tested in the following environments: + +| OS and Version | Arch | Electron | Date | +|:---------------|:-----|:---------|:-----------| +| macOS 13.5.1 | ARM | `26.1.0` | 2023-09-03 | +| macOS 13.5.1 | x64 | `26.1.0` | 2023-09-03 | +| Windows 10 | x64 | `26.1.0` | 2023-09-03 | +| Linux (HoloOS) | x64 | `26.1.0` | 2023-09-03 | +| Linux (Debian) | ARM | `26.1.0` | 2023-09-03 | ::: @@ -218,7 +226,11 @@ curl -LO https://docs.sheetjs.com/electron/index.html curl -LO https://docs.sheetjs.com/electron/index.js ``` -2) Run `npm i` to install dependencies. +2) Install dependencies: + +```bash +npm install +``` 3) To verify the app works, run in the test environment: @@ -226,8 +238,7 @@ curl -LO https://docs.sheetjs.com/electron/index.js npx -y electron . ``` -The app will show and you should be able to verify reading and writing by using -the relevant buttons to open files and clicking the export button. +The app will show. 4) To build a standalone app, run the builder: @@ -235,8 +246,52 @@ the relevant buttons to open files and clicking the export button. npm run make ``` -This will generate the standalone app in the `out\sheetjs-electron-...` folder. -For a recent Intel Mac, the path will be `out/sheetjs-electron-darwin-x64/` +This will create a package in the `out\make` folder. + +:::caution pass + +On Linux, the packaging step may require additional dependencies[^1] + +::: + +**Testing** + +5) Download [the test file `pres.numbers`](https://sheetjs.com/pres.numbers) + +6) Re-launch the application in the test environment: + +```bash +npx -y electron . +``` + +_Electron API_ + +7) Click "Click here to select a file from your computer". With the file picker, +navigate to the Downloads folder and select `pres.numbers`. + +The application should show data in a table. + +8) Click "Export Data!" and click "Save" in the popup. By default, it will try +to write to `Untitled.xls` in the Downloads folder. + +The app will show a popup once the data is exported. Open the file in a +spreadsheet editor and compare the data to the table shown in the application. + +_Drag and Drop_ + +9) Close the application, end the terminal process and re-launch (see step 6) + +10) Open the Downloads folder in a file explorer or finder window. + +11) Click and drag the `pres.numbers` file from the Downloads folder to the +bordered "Drop a spreadsheet file" box. The file data should be displayed. + +_File Input Element_ + +12) Close the application, end the terminal process and re-launch (see step 6) + +13) Click "Choose File". With the file picker, navigate to the Downloads folder +and select `pres.numbers`. ## Electron Breaking Changes @@ -263,3 +318,5 @@ Electron 14+ must use `@electron/remote` instead of `remote`. An `initialize` call is required to enable Developer Tools in the window. ::: + +[^1]: See ["Makers"](https://www.electronforge.io/config/makers) in the Electron Forge documentation. \ No newline at end of file diff --git a/docz/docs/03-demos/07-data/29-pouchdb.md b/docz/docs/03-demos/07-data/29-pouchdb.md index 23a6a00d..b943b3c5 100644 --- a/docz/docs/03-demos/07-data/29-pouchdb.md +++ b/docz/docs/03-demos/07-data/29-pouchdb.md @@ -1,5 +1,6 @@ --- -title: PouchDB +title: Sheets in PouchDB +sidebar_label: PouchDB pagination_prev: demos/desktop/index pagination_next: demos/local/index sidebar_custom_props: @@ -9,15 +10,79 @@ sidebar_custom_props: import current from '/version.js'; import CodeBlock from '@theme/CodeBlock'; -PouchDB is a pure JS database with built-in synchronization features. +[PouchDB](https://pouchdb.com/) is a pure JavaScript database with built-in +synchronization features and offline support. + +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +This demo uses PouchDB and SheetJS to export database snapshots to spreadsheets +and import bulk data from workbooks. We'll explore the subtleties of processing +arrays of objects to mesh with both libraries. + +The ["Complete Example"](#complete-example) section imbues the official "Todos" +demo with the ability to export the list to XLSX workbooks. + +:::note + +This demo was last tested on 2023 September 04 against PouchDB 8.0.1 standalone +browser script in Chrome 116. + +::: ## Integration Details -`Database#allDocs` is the standard approach for bulk data export. The generated +SheetJS CE offers standalone scripts, NodeJS modules, ESM modules, and other +scripts. The ["Installation"](/docs/getting-started/installation) section covers +a number of common deployment scenarios. + +PouchDB ships with standalone scripts for browser use and NodeJS modules for use +in server-side scripts[^1]. + +The `PouchDB` constructor returns a `Database` object. + +#### Importing Data + +`Database#bulkDocs`[^2] is the standard approach for bulk data import. The method +accepts "arrays of objects" that can be generated through the SheetJS +`sheet_to_json`[^3] method. + +If rows do not include the `_id` parameter, the database will automatically +assign an ID per row. It is strongly recommended to generate the `_id` directly. + +This method starts from a SheetJS workbook object[^4] and uses data from the +first sheet. `read` and `readFile`[^5] can generate workbook objects from files. + +```js +async function push_first_sheet_to_pouchdb(db, wb, _id_) { + /* get first worksheet */ + const ws = wb.Sheets[wb.SheetNames[0]]; + + /* generate array of arrays */ + const aoo = XLSX.utils.sheet_to_json(ws); + + /* if a prefix is specified, add a unique _id to each row based on index */ + if(typeof _id_ == "string") aoo.forEach((row, idx) => row._id = _id_ + idx); + + /* perform query */ + return await db.bulkDocs(aoo); +} +``` + +:::note pass + +Existing data can be erased with `Database#destroy`. + +::: + +#### Exporting Data + +`Database#allDocs`[^6] is the standard approach for bulk data export. Generated row objects have additional `_id` and `_rev` keys that should be removed. -Nested objects must be flattened. The ["Export Tutorial"](/docs/getting-started/examples/export) -includes an example of constructing a simple array. +After removing the PouchDB internal fields, the SheetJS `json_to_sheet`[^7] +method can generate a worksheet. Other utility functions[^8] can construct a +workbook. The workbook can be exported with the SheetJS `writeFile`[^9] method: ```js function export_pouchdb_to_xlsx(db) { @@ -42,6 +107,17 @@ function export_pouchdb_to_xlsx(db) { } ``` +:::caution pass + +`json_to_sheet` expects an array of "flattened" objects where each value is a +simple data type that can be stored in a spreadsheet cell. If document objects +have a nested structure, integration code should post-process the data. + +["Export Tutorial"](/docs/getting-started/examples/export#reshaping-the-array) +processes data from an API and computes a few text values from the nested data. + +::: + ## Complete Example 0) Download the "Working Version" from the Getting Started guide. @@ -75,16 +151,28 @@ cd getting-started-todo-master
`} -3) Just before the end of `app.js`, add a `click` event listener: +3) Near the end of `index.html`, look for a script tag referencing a CDN: -```js title="app.js" +```html title="index.html" + +``` + +Upgrade PouchDB by changing the `src` attribute to the production build[^10]: + +```html + +``` + +4) Just before the end of `js/app.js`, add a `click` event listener: + +```js title="js/app.js" if (remoteCouch) { sync(); } // highlight-start document.getElementById("xport").addEventListener("click", function() { - db.allDocs({include_docs: true}, function(err, doc) { + db.allDocs({include_docs: true, descending: true}, function(err, doc) { const aoo = doc.rows.map(r => { const { _id, _rev, ... rest } = r.doc; return rest; @@ -98,11 +186,57 @@ cd getting-started-todo-master })(); ``` -4) Start a local web server: +:::info pass + +The demo UI reads the todo items in descending order: + +```js title="js/app.js" + //------------------------------VVVVVVVVVVVVVVVV (descending order) + db.allDocs({include_docs: true, descending: true}, function(err, doc) { + redrawTodosUI(doc.rows); + }); +``` + +The new callback function also specifies `descending: true` to ensure that the +order of todo items in the export matches the list displayed in the webpage. + +::: + +5) Start a local web server: ```bash npx http-server . ``` -Access `http://localhost:8080` from your browser. Add a few items and click -the "Export!" button to generate a new file. +The command will display a URL (typically `http://localhost:8080`) which can be +opened in a web browser. + +**Testing** + +6) Access the URL from step 5 with a web browser. + +7) Add two items "Sheet" and "js". Mark "Sheet" as completed. The page should +look like the following screenshot: + +![todos screenshot](pathname:///pouchdb/todos.png) + +8) Click the "Export!" text at the top of the page. The site should create an +export named "SheetJSPouch.xlsx" + +9) Open the file in a spreadsheet editor. It should match the following table: + +| title | completed | +|:------|:----------| +| Sheet | TRUE | +| js | FALSE | + +[^1]: See ["Setting up PouchDB"](https://pouchdb.com/guides/setup-pouchdb.html) in the PouchDB documentation. +[^2]: See ["Create/update a batch of documents"](https://pouchdb.com/api.html#batch_create) in the PouchDB API documentation +[^3]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) +[^4]: See ["SheetJS Data Model"](/docs/csf) +[^5]: See [`read` in "Reading Files"](/docs/api/parse-options) +[^6]: See ["Fetch a batch of documents"](https://pouchdb.com/api.html#batch_fetch) in the PouchDB API documentation +[^7]: See [`json_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-objects-input) +[^8]: See ["Workbook Helpers" in "Utilities"](/docs/api/utilities/wb) for details on `book_new` and `book_append_sheet`. +[^9]: See [`writeFile` in "Writing Files"](/docs/api/write-options) +[^10]: The ["Quick Start" section of "Download"](https://pouchdb.com/download.html#file) in the PouchDB website describes the recommended CDN for PouchDB scripts. \ No newline at end of file diff --git a/docz/docs/03-demos/09-cloud/22-airtable.md b/docz/docs/03-demos/09-cloud/22-airtable.md index 0f4f11e6..0e0f5762 100644 --- a/docz/docs/03-demos/09-cloud/22-airtable.md +++ b/docz/docs/03-demos/09-cloud/22-airtable.md @@ -7,13 +7,28 @@ pagination_next: demos/extensions/index import current from '/version.js'; import CodeBlock from '@theme/CodeBlock'; +[Airtable](https://airtable.com/) is a collaborative dataset hosting service. + +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +This demo uses SheetJS to properly exchange data with spreadsheet files. We'll +explore how to use the `airtable` NodeJS library and SheetJS in two data flows: + +- "Exporting data": Data in Airtable will be pulled into an array of objects and +exported to XLSB spreadsheets using SheetJS libraries. + +- "Importing data": Data in an XLSX spreadsheet will be parsed using SheetJS +libraries and appended to a dataset in Airtable + + +## NodeJS Integration + Airtable recommends Personal Access Tokens for interacting with their API. When fetching data from the API, the result will include an array of row objects that can be converted to a worksheet with `XLSX.utils.json_to_sheet`. The API methods to write data will accept row objects generated by `XLSX.utils.sheet_to_json`. -## NodeJS Integration - The main module is `airtable` and can be installed with `npm`: {`\ @@ -52,7 +67,7 @@ async function airtable_to_worksheet(table) { } ``` -:::caution +:::caution pass The results are not guaranteed to be sorted. The official API includes options for sorting by fields. @@ -83,16 +98,16 @@ async function airtable_load_worksheet(table, worksheet) { :::note -This demo was last tested on 2023 February 15. At the time, it was possible to -create a free account with API access. +This demo was last tested on 2023 September 03. At the time, free accounts +included limited API access. ::: -0) Create a free Airtable account. +0) Create a free Airtable account and verify the email address. ### Personal Access Token -:::note +:::note pass In the past, Airtable offered API keys. They are slated to deprecate API keys in January 2024. They recommend "Personal Access Tokens" for operations. @@ -137,9 +152,9 @@ the first part after the `.com` will be the workspace name. ### Exporting Data -8) Save the following to `read.js`: +8) Save the following to `SheetJSAirtableRead.js`: -```js title="read.js" +```js title="SheetJSAirtableRead.js" const Airtable = require("airtable"), XLSX = require("xlsx"); // highlight-start /* replace the value with the personal access token */ @@ -161,12 +176,23 @@ const base = "app..."; 9) Replace the values in the highlighted lines with the PAT and workspace name. -10) Run `node read.js`. The script should write `SheetJSAirtable.xlsb`. The file -can be opened in Excel. +10) Install dependencies: + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz airtable`} + + +11) Run the script: + +```bash +node SheetJSAirtableRead.js +``` + +The script should write `SheetJSAirtable.xlsb`. The file can be opened in Excel. ### Importing Data -11) Create a file `SheetJSAirpend.xlsx` with some new records in sheet `Sheet1`: +12) Create a file `SheetJSAirpend.xlsx` with some new records in sheet `Sheet1`: ![Records to append](pathname:///airtable/airpend.png) @@ -178,9 +204,9 @@ Name,Index Someone Else,47 ``` -12) Save the following to `write.js`: +13) Save the following to `SheetJSAirtableWrite.js`: -```js title="write.js" +```js title="SheetJSAirtableWrite.js" const Airtable = require("airtable"), XLSX = require("xlsx"); // highlight-start /* replace the value with the personal access token */ @@ -198,8 +224,20 @@ const base = "app..."; })(); ``` -13) Replace the values in the highlighted lines with the PAT and workspace name. +14) Replace the values in the highlighted lines with the PAT and workspace name. -14) Run `node write.js`. Open Airtable and verify the new row: +15) Install dependencies: + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz airtable`} + + +16) Run the script: + +```bash +node SheetJSAirtableWrite.js +``` + +Open Airtable and verify the new row was added: ![Final Result in Airtable](pathname:///airtable/post.png) \ No newline at end of file diff --git a/docz/docs/03-demos/10-extensions/01-extendscript.md b/docz/docs/03-demos/32-extensions/01-extendscript.md similarity index 100% rename from docz/docs/03-demos/10-extensions/01-extendscript.md rename to docz/docs/03-demos/32-extensions/01-extendscript.md diff --git a/docz/docs/03-demos/10-extensions/02-chromium.md b/docz/docs/03-demos/32-extensions/02-chromium.md similarity index 100% rename from docz/docs/03-demos/10-extensions/02-chromium.md rename to docz/docs/03-demos/32-extensions/02-chromium.md diff --git a/docz/docs/03-demos/10-extensions/03-excelapi.md b/docz/docs/03-demos/32-extensions/03-excelapi.md similarity index 87% rename from docz/docs/03-demos/10-extensions/03-excelapi.md rename to docz/docs/03-demos/32-extensions/03-excelapi.md index 2c22348f..6ca68a9e 100644 --- a/docz/docs/03-demos/10-extensions/03-excelapi.md +++ b/docz/docs/03-demos/32-extensions/03-excelapi.md @@ -7,7 +7,7 @@ pagination_next: demos/bigdata/index import current from '/version.js'; import CodeBlock from '@theme/CodeBlock'; -:::info +:::info pass This demo focuses on the JavaScript API included with Excel. For reading and writing Excel files, [other demos](/docs/demos/) cover a wide variety of use cases @@ -30,7 +30,7 @@ Function parameters are covered in the official Office JavaScript API docs. :::note -This demo was last tested on 2023 April 20 against Excel 365 (version 2303) +This demo was last tested on 2023 September 03 against Excel 365 (version 2308) ::: @@ -87,7 +87,17 @@ async function extern(url) { - Open File Explorer - Select the address bar and enter `%LOCALAPPDATA%\Microsoft\Office\16.0\Wef` -- Delete `CustomFunctions` and empty Recycle Bin. +- Delete the `CustomFunctions` folder (if it exists) and empty Recycle Bin. + +:::caution pass + +**This will delete all custom functions associated with the user account!** + +To preserve the custom functions on the user account, rename the existing folder +to `CustomFunctionsBackup` before testing and rename back to `CustomFunctions` +after testing is finished. + +::: 1) Install [NodeJS LTS](https://nodejs.org/en/download/). @@ -158,7 +168,7 @@ function version() { Excel window (do not save the Excel file). Re-run `npm start`. 10) In the new Excel window, enter the formula `=SHEETJS.VERSION()` in cell -`E1`. You should see something similar to the following screenshot: +`D1`. You should see something similar to the following screenshot: ![`SHEETJS.VERSION` output](pathname:///xlapi/xlvers.png) @@ -168,7 +178,7 @@ This indicates that the SheetJS library has been loaded. 11) Add the following code snippet to `src\functions\functions.js`: -```js src\functions\functions.js +```js title="src\functions\functions.js (add to end)" /** * Download file and write data * @customfunction @@ -201,7 +211,7 @@ Excel window (do not save the Excel file). Re-run `npm start`. formula `=SHEETJS.EXTERN(D1)` in cell `D2` and press Enter. Excel should pull in the data and generate a dynamic array. -:::note +:::tip pass [SheetJS Pro](https://sheetjs.com/pro) offers additional features that can be used in Excel Custom Functions and Add-ins diff --git a/docz/docs/03-demos/10-extensions/04-gsheet.md b/docz/docs/03-demos/32-extensions/04-gsheet.md similarity index 100% rename from docz/docs/03-demos/10-extensions/04-gsheet.md rename to docz/docs/03-demos/32-extensions/04-gsheet.md diff --git a/docz/docs/03-demos/10-extensions/06-osa.md b/docz/docs/03-demos/32-extensions/06-osa.md similarity index 99% rename from docz/docs/03-demos/10-extensions/06-osa.md rename to docz/docs/03-demos/32-extensions/06-osa.md index 2f792ad0..541b93b4 100644 --- a/docz/docs/03-demos/10-extensions/06-osa.md +++ b/docz/docs/03-demos/32-extensions/06-osa.md @@ -20,7 +20,7 @@ available as a global. A JS stub can expose methods from AppleScript scripts. :::note -This demo was last tested on 2023 April 18 in macOS Monterey. +This demo was last tested on 2023-09-03 in macOS Ventura. ::: diff --git a/docz/docs/03-demos/10-extensions/09-mathematica.md b/docz/docs/03-demos/32-extensions/09-mathematica.md similarity index 100% rename from docz/docs/03-demos/10-extensions/09-mathematica.md rename to docz/docs/03-demos/32-extensions/09-mathematica.md diff --git a/docz/docs/03-demos/10-extensions/_category_.json b/docz/docs/03-demos/32-extensions/_category_.json similarity index 63% rename from docz/docs/03-demos/10-extensions/_category_.json rename to docz/docs/03-demos/32-extensions/_category_.json index be66d802..cd43a7bf 100644 --- a/docz/docs/03-demos/10-extensions/_category_.json +++ b/docz/docs/03-demos/32-extensions/_category_.json @@ -1,4 +1,4 @@ { "label": "App Extensions", - "position": 10 + "position": 32 } \ No newline at end of file diff --git a/docz/docs/03-demos/10-extensions/index.md b/docz/docs/03-demos/32-extensions/index.md similarity index 100% rename from docz/docs/03-demos/10-extensions/index.md rename to docz/docs/03-demos/32-extensions/index.md diff --git a/docz/docs/03-demos/42-engines/02_v8.md b/docz/docs/03-demos/42-engines/02_v8.md index c135caae..f484069f 100644 --- a/docz/docs/03-demos/42-engines/02_v8.md +++ b/docz/docs/03-demos/42-engines/02_v8.md @@ -679,7 +679,7 @@ cl /MT /I..\v8\v8\ /I..\v8\v8\include sheetjs.v8.cc /GR- v8_monolith.lib Advapi3 ```bash -cl /MT /I..\v8\v8\ /I..\v8\v8\include sheetjs.v8.cc /GR- v8_monolith.lib Advapi32.lib Winmm.lib Dbghelp.lib /std:c++17 /DV8_COMPRESS_POINTERS=1 /DV8_ENABLE_SANDBOX /link /out:sheetjs.v8.exe /LIBPATH:..\v8\v8\out.gn\x64.release.sample\obj\ +.\sheetjs.v8.exe pres.numbers ``` diff --git a/docz/static/electron/package.json b/docz/static/electron/package.json index 66f0235a..323e2c01 100644 --- a/docz/static/electron/package.json +++ b/docz/static/electron/package.json @@ -1,10 +1,12 @@ { "name": "sheetjs-electron", "author": "sheetjs", + "description": "Spreadsheet Data Import and Export with SheetJS + Electron", + "license": "Apache-2.0", "version": "0.0.0", "main": "main.js", "dependencies": { - "@electron/remote": "2.0.9", + "@electron/remote": "2.0.11", "xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz" }, "scripts": { @@ -13,12 +15,12 @@ "make": "electron-forge make" }, "devDependencies": { - "@electron-forge/cli": "6.0.5", - "@electron-forge/maker-deb": "6.0.5", - "@electron-forge/maker-rpm": "6.0.5", - "@electron-forge/maker-squirrel": "6.0.5", - "@electron-forge/maker-zip": "6.0.5", - "electron": "23.0.0" + "@electron-forge/cli": "6.4.1", + "@electron-forge/maker-deb": "6.4.1", + "@electron-forge/maker-rpm": "6.4.1", + "@electron-forge/maker-squirrel": "6.4.1", + "@electron-forge/maker-zip": "6.4.1", + "electron": "26.1.0" }, "config": { "forge": { diff --git a/docz/static/pouchdb/todos.png b/docz/static/pouchdb/todos.png new file mode 100644 index 00000000..3c6d4eae Binary files /dev/null and b/docz/static/pouchdb/todos.png differ diff --git a/docz/static/xlapi/xlvers.png b/docz/static/xlapi/xlvers.png index 4bb185e4..7eddbc50 100644 Binary files a/docz/static/xlapi/xlvers.png and b/docz/static/xlapi/xlvers.png differ