2017-09-12 20:02:06 +00:00
|
|
|
# React
|
|
|
|
|
|
|
|
The `xlsx.core.min.js` and `xlsx.full.min.js` scripts are designed to be dropped
|
2017-09-24 23:40:09 +00:00
|
|
|
into web pages with script tags:
|
2017-09-12 20:02:06 +00:00
|
|
|
|
|
|
|
```html
|
|
|
|
<script src="xlsx.full.min.js"></script>
|
|
|
|
```
|
|
|
|
|
|
|
|
The library can also be imported directly from JSX code with:
|
|
|
|
|
|
|
|
```js
|
2017-11-05 19:18:35 +00:00
|
|
|
import XLSX from 'xlsx';
|
2017-09-12 20:02:06 +00:00
|
|
|
```
|
|
|
|
|
2021-03-30 22:28:10 +00:00
|
|
|
This demo shows a simple React component transpiled in the browser using the babel
|
2017-09-12 20:02:06 +00:00
|
|
|
standalone library. Since there is no standard React table model, this demo
|
|
|
|
settles on the array of arrays approach.
|
|
|
|
|
|
|
|
Other scripts in this demo show:
|
|
|
|
- server-rendered React component (with `next.js`)
|
|
|
|
- `react-native` deployment for iOS and android
|
|
|
|
|
2021-03-30 22:28:10 +00:00
|
|
|
## How to run
|
|
|
|
|
2020-06-11 23:20:51 +00:00
|
|
|
Run `make react` to run the browser demo for React, or run `make next` to run
|
|
|
|
the server-rendered demo using `next.js`.
|
|
|
|
|
2017-09-12 20:02:06 +00:00
|
|
|
## Internal State
|
|
|
|
|
|
|
|
The simplest state representation is an array of arrays. To avoid having the
|
|
|
|
table component depend on the library, the column labels are precomputed. The
|
|
|
|
state in this demo is shaped like the following object:
|
|
|
|
|
|
|
|
```js
|
|
|
|
{
|
2017-09-24 23:40:09 +00:00
|
|
|
cols: [{ name: "A", key: 0 }, { name: "B", key: 1 }, { name: "C", key: 2 }],
|
2017-09-12 20:02:06 +00:00
|
|
|
data: [
|
|
|
|
[ "id", "name", "value" ],
|
2017-11-15 12:35:16 +00:00
|
|
|
[ 1, "sheetjs", 7262 ],
|
2017-09-12 20:02:06 +00:00
|
|
|
[ 2, "js-xlsx", 6969 ]
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2017-09-24 23:40:09 +00:00
|
|
|
`sheet_to_json` and `aoa_to_sheet` utility functions can convert between arrays
|
|
|
|
of arrays and worksheets:
|
|
|
|
|
|
|
|
```js
|
|
|
|
/* convert from workbook to array of arrays */
|
|
|
|
var first_worksheet = workbook.Sheets[workbook.SheetNames[0]];
|
|
|
|
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
|
|
|
|
|
|
|
|
/* convert from array of arrays to workbook */
|
|
|
|
var worksheet = XLSX.utils.aoa_to_sheet(data);
|
|
|
|
var new_workbook = XLSX.utils.book_new();
|
|
|
|
XLSX.utils.book_append_sheet(new_workbook, worksheet, "SheetJS");
|
|
|
|
```
|
|
|
|
|
|
|
|
The column objects can be generated with the `encode_col` utility function:
|
|
|
|
|
|
|
|
```js
|
|
|
|
function make_cols(refstr/*:string*/) {
|
|
|
|
var o = [];
|
|
|
|
var range = XLSX.utils.decode_range(refstr);
|
|
|
|
for(var i = 0; i <= range.e.c; ++i) {
|
|
|
|
o.push({name: XLSX.utils.encode_col(i), key:i});
|
|
|
|
}
|
|
|
|
return o;
|
|
|
|
}
|
|
|
|
```
|
2017-09-12 20:02:06 +00:00
|
|
|
|
|
|
|
## React Native
|
|
|
|
|
|
|
|
<img src="screen.png" width="400px"/>
|
|
|
|
|
|
|
|
Reproducing the full project is straightforward:
|
|
|
|
|
|
|
|
```bash
|
2017-09-24 23:40:09 +00:00
|
|
|
# see native.sh
|
2017-09-12 20:02:06 +00:00
|
|
|
react-native init SheetJS
|
|
|
|
cd SheetJS
|
|
|
|
npm i -S xlsx react react-native react-native-table-component react-native-fs
|
2018-03-13 02:51:54 +00:00
|
|
|
cp ../react-native.js index.js
|
2017-09-12 20:02:06 +00:00
|
|
|
react-native link
|
|
|
|
```
|
|
|
|
|
2017-09-24 23:40:09 +00:00
|
|
|
`react-native-table-component` draws the data table. `react-native-fs` reads
|
|
|
|
and write files on devices. The app will prompt before reading and after
|
|
|
|
writing data. The printed location will be:
|
2017-09-12 20:02:06 +00:00
|
|
|
|
|
|
|
- android: path in the device filesystem
|
|
|
|
- iOS simulator: local path to file
|
|
|
|
- iOS device: a path accessible from iTunes App Documents view
|
2017-09-24 23:40:09 +00:00
|
|
|
|
|
|
|
`react-native-fs` supports `"ascii"` encoding for `readFile` and `writeFile`.
|
|
|
|
In practice, that encoding uses binary strings compatible with `"binary"` type:
|
|
|
|
|
|
|
|
```js
|
|
|
|
import { writeFile, readFile } from 'react-native-fs';
|
|
|
|
|
|
|
|
/* read a workbook */
|
|
|
|
readFile(file, 'ascii').then((res) => {
|
|
|
|
const workbook = XLSX.read(res, {type:'binary'});
|
|
|
|
/* DO SOMETHING WITH workbook HERE */
|
|
|
|
});
|
|
|
|
|
|
|
|
/* write a workbook */
|
|
|
|
const wbout = XLSX.write(wb, {type:'binary', bookType:"xlsx"});
|
|
|
|
writeFile(file, wbout, 'ascii').then((r)=>{/* :) */}).catch((e)=>{/* :( */});
|
|
|
|
```
|
|
|
|
|
2018-03-13 02:51:54 +00:00
|
|
|
Note: for real app deployments, the `UIFileSharingEnabled` flag must be manually
|
|
|
|
set in the iOS project `Info.plist` file.
|
|
|
|
|
2020-06-11 23:20:51 +00:00
|
|
|
To run the React Native demo, run either `make ios` or `make android` while
|
|
|
|
connected to a device or emulator.
|
|
|
|
|
2017-09-24 23:40:09 +00:00
|
|
|
#### Server-Rendered React Components with Next.js
|
|
|
|
|
|
|
|
The demo uses the same component code as the in-browser version, but the build
|
|
|
|
step adds a small header that imports the library. The import is not needed in
|
|
|
|
deployments that use script tags to include the library.
|
|
|
|
|
|
|
|
[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/js-xlsx?pixel)](https://github.com/SheetJS/js-xlsx)
|
2020-06-11 23:20:51 +00:00
|
|
|
|
|
|
|
## Additional Notes
|
|
|
|
|
2020-06-29 08:07:23 +00:00
|
|
|
Some additional notes can be found in [`NOTES.md`](NOTES.md).
|