forked from sheetjs/docs.sheetjs.com
		
	gatsby
This commit is contained in:
		
							parent
							
								
									fad51d1db7
								
							
						
					
					
						commit
						6729a25013
					
				@ -160,6 +160,7 @@ GBK
 | 
			
		||||
GatsbyJS
 | 
			
		||||
GitLab
 | 
			
		||||
Goja
 | 
			
		||||
GraphiQL
 | 
			
		||||
HTML
 | 
			
		||||
HTML5
 | 
			
		||||
HTTP
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,8 @@
 | 
			
		||||
title: Content and Site Generation
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
 | 
			
		||||
With the advent of server-side frameworks and content management systems, it is
 | 
			
		||||
possible to build sites whose source of truth is a spreadsheet!  This demo
 | 
			
		||||
explores a number of approaches.
 | 
			
		||||
@ -100,6 +102,268 @@ in the parsing logic, issues should then be raised with the SheetJS project.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
<details><summary><b>GraphQL details</b> (click to show) </summary>
 | 
			
		||||
 | 
			
		||||
`gatsby-transformer-excel` generates nodes for each data row of each worksheet.
 | 
			
		||||
Under the hood, it uses [`sheet_to_json`](/docs/api/utilities#array-output)
 | 
			
		||||
to generate row objects using the headers in the first row as keys.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
Assuming the file name is `pres.xlsx` and the data is stored in "Sheet1", the
 | 
			
		||||
following nodes will be created:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
[
 | 
			
		||||
  { Name: "Bill Clinton", Index: 42, type: "PresXlsxSheet1" },
 | 
			
		||||
  { Name: "GeorgeW Bush", Index: 43, type: "PresXlsxSheet1" },
 | 
			
		||||
  { Name: "Barack Obama", Index: 44, type: "PresXlsxSheet1" },
 | 
			
		||||
  { Name: "Donald Trump", Index: 45, type: "PresXlsxSheet1" },
 | 
			
		||||
  { Name: "Joseph Biden", Index: 46, type: "PresXlsxSheet1" },
 | 
			
		||||
]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The type is a proper casing of the file name concatenated with the sheet name.
 | 
			
		||||
 | 
			
		||||
The following query pulls the `Name` and `Index` fields from each row:
 | 
			
		||||
 | 
			
		||||
```graphql
 | 
			
		||||
{
 | 
			
		||||
  allPresXlsxSheet1 { # "all" followed by type
 | 
			
		||||
    edges {
 | 
			
		||||
      node { # each line in this block should be a field in the data
 | 
			
		||||
        Name 
 | 
			
		||||
        Index
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
`gatsby-transformer-excel` uses an older version of the library.  It can be
 | 
			
		||||
overridden through a `package.json` override in the latest versions of NodeJS:
 | 
			
		||||
 | 
			
		||||
<pre><code parentName="pre" {...{"className": "language-json"}}>{`\
 | 
			
		||||
{
 | 
			
		||||
  "overrides": {
 | 
			
		||||
    "xlsx": "https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz"
 | 
			
		||||
  }
 | 
			
		||||
}`}
 | 
			
		||||
</code></pre>
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
<details open><summary><b>Complete Example</b> (click to show)</summary>
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested on 2022 November 11 against `create-gatsby@3.0.0`. The
 | 
			
		||||
generated project used `gatsby@5.0.0` and `react@18.2.0`.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
1) Run `npm init gatsby -- -y sheetjs-gatsby` to create the template site.
 | 
			
		||||
 | 
			
		||||
2) Follow the on-screen instructions for starting the local development server:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
cd sheetjs-gatsby
 | 
			
		||||
npm run develop
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Open a web browser to the displayed URL (typically `http://localhost:8000/`)
 | 
			
		||||
 | 
			
		||||
3) Edit `package.json` and add the highlighted lines in the JSON object:
 | 
			
		||||
 | 
			
		||||
<pre><code parentName="pre" {...{"className": "language-json"}}>{`\
 | 
			
		||||
{
 | 
			
		||||
  // highlight-start
 | 
			
		||||
  "overrides": {
 | 
			
		||||
    "xlsx": "https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz"
 | 
			
		||||
  },
 | 
			
		||||
  // highlight-end
 | 
			
		||||
  "name": "sheetjs-gatsby",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
`}
 | 
			
		||||
</code></pre>
 | 
			
		||||
 | 
			
		||||
4) Install the library and plugins:
 | 
			
		||||
 | 
			
		||||
<pre><code parentName="pre" {...{"className": "language-bash"}}>{`\
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
 | 
			
		||||
npm i --save gatsby-transformer-excel gatsby-source-filesystem
 | 
			
		||||
`}
 | 
			
		||||
</code></pre>
 | 
			
		||||
 | 
			
		||||
