| 
									
										
										
										
											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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [](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). |