diff --git a/docz/docs/03-demos/03-net/01-network.mdx b/docz/docs/03-demos/03-net/01-network.mdx index 1abb5794..491eaf9c 100644 --- a/docz/docs/03-demos/03-net/01-network.mdx +++ b/docz/docs/03-demos/03-net/01-network.mdx @@ -7,6 +7,8 @@ title: HTTP Network Requests +import current from '/version.js'; +import CodeBlock from '@theme/CodeBlock'; `XMLHttpRequest` and `fetch` browser APIs enable binary data transfer between web browser clients and web servers. Since this library works in web browsers, @@ -376,6 +378,7 @@ function SheetJSAxiosDL() { /* Fetch and update HTML */ React.useEffect(async() => { + if(typeof axios != "function") return setHTML("ReferenceError: axios is not defined"); /* Fetch file */ const res = await axios("https://sheetjs.com/pres.numbers", {responseType: "arraybuffer"}); @@ -479,6 +482,8 @@ function SheetJSSuperAgentDL() { /* Fetch and update HTML */ React.useEffect(async() => { + if(typeof superagent == "undefined" || typeof superagent.get != "function") + return setHTML("ReferenceError: superagent is not defined"); /* Fetch file */ superagent .get("https://sheetjs.com/pres.numbers") @@ -557,7 +562,7 @@ These examples show how to download data in NodeJS. The `https` module provides a low-level `get` method for HTTPS GET requests: -```js +```js title="SheetJSHTTPSGet.js" var https = require("https"), XLSX = require("xlsx"); https.get('https://sheetjs.com/pres.numbers', function(res) { @@ -573,6 +578,26 @@ https.get('https://sheetjs.com/pres.numbers', function(res) { }); ``` +
Complete Example (click to show) + +:::note + +This demo was last tested on 2023 May 21 against NodeJS `18.16.0` + +::: + +1) Install the [NodeJS module](/docs/getting-started/installation/nodejs) + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`} + + +2) Copy the `SheetJSHTTPSGet.js` code snippet to a file `SheetJSHTTPSGet.js` + +3) Run `node SheetJSHTTPSGet.js`. It will print CSV contents of the test file. + +
+ ### fetch The `fetch` implementation has the same return types as the browser version: @@ -587,6 +612,45 @@ async function parse_from_url(url) { } ``` +
Complete Example (click to show) + +:::note + +This demo was last tested on 2023 May 21 against NodeJS `18.16.0` + +::: + +1) Install the [NodeJS module](/docs/getting-started/installation/nodejs) + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`} + + +2) Save the following to `SheetJSFetch.js`: + +```js title="SheetJSFetch.js" +var XLSX = require("xlsx"); + +async function parse_from_url(url) { + const res = await fetch(url); + if(!res.ok) throw new Error("fetch failed"); + const ab = await res.arrayBuffer(); + const workbook = XLSX.read(ab); + return workbook; +} + +(async() => { + const wb = await parse_from_url('https://sheetjs.com/pres.numbers'); + /* print the first worksheet to console */ + var ws = wb.Sheets[wb.SheetNames[0]]; + console.log(XLSX.utils.sheet_to_csv(ws)); +})(); +``` + +3) Run `node SheetJSFetch.js`. It will print CSV contents of the test file. + +
+ ### Wrapper Libraries The latest releases of NodeJS support `fetch` natively. Before `fetch` support @@ -602,7 +666,7 @@ was added to the platform, third party modules wrapped the native APIs. Setting the option `encoding: null` passes raw buffers: -```js +```js title="SheetJSRequest.js" var XLSX = require('xlsx'), request = require('request'); var url = 'https://sheetjs.com/pres.numbers'; @@ -621,12 +685,32 @@ request(url, {encoding: null}, function(err, res, data) { }); ``` +
Complete Example (click to show) + +:::note + +This demo was last tested on 2023 May 21 against request `2.88.2` + +::: + +1) Install the [NodeJS module](/docs/getting-started/installation/nodejs) + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz request@2.88.2`} + + +2) Copy the `SheetJSRequest.js` code snippet to a file `SheetJSRequest.js` + +3) Run `node SheetJSRequest.js`. It will print CSV contents of the test file. + +
+ #### axios When the `responseType` is `"arraybuffer"`, `axios` actually captures the data in a NodeJS Buffer. `XLSX.read` will transparently handle Buffers: -```js +```js title="SheetJSAxios.js" const XLSX = require("xlsx"), axios = require("axios"); async function workbook_dl_axios(url) { @@ -636,3 +720,48 @@ async function workbook_dl_axios(url) { return workbook; } ``` + +
Complete Example (click to show) + +:::note + +This demo was last tested on 2023 May 21 against Axios `1.4.0` + +::: + +1) Install the [NodeJS module](/docs/getting-started/installation/nodejs) + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz axios@1.4.0`} + + +2) Save the following to `SheetJSAxios.js`: + +```js title="SheetJSAxios.js" +const XLSX = require("xlsx"), axios = require("axios"); + +async function workbook_dl_axios(url) { + const res = await axios(url, {responseType:'arraybuffer'}); + /* at this point, res.data is a Buffer */ + const workbook = XLSX.read(res.data); + return workbook; +} + +(async() => { + const wb = await workbook_dl_axios('https://sheetjs.com/pres.numbers'); + /* print the first worksheet to console */ + var ws = wb.Sheets[wb.SheetNames[0]]; + console.log(XLSX.utils.sheet_to_csv(ws)); +})(); +``` + +3) Run `node SheetJSAxios.js`. It will print CSV contents of the test file. + +
+ +## Other Platforms + +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) diff --git a/docz/docs/03-demos/05-mobile/02-nativescript.md b/docz/docs/03-demos/05-mobile/02-nativescript.md index a0a3c56e..1e68cc63 100644 --- a/docz/docs/03-demos/05-mobile/02-nativescript.md +++ b/docz/docs/03-demos/05-mobile/02-nativescript.md @@ -20,11 +20,11 @@ The "Complete Example" creates an app that looks like the screenshots below: Android -![iOS screenshot](pathname:///mobile/nsios.png) +![iOS screenshot](pathname:///nativescript/ios.png) -![Android screenshot](pathname:///mobile/nsand.png) +![Android screenshot](pathname:///nativescript/and.png) @@ -49,12 +49,13 @@ function get_url_for_filename(filename: string): string { } ``` -#### Reading data +### Reading Local Files `getFileAccess().readBufferAsync` can read data: ```ts import { getFileAccess } from '@nativescript/core'; +import { read } from 'xlsx'; /* find appropriate path */ const url = get_url_for_filename("SheetJSNS.xls"); @@ -66,13 +67,14 @@ const ab: ArrayBuffer = await getFileAccess().readBufferAsync(url); const wb = read(ab); ``` -#### Writing data +### Writing Local Files `getFileAccess().writeBufferAsync` can write data. iOS supports `Uint8Array` directly but Android requires a true array of numbers: ```ts import { getFileAccess } from '@nativescript/core'; +import { write } from 'xlsx'; /* find appropriate path */ const url = get_url_for_filename("SheetJSNS.xls"); @@ -84,15 +86,40 @@ const u8: Uint8Array = write(wb, { bookType: 'xls', type: 'binary' }); await getFileAccess().writeBufferAsync(url, global.isAndroid ? (Array.from(u8) as any) : u8); ``` +### Fetching Remote Files + +`getFile` from `@nativescript/core/http` can download files. After storing the +file in a temporary folder, `getFileAccess().readBufferAsync` can read the data: + +```ts +import { knownFolders, path, getFileAccess } from '@nativescript/core' +import { getFile } from '@nativescript/core/http'; +import { read } from 'xlsx'; + +/* generate temporary path for the new file */ +const temp: string = path.join(knownFolders.temp().path, "pres.xlsx"); + +/* download file */ +const file = await getFile("https://sheetjs.com/pres.xlsx", temp) + +/* get data */ +const ab: ArrayBuffer = await getFileAccess().readBufferAsync(file.path); + +/* read workbook */ +const wb = read(ab); +``` + ## Demo :::note -This demo was tested on an Intel Mac on 2023 May 07. NativeScript version +This demo was tested on an Intel Mac on 2023 May 21. NativeScript version (as verified with `ns --version`) is `8.5.3`. 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. + ::: 0) Follow the official Environment Setup instructions @@ -158,6 +185,8 @@ Relaunch the app with `ns run ios` and the title bar should show the version. ![NativeScript Step 4](pathname:///mobile/nativescript4.png) +### Local Files + 5) Add the Import and Export buttons to the template: ```xml title="src/app/item/items.component.html" @@ -340,4 +369,49 @@ adb push SheetJSNS.xls /data/user/0/org.nativescript.SheetJSNS/files/SheetJSNS.x ``` - Tap "Import File". A dialog will print the path of the file that was read. - The first item in the list will change. \ No newline at end of file + The first item in the list will change. + +### Fetching Files + +7) In `src/app/item/items.component.ts`, make `ngOnInit` asynchronous: + +```ts title="src/app/item/items.component.ts" + async ngOnInit(): Promise { + this.items = await this.itemService.getItems() + } +``` + +8) Replace `item.service.ts` with the following: + +```ts title="src/app/item/item.service.ts" +import { Injectable } from '@angular/core' + +import { knownFolders, path, getFileAccess } from '@nativescript/core' +import { getFile } from '@nativescript/core/http'; +import { read, utils } from 'xlsx'; + +import { Item } from './item' +interface IPresident { Name: string; Index: number }; + +@Injectable({ providedIn: 'root' }) +export class ItemService { + private items: Array; + + async getItems(): Promise> { + /* fetch https://sheetjs.com/pres.xlsx */ + const temp: string = path.join(knownFolders.temp().path, "pres.xlsx"); + const ab = await getFile("https://sheetjs.com/pres.xlsx", temp) + /* read the temporary file */ + const wb = read(await getFileAccess().readBufferAsync(ab.path)); + /* translate the first worksheet to the required Item type */ + const data = utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); + return this.items = data.map((pres, id) => ({id, name: pres.Name, role: ""+pres.Index} as Item)); + } + + getItem(id: number): Item { + return this.items.filter((item) => item.id === id)[0] + } +} +``` + +Relaunching the app in iOS or Android simulator should show Presidential data. \ No newline at end of file diff --git a/docz/docs/03-demos/12-engines/02_v8.md b/docz/docs/03-demos/12-engines/02_v8.md index 84799cf0..2d3cfc43 100644 --- a/docz/docs/03-demos/12-engines/02_v8.md +++ b/docz/docs/03-demos/12-engines/02_v8.md @@ -107,9 +107,10 @@ The resulting `buf` can be written to file with `fwrite`. This demo was tested in the following deployments: -| V8 Version | Platform | OS Version | Compiler | Date | -|:--------------|:-------------|:-----------|:---------------|:-----------| -| `11.3.244.11` | `darwin-x64` | macOS 13.2 | `clang 14.0.3` | 2023-05-20 | +| V8 Version | Platform | OS Version | Compiler | Date | +|:--------------|:-------------|:-------------|:---------------|:-----------| +| `11.3.244.11` | `darwin-x64` | macOS 13.2 | `clang 14.0.3` | 2023-05-20 | +| `11.3.244.11` | `linux-x64` | HoloOS 3.4.6 | `gcc 12.2.0` | 2023-05-20 | ::: diff --git a/docz/static/mobile/nsios.png b/docz/static/mobile/nsios.png deleted file mode 100644 index 2280c790..00000000 Binary files a/docz/static/mobile/nsios.png and /dev/null differ diff --git a/docz/static/mobile/nsand.png b/docz/static/nativescript/and.png similarity index 100% rename from docz/static/mobile/nsand.png rename to docz/static/nativescript/and.png diff --git a/docz/static/nativescript/ios.png b/docz/static/nativescript/ios.png new file mode 100644 index 00000000..cca82a27 Binary files /dev/null and b/docz/static/nativescript/ios.png differ