5) Edit `gatsby-config.js` and add the following lines to the `plugins` array:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
  plugins: [
 | 
			
		||||
    {
 | 
			
		||||
      resolve: `gatsby-source-filesystem`,
 | 
			
		||||
      options: {
 | 
			
		||||
        name: `data`,
 | 
			
		||||
        path: `${__dirname}/src/data/`,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    `gatsby-transformer-excel`,
 | 
			
		||||
  ],
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Stop and restart the development server process (`npm run develop`).
 | 
			
		||||
 | 
			
		||||
6) Make a `src/data` directory, download <https://sheetjs.com/pres.xlsx>, and
 | 
			
		||||
move the downloaded file into the new folder:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
mkdir -p src/data
 | 
			
		||||
curl -LO https://sheetjs.com/pres.xlsx
 | 
			
		||||
mv pres.xlsx src/data
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
7) To verify, open the GraphiQL editor at `http://localhost:8000/___graphql`.
 | 
			
		||||
 | 
			
		||||
There is an editor in the left pane.  Paste the following query into the editor:
 | 
			
		||||
 | 
			
		||||
```graphql
 | 
			
		||||
{
 | 
			
		||||
  allPresXlsxSheet1 {
 | 
			
		||||
    edges {
 | 
			
		||||
      node {
 | 
			
		||||
        Name
 | 
			
		||||
        Index
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Press the Execute Query button and data should show up in the right pane:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
8) Create a new file `src/pages/pres.js` that uses the query and displays the result:
 | 
			
		||||
 | 
			
		||||
```jsx title="src/pages/pres.js"
 | 
			
		||||
import { graphql } from "gatsby"
 | 
			
		||||
import * as React from "react"
 | 
			
		||||
 | 
			
		||||
export const query = graphql`query {
 | 
			
		||||
  allPresXlsxSheet1 {
 | 
			
		||||
    edges {
 | 
			
		||||
      node {
 | 
			
		||||
        Name
 | 
			
		||||
        Index
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}`;
 | 
			
		||||
 | 
			
		||||
const PageComponent = ({data}) => {
 | 
			
		||||
  return ( <pre>{JSON.stringify(data, 2, 2)}</pre>);
 | 
			
		||||
};
 | 
			
		||||
export default PageComponent;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After saving the file, access `http://localhost:8000/pres`.  The displayed JSON
 | 
			
		||||
is the data that the component receives:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
{
 | 
			
		||||
  "allPresXlsxSheet1": {
 | 
			
		||||
    "edges": [
 | 
			
		||||
      {
 | 
			
		||||
        "node": {
 | 
			
		||||
          "Name": "Bill Clinton",
 | 
			
		||||
          "Index": 42
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
  // ....
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
9) Change `PageComponent` to display a table based on the data:
 | 
			
		||||
 | 
			
		||||
```jsx title="src/pages/pres.js"
 | 
			
		||||
import { graphql } from "gatsby"
 | 
			
		||||
import * as React from "react"
 | 
			
		||||
 | 
			
		||||
export const query = graphql`query {
 | 
			
		||||
  allPresXlsxSheet1 {
 | 
			
		||||
    edges {
 | 
			
		||||
      node {
 | 
			
		||||
        Name
 | 
			
		||||
        Index
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}`;
 | 
			
		||||
 | 
			
		||||
// highlight-start
 | 
			
		||||
const PageComponent = ({data}) => {
 | 
			
		||||
  const rows = data.allPresXlsxSheet1.edges.map(r => r.node);
 | 
			
		||||
  return ( <table>
 | 
			
		||||
    <thead><tr><th>Name</th><th>Index</th></tr></thead>
 | 
			
		||||
    <tbody>{rows.map(row => ( <tr>
 | 
			
		||||
      <td>{row.Name}</td>
 | 
			
		||||
      <td>{row.Index}</td>
 | 
			
		||||
    </tr>))}</tbody>
 | 
			
		||||
  </table> );
 | 
			
		||||
};
 | 
			
		||||
// highlight-end
 | 
			
		||||
 | 
			
		||||
export default PageComponent;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Going back to the browser, `http://localhost:8000/pres` will show a table:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
10) Open the file `src/data/pres.xlsx` in Excel or LibreOffice or Numbers.
 | 
			
		||||
Add a new row at the end of the file:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
Save the file and notice that the table has refreshed with the new data:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
11) Stop the development server and run `npm run build`. Once the build is
 | 
			
		||||
finished, the display will confirm that the `/pres` route is static:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Pages
 | 
			
		||||
 | 
			
		||||
┌ src/pages/404.js
 | 
			
		||||
│ ├   /404/
 | 
			
		||||
│ └   /404.html
 | 
			
		||||
├ src/pages/index.js
 | 
			
		||||
│ └   /
 | 
			
		||||
└ src/pages/pres.js
 | 
			
		||||
  └   /pres/
 | 
			
		||||
 | 
			
		||||
  ╭────────────────────────────────────────────────────────────────╮
 | 
			
		||||
  │                                                                │
 | 
			
		||||
  │   (SSG) Generated at build time                                │
 | 
			
		||||
  │ D (DSG) Deferred static generation - page generated at runtime │
 | 
			
		||||
  │ ∞ (SSR) Server-side renders at runtime (uses getServerData)    │
 | 
			
		||||
  │ λ (Function) Gatsby function                                   │
 | 
			
		||||
  │                                                                │
 | 
			
		||||
  ╰────────────────────────────────────────────────────────────────╯
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The built page will be placed in `public/pres/index.html`. Open the page with a
 | 
			
		||||
text editor and search for "SheetJS" to verify raw HTML was generated:
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<tr><td>SheetJS Dev</td><td>47</td></tr>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
## ViteJS
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
@ -115,27 +115,17 @@ function exportFile() {
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was last run on 2022 November 23 using `vue@3.2.41`.  When running
 | 
			
		||||
This demo was last run on 2022 November 11 using `vue@3.2.41`.  When running
 | 
			
		||||
`npm init`, the package `create-vue@3.4.0` was installed.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
1) Run `npm init vue@latest`.  When prompted:
 | 
			
		||||
 | 
			
		||||
- Project name: `SheetJSVue`
 | 
			
		||||
- Package name: `sheetjsvue`
 | 
			
		||||
- Add TypeScript? `No` (default)
 | 
			
		||||
- Add JSX Support? `No` (default)
 | 
			
		||||
- Add Vue Router for Single Page Application development? `No` (default)
 | 
			
		||||
- Add Pinia for state management? `No` (default)
 | 
			
		||||
- Add Vitest for Unit Testing? `No` (default)
 | 
			
		||||
- Add an End-to-End Testing Solution? `No` (default)
 | 
			
		||||
- Add ESLint for code quality? `No` (default)
 | 
			
		||||
1) Run `npm init vue@latest -- sheetjs-vue --default`.
 | 
			
		||||
 | 
			
		||||
2) Install the SheetJS dependency and start the dev server:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
cd SheetJSVue
 | 
			
		||||
cd sheetjs-vue
 | 
			
		||||
npm install
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
 | 
			
		||||
npm run dev
 | 
			
		||||
@ -145,6 +135,13 @@ npm run dev
 | 
			
		||||
 | 
			
		||||
4) Replace `src/App.vue` with the `src/SheetJSVueAoO.vue` example.
 | 
			
		||||
 | 
			
		||||
The page will refresh and show a table with an Export button.  Click the button
 | 
			
		||||
and the page will attempt to download `SheetJSVueAoA.xlsx`. There may be a delay
 | 
			
		||||
since Vite will try to optimize the SheetJS library on the fly.
 | 
			
		||||
 | 
			
		||||
5) Build the site with `npm run build`, then test with `npx http-server dist`.
 | 
			
		||||
Access `http://localhost:8080` with a web browser to test the bundled site.
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
### HTML
 | 
			
		||||
@ -194,27 +191,17 @@ function exportFile() {
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was last run on 2022 November 23 using `vue@3.2.41`.  When running
 | 
			
		||||
This demo was last run on 2022 November 11 using `vue@3.2.41`.  When running
 | 
			
		||||
`npm init`, the package `create-vue@3.4.0` was installed.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
1) Run `npm init vue@latest`.  When prompted:
 | 
			
		||||
 | 
			
		||||
- Project name: `SheetJSVue`
 | 
			
		||||
- Package name: `sheetjsvue`
 | 
			
		||||
- Add TypeScript? `No` (default)
 | 
			
		||||
- Add JSX Support? `No` (default)
 | 
			
		||||
- Add Vue Router for Single Page Application development? `No` (default)
 | 
			
		||||
- Add Pinia for state management? `No` (default)
 | 
			
		||||
- Add Vitest for Unit Testing? `No` (default)
 | 
			
		||||
- Add an End-to-End Testing Solution? `No` (default)
 | 
			
		||||
- Add ESLint for code quality? `No` (default)
 | 
			
		||||
1) Run `npm init vue@latest -- sheetjs-vue --default`.
 | 
			
		||||
 | 
			
		||||
2) Install the SheetJS dependency and start the dev server:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
cd SheetJSVue
 | 
			
		||||
cd sheetjs-vue
 | 
			
		||||
npm install
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
 | 
			
		||||
npm run dev
 | 
			
		||||
@ -224,6 +211,13 @@ npm run dev
 | 
			
		||||
 | 
			
		||||
4) Replace `src/App.vue` with the `src/SheetJSVueHTML.vue` example.
 | 
			
		||||
 | 
			
		||||
The page will refresh and show a table with an Export button.  Click the button
 | 
			
		||||
and the page will attempt to download `SheetJSVueHTML.xlsx`. There may be a delay
 | 
			
		||||
since Vite will try to optimize the SheetJS library on the fly.
 | 
			
		||||
 | 
			
		||||
5) Build the site with `npm run build`, then test with `npx http-server dist`.
 | 
			
		||||
Access `http://localhost:8080` with a web browser to test the bundled site.
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
### Rows and Columns
 | 
			
		||||
 | 
			
		||||
@ -482,10 +482,48 @@ function SheetJSSuperAgentUL() {
 | 
			
		||||
 | 
			
		||||
## NodeJS Demos
 | 
			
		||||
 | 
			
		||||
This demo focuses on a number of strategies. Some of these demos were written
 | 
			
		||||
before NodeJS added `fetch`.
 | 
			
		||||
These examples show how to download data in NodeJS.
 | 
			
		||||
 | 
			
		||||
### request
 | 
			
		||||
### HTTPS GET
 | 
			
		||||
 | 
			
		||||
The `https` module provides a low-level `get` method for HTTPS GET requests:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var https = require("https"), XLSX = require("xlsx");
 | 
			
		||||
 | 
			
		||||
https.get('https://sheetjs.com/pres.numbers', function(res) {
 | 
			
		||||
  var bufs = [];
 | 
			
		||||
  res.on('data', function(chunk) { bufs.push(chunk); });
 | 
			
		||||
  res.on('end', function() {
 | 
			
		||||
    var buf = Buffer.concat(bufs);
 | 
			
		||||
    var wb = XLSX.read(buf);
 | 
			
		||||
    /* print the first worksheet to console */
 | 
			
		||||
    var ws = wb.Sheets[wb.SheetNames[0]];
 | 
			
		||||
    console.log(XLSX.utils.sheet_to_csv(ws));
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### fetch
 | 
			
		||||
 | 
			
		||||
The `fetch` implementation has the same return types as the browser version:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Wrapper Libraries
 | 
			
		||||
 | 
			
		||||
The latest releases of NodeJS support `fetch` natively.  Before `fetch` support
 | 
			
		||||
was added to the platform, third party modules wrapped the native APIs.
 | 
			
		||||
 | 
			
		||||
#### request
 | 
			
		||||
 | 
			
		||||
:::warning
 | 
			
		||||
 | 
			
		||||
@ -510,6 +548,22 @@ request(url, {encoding: null}, function(err, res, data) {
 | 
			
		||||
 | 
			
		||||
  /* print the first worksheet to console */
 | 
			
		||||
  var ws = wb.Sheets[wb.SheetNames[0]];
 | 
			
		||||
  console.log(XLSX.utils.sheet_to_csv(ws, {blankrows:false}));
 | 
			
		||||
  console.log(XLSX.utils.sheet_to_csv(ws));
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### axios
 | 
			
		||||
 | 
			
		||||
When the `responseType` is `"arraybuffer"`, `axios` actually captures the data
 | 
			
		||||
in a NodeJS Buffer.  `XLSX.read` will transparently handle Buffers:
 | 
			
		||||
 | 
			
		||||
```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;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -11,14 +11,15 @@ not JS Arrays! With some data wrangling, translating between SheetJS worksheets
 | 
			
		||||
and typed arrays is straightforward.
 | 
			
		||||
 | 
			
		||||
This demo covers conversions between worksheets and Typed Arrays for use with
 | 
			
		||||
[TensorFlow.js](https://js.tensorflow.org/js/) and other ML libraries.
 | 
			
		||||
TensorFlow.js and other ML libraries.
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
The live code blocks in this demo load the standalone TensorFlow.js build from
 | 
			
		||||
version `3.18.0`.  It is shipped in the NodeJS package at `/dist/tf.min.js`.
 | 
			
		||||
Live code blocks in this page load the standalone build from version `3.18.0`.
 | 
			
		||||
 | 
			
		||||
[Official installation notes](https://www.tensorflow.org/js/tutorials/setup)
 | 
			
		||||
For use in web frameworks, the `@tensorflow/tfjs` module should be used.
 | 
			
		||||
 | 
			
		||||
For use in NodeJS, the native bindings module is `@tensorflow/tfjs-node`.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								docz/static/gatsby/graphiql.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/gatsby/graphiql.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 120 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/gatsby/pres2.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/gatsby/pres2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 36 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/gatsby/table1.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/gatsby/table1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 27 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/gatsby/table2.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/gatsby/table2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 30 KiB  | 
		Loading…
	
		Reference in New Issue
	
	Block a user