forked from sheetjs/docs.sheetjs.com
		
	RN36332
This commit is contained in:
		
							parent
							
								
									76dbfc419c
								
							
						
					
					
						commit
						945adcd104
					
				| @ -120,6 +120,7 @@ ActiveX | ||||
| Airtable | ||||
| AlaSQL | ||||
| AngularJS | ||||
| AppleScript | ||||
| ArrayBuffer | ||||
| Auth | ||||
| BOM | ||||
| @ -203,6 +204,7 @@ MVC | ||||
| MVVM | ||||
| MacOS | ||||
| MariaDB | ||||
| Mathematica | ||||
| Meridiem | ||||
| MongoDB | ||||
| MySQL | ||||
| @ -220,6 +222,7 @@ Northwind | ||||
| Nunjucks | ||||
| Nuxt | ||||
| NuxtJS | ||||
| OSA | ||||
| PPI | ||||
| PhantomJS | ||||
| PhoneGap | ||||
| @ -307,6 +310,7 @@ embeddable | ||||
| encodings | ||||
| esbuild | ||||
| filesystem | ||||
| frontmatter | ||||
| globals | ||||
| iOS | ||||
| iWork | ||||
|  | ||||
| @ -15,7 +15,7 @@ Other demos cover general VueJS deployments, including: | ||||
| - [Static Site Generation powered by NuxtJS](/docs/demos/static/nuxtjs) | ||||
| - [iOS and Android applications powered by Quasar](/docs/demos/mobile/quasar) | ||||
| - [Desktop application powered by Tauri](/docs/demos/desktop/tauri) | ||||
| - [`vue3-table-lite` UI component](/docs/demos/grid#vue3-table-lite) | ||||
| - [`vue3-table-lite` UI component](/docs/demos/grid/vtl) | ||||
| 
 | ||||
| 
 | ||||
| ## Installation | ||||
| @ -232,8 +232,8 @@ generate column headings and for indexing into the row objects. | ||||
| The safest approach is to use an array of arrays for state and to generate | ||||
| column objects that map to A1-Style column headers. | ||||
| 
 | ||||
| The [`vue3-table-lite` demo](/docs/demos/grid#rows-and-columns-bindings) generates rows | ||||
| and columns objects with the following structure: | ||||
| The [`vue3-table-lite` demo](/docs/demos/grid/vtl#rows-and-columns-bindings) | ||||
| generates rows and columns objects with the following structure: | ||||
| 
 | ||||
| ```js | ||||
| /* rows are generated with a simple array of arrays */ | ||||
|  | ||||
							
								
								
									
										124
									
								
								docz/docs/03-demos/02-grid/12-vtl.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										124
									
								
								docz/docs/03-demos/02-grid/12-vtl.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,124 @@ | ||||
| --- | ||||
| title: vue3-table-lite | ||||
| pagination_prev: demos/frontend/index | ||||
| pagination_next: demos/net/index | ||||
| --- | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested against `vue3-table-lite 1.2.4`, VueJS `3.2.47`, ViteJS | ||||
| 4.3.1, and `@vitejs/plugin-vue` 4.1.0 on 2023 April 24 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 
 | ||||
| The demo creates a site that looks like the screenshot below: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| #### Rows and Columns Bindings | ||||
| 
 | ||||
| `vue3-table-lite` presents two attribute bindings: an array of column metadata | ||||
| (`columns`) and an array of objects representing the displayed data (`rows`). | ||||
| Typically both are `ref` objects: | ||||
| 
 | ||||
| 
 | ||||
| ```html | ||||
| <script setup lang="ts"> | ||||
| import { ref } from "vue"; | ||||
| import VueTableLite from "vue3-table-lite/ts"; | ||||
| 
 | ||||
| /* rows */ | ||||
| type Row = any[]; | ||||
| const rows = ref<Row[]>([]); | ||||
| 
 | ||||
| /* columns */ | ||||
| type Column = { field: string; label: string; }; | ||||
| const columns = ref<Column[]>([]); | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|   <vue-table-lite :columns="columns" :rows="rows"></vue-table-lite> | ||||
| </template> | ||||
| ``` | ||||
| 
 | ||||
| These can be mutated through the `value` property in VueJS lifecycle methods: | ||||
| 
 | ||||
| ```ts | ||||
| import { onMounted } from "vue"; | ||||
| onMounted(() => { | ||||
|   columns.value = [ { field: "name", label: "Names" }]; | ||||
|   rows.value = [ { name: "SheetJS" }, { name: "VueJS" } ]; | ||||
| }) | ||||
| ``` | ||||
| 
 | ||||
| The most generic data representation is an array of arrays. To sate the grid, | ||||
| columns must be objects whose `field` property is the index converted to string: | ||||
| 
 | ||||
| ```js | ||||
| import { ref } from "vue"; | ||||
| import { utils } from 'xlsx'; | ||||
| 
 | ||||
| /* generate row and column data */ | ||||
| function ws_to_vtl(ws) { | ||||
|   /* create an array of arrays */ | ||||
|   const rows = utils.sheet_to_json(ws, { header: 1 }); | ||||
| 
 | ||||
|   /* create column array */ | ||||
|   const range = utils.decode_range(ws["!ref"]||"A1"); | ||||
|   const columns = Array.from({ length: range.e.c + 1 }, (_, i) => ({ | ||||
|     field: String(i), // vtl will access row["0"], row["1"], etc | ||||
|     label: utils.encode_col(i), // the column labels will be A, B, etc | ||||
|   })); | ||||
| 
 | ||||
|   return { rows, columns }; | ||||
| } | ||||
| 
 | ||||
| const rows = ref([]); | ||||
| const columns = ref([]); | ||||
| 
 | ||||
| /* update refs */ | ||||
| function update_refs(ws) { | ||||
|   const data = ws_to_vtl(ws); | ||||
|   rows.value = data.rows; | ||||
|   columns.value = data.columns; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| In the other direction, a worksheet can be generated with `aoa_to_sheet`: | ||||
| 
 | ||||
| ```js | ||||
| import { utils } from 'xlsx'; | ||||
| 
 | ||||
| const rows = ref([]); | ||||
| 
 | ||||
| function vtl_to_ws(rows) { | ||||
|   return utils.aoa_to_sheet(rows.value); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## Demo | ||||
| 
 | ||||
| 1) Create a new ViteJS App using the VueJS + TypeScript template: | ||||
| 
 | ||||
| ```bash | ||||
| npm create vite@latest sheetjs-vtl -- --template vue-ts | ||||
| cd sheetjs-vtl | ||||
| ``` | ||||
| 
 | ||||
| 2) Install dependencies: | ||||
| 
 | ||||
| ```bash | ||||
| npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz vue3-table-lite@1.2.4 | ||||
| ``` | ||||
| 
 | ||||
| 3) Download [`src/App.vue`](pathname:///vtl/App.vue) and replace the contents: | ||||
| 
 | ||||
| ```bash | ||||
| curl -L -o src/App.vue https://docs.sheetjs.com/vtl/App.vue | ||||
| ``` | ||||
| 
 | ||||
| 4) run `npm run dev`.  When you load the page in the browser, it will try to | ||||
|    fetch <https://sheetjs.com/pres.numbers> and load the data. | ||||
| @ -217,122 +217,7 @@ npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz @mui/x-data-grid @e | ||||
| 
 | ||||
| <!-- spellchecker-enable --> | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested against `vue3-table-lite 1.2.4`, VueJS `3.2.37`, ViteJS | ||||
| 3.0.7, and `@vitejs/plugin-vue` 3.0.3 on 2022 August 18 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| #### VueJS Demo | ||||
| 
 | ||||
| <details><summary><b>Complete Example</b> (click to show)</summary> | ||||
| 
 | ||||
| 1) Create a new ViteJS App using the VueJS + TypeScript template: | ||||
| 
 | ||||
| ```bash | ||||
| npm create vite@latest sheetjs-vue -- --template vue-ts | ||||
| cd sheetjs-vue | ||||
| ``` | ||||
| 
 | ||||
| 2) Install dependencies: | ||||
| 
 | ||||
| ```bash | ||||
| npm i | ||||
| npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz vue3-table-lite | ||||
| ``` | ||||
| 
 | ||||
| 3) Download [`src/App.vue`](pathname:///vtl/App.vue) and replace the contents: | ||||
| 
 | ||||
| ```bash | ||||
| curl -L -o src/App.vue https://docs.sheetjs.com/vtl/App.vue | ||||
| ``` | ||||
| 
 | ||||
| 4) run `npm run dev`.  When you load the page in the browser, it will try to | ||||
|    fetch <https://sheetjs.com/pres.numbers> and load the data. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| #### Rows and Columns Bindings | ||||
| 
 | ||||
| `vue3-table-lite` presents two attribute bindings: an array of column metadata | ||||
| (`columns`) and an array of objects representing the displayed data (`rows`). | ||||
| Typically both are `ref` objects: | ||||
| 
 | ||||
| 
 | ||||
| ```html | ||||
| <script setup lang="ts"> | ||||
| import { ref } from "vue"; | ||||
| import VueTableLite from "vue3-table-lite/ts"; | ||||
| 
 | ||||
| /* rows */ | ||||
| type Row = any[]; | ||||
| const rows = ref<Row[]>([]); | ||||
| 
 | ||||
| /* columns */ | ||||
| type Column = { field: string; label: string; }; | ||||
| const columns = ref<Column[]>([]); | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|   <vue-table-lite :columns="columns" :rows="rows"></vue-table-lite> | ||||
| </template> | ||||
| ``` | ||||
| 
 | ||||
| These can be mutated through the `value` property in VueJS lifecycle methods: | ||||
| 
 | ||||
| ```ts | ||||
| import { onMounted } from "vue"; | ||||
| onMounted(() => { | ||||
|   columns.value = [ { field: "name", label: "Names" }]; | ||||
|   rows.value = [ { name: "SheetJS" }, { name: "VueJS" } ]; | ||||
| }) | ||||
| ``` | ||||
| 
 | ||||
| The most generic data representation is an array of arrays. To sate the grid, | ||||
| columns must be objects whose `field` property is the index converted to string: | ||||
| 
 | ||||
| ```js | ||||
| import { ref } from "vue"; | ||||
| import { utils } from 'xlsx'; | ||||
| 
 | ||||
| /* generate row and column data */ | ||||
| function ws_to_vte(ws) { | ||||
|   /* create an array of arrays */ | ||||
|   const rows = utils.sheet_to_json(ws, { header: 1 }); | ||||
| 
 | ||||
|   /* create column array */ | ||||
|   const range = utils.decode_range(ws["!ref"]||"A1"); | ||||
|   const columns = Array.from({ length: range.e.c + 1 }, (_, i) => ({ | ||||
|     field: String(i), // VTE will access row["0"], row["1"], etc | ||||
|     label: utils.encode_col(i), // the column labels will be A, B, etc | ||||
|   })); | ||||
| 
 | ||||
|   return { rows, columns }; | ||||
| } | ||||
| 
 | ||||
| const rows = ref([]); | ||||
| const columns = ref([]); | ||||
| 
 | ||||
| /* update refs */ | ||||
| function update_refs(ws) { | ||||
|   const data = ws_to_vte(ws); | ||||
|   rows.value = data.rows; | ||||
|   columns.value = data.columns; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| In the other direction, a worksheet can be generated with `aoa_to_sheet`: | ||||
| 
 | ||||
| ```js | ||||
| import { utils } from 'xlsx'; | ||||
| 
 | ||||
| const rows = ref([]); | ||||
| 
 | ||||
| function vte_to_ws(rows) { | ||||
|   return utils.aoa_to_sheet(rows.value); | ||||
| } | ||||
| ``` | ||||
| **[The exposition has been moved to a separate page.](/docs/demos/grid/vtl)** | ||||
| 
 | ||||
| ## Standard HTML Tables | ||||
| 
 | ||||
|  | ||||
| @ -248,28 +248,4 @@ npx http-server dist | ||||
| 
 | ||||
| Open a web browser and access the displayed URL (usually http://localhost:8080). | ||||
| View the page source and confirm that no JS was added to the page.  It only | ||||
| contains the content from the file in an HTML table: | ||||
| 
 | ||||
| ```html | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <body> | ||||
|     <h3>Presidents</h3> | ||||
|     <table> | ||||
|       <thead><tr><th>Name</th><th>Index</th></tr></thead> | ||||
|       <tbody> | ||||
|       <tr> | ||||
|         <td>Bill Clinton</td><td>42</td> | ||||
|       </tr><tr> | ||||
|         <td>GeorgeW Bush</td><td>43</td> | ||||
|       </tr><tr> | ||||
|         <td>Barack Obama</td><td>44</td> | ||||
|       </tr><tr> | ||||
|         <td>Donald Trump</td><td>45</td> | ||||
|       </tr><tr> | ||||
|         <td>Joseph Biden</td><td>46</td> | ||||
|       </tr> | ||||
|       </tbody> | ||||
|     </table> | ||||
|   </body></html> | ||||
| ``` | ||||
| contains the content from the file in an HTML table. | ||||
|  | ||||
| @ -28,6 +28,148 @@ The "Complete Example" creates an app that looks like the screenshots below: | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| ["Fetching Remote Data"](#fetching-remote-data) uses the built-in `fetch` to | ||||
| download and parse remote workbook files. | ||||
| 
 | ||||
| ["Native Libraries"](#native-libraries) uses native libraries to read and write | ||||
| files in the local device. | ||||
| 
 | ||||
| :::caution | ||||
| 
 | ||||
| **Before reading this demo, follow the official React Native CLI Guide!** | ||||
| 
 | ||||
| Development Environment Guide: <https://reactnative.dev/docs/environment-setup> | ||||
| 
 | ||||
| Follow the instructions for iOS (requires macOS) and for Android. They will | ||||
| cover installation and system configuration. You should be able to build and run | ||||
| a sample app in the Android and the iOS (if applicable) simulators. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Fetching Remote Data | ||||
| 
 | ||||
| :::info | ||||
| 
 | ||||
| React Native `0.72.0` will support binary data with `fetch`. For older versions, | ||||
| [a native library](#native-libraries) can provide support. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 
 | ||||
| React Native 0.72.0 will support binary data with `fetch`: | ||||
| 
 | ||||
| ```js | ||||
| /* fetch data into an ArrayBuffer */ | ||||
| const ab = await (await fetch("https://sheetjs.com/pres.numbers")).arrayBuffer(); | ||||
| /* parse data */ | ||||
| const wb = XLSX.read(ab); | ||||
| ``` | ||||
| 
 | ||||
| ### Fetch Demo | ||||
| 
 | ||||
| The following demo uses `react-native-table-component` to display the first | ||||
| worksheet in a simple table. | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested on an Intel Mac on 2023 April 24 with RN `0.72.0-rc.1`. | ||||
| 
 | ||||
| The iOS simulator runs iOS 16.2 on an iPhone SE (3rd generation). | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 1) Create project: | ||||
| 
 | ||||
| ```bash | ||||
| npx react-native init SheetJSRNFetch --version="0.72.0-rc.1" | ||||
| ``` | ||||
| 
 | ||||
| 2) Install shared dependencies: | ||||
| 
 | ||||
| ```bash | ||||
| cd SheetJSRNFetch | ||||
| curl -LO https://oss.sheetjs.com/assets/img/logo.png | ||||
| npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | ||||
| npm i -S react-native-table-component@1.2.0 @types/react-native-table-component | ||||
| ``` | ||||
| 
 | ||||
| Refresh iOS project by running `pod install` from the `ios` subfolder: | ||||
| 
 | ||||
| ```bash | ||||
| cd ios; pod install; cd .. | ||||
| ``` | ||||
| 
 | ||||
| 3) Download [`App.tsx`](pathname:///reactnative/App.tsx) and replace: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://docs.sheetjs.com/reactnative/App.tsx | ||||
| ``` | ||||
| 
 | ||||
| **iOS Testing** | ||||
| 
 | ||||
| Start the iOS emulator: | ||||
| 
 | ||||
| ```bash | ||||
| npx react-native run-ios | ||||
| ``` | ||||
| 
 | ||||
| When opened, the app should look like the "Before" screenshot below.  After | ||||
| tapping "Import data from a spreadsheet", the app should show new data: | ||||
| 
 | ||||
| <table><thead><tr> | ||||
|   <th>Before</th> | ||||
|   <th>After</th> | ||||
| </tr></thead><tbody><tr><td> | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| </td><td> | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| **Android Testing** | ||||
| 
 | ||||
| Start the Android emulator: | ||||
| 
 | ||||
| ```bash | ||||
| npx react-native run-android | ||||
| ``` | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| When this demo was last tested, the simulator failed with the message | ||||
| 
 | ||||
| > Unable to load script.  Make sure you're either Running Metro ... | ||||
| 
 | ||||
| The workaround is to launch Metro directly: | ||||
| 
 | ||||
| ```bash | ||||
| npx react-native start | ||||
| ``` | ||||
| 
 | ||||
| Press `a` in the terminal window and Metro will try to reload the app. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 
 | ||||
| When opened, the app should look like the "Before" screenshot below.  After | ||||
| tapping "Import data from a spreadsheet", the app should show new data: | ||||
| 
 | ||||
| <table><thead><tr> | ||||
|   <th>Before</th> | ||||
|   <th>After</th> | ||||
| </tr></thead><tbody><tr><td> | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| </td><td> | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| 
 | ||||
| ## Native Libraries | ||||
| 
 | ||||
| @ -312,17 +454,9 @@ are not covered here. | ||||
| 
 | ||||
| This example tries to separate the library-specific functions. | ||||
| 
 | ||||
| 0) **Follow the official React Native CLI Guide!** | ||||
| 
 | ||||
| Development Environment Guide: <https://reactnative.dev/docs/environment-setup> | ||||
| 
 | ||||
| Follow the instructions for iOS and for Android.  They will cover installation | ||||
| and system configuration.  By the end, you should be able to run the sample app | ||||
| in the Android and the iOS simulators. | ||||
| 
 | ||||
| 1) Create project: | ||||
| 
 | ||||
| ``` | ||||
| ```bash | ||||
| npx react-native init SheetJSRN --version="0.67.2" | ||||
| ``` | ||||
| 
 | ||||
| @ -332,7 +466,7 @@ npx react-native init SheetJSRN --version="0.67.2" | ||||
| cd SheetJSRN | ||||
| curl -LO https://oss.sheetjs.com/assets/img/logo.png | ||||
| npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | ||||
| npm i -S react-native-table-component react-native-document-picker | ||||
| npm i -S react-native-table-component@1.2.0 react-native-document-picker | ||||
| ``` | ||||
| 
 | ||||
| Refresh iOS project by running `pod install` from the `ios` subfolder: | ||||
|  | ||||
| @ -36,7 +36,7 @@ run in the web browser, demos will include interactive examples. | ||||
| - [`x-spreadsheet`](/docs/demos/grid/xs) | ||||
| - [`react-data-grid`](/docs/demos/grid/rdg) | ||||
| - [`glide-data-grid`](/docs/demos/grid/gdg) | ||||
| - [`vue3-table-lite`](/docs/demos/grid#vue3-table-lite) | ||||
| - [`vue3-table-lite`](/docs/demos/grid/vtl) | ||||
| - [`angular-ui-grid`](/docs/demos/grid#angular-ui-grid) | ||||
| - [`material ui`](/docs/demos/grid#material-ui-table) | ||||
| 
 | ||||
|  | ||||
| @ -644,7 +644,7 @@ export default function App() { | ||||
|   </TabItem> | ||||
|   <TabItem value="vue" label="VueJS"> | ||||
| 
 | ||||
| [`vue3-table-lite`](/docs/demos/grid#vue3-table-lite) is a VueJS 3 data table. | ||||
| [`vue3-table-lite`](/docs/demos/grid/vtl) is a VueJS 3 data table. | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
|  | ||||
| @ -162,11 +162,11 @@ The default behavior for all parsers is to generate number cells.  Passing the | ||||
| `cellDates` to true will force the parsers to store dates: | ||||
| 
 | ||||
| ```js | ||||
| // cell A1 will be { t: 'n', v: 44721 } | ||||
| var wb_sans_date = XLSX.read("6/9/2022", {type:"binary"}); | ||||
| // cell A1 will be { t: 'n', v: 54337 } | ||||
| var wb_sans_date = XLSX.read("10/6/2048", {type:"binary"}); | ||||
| 
 | ||||
| // cell A1 will be { t: 'd', v: <Date object representing June 9 2022> } | ||||
| var wb_with_date = XLSX.read("6/9/2022", {type:"binary", cellDates: true}); | ||||
| // cell A1 will be { t: 'd', v: <Date object representing 2048 October 06> } | ||||
| var wb_with_date = XLSX.read("10/6/2048", {type:"binary", cellDates: true}); | ||||
| ``` | ||||
| 
 | ||||
| When writing, date cells are automatically translated back to numeric cells | ||||
|  | ||||
| @ -262,28 +262,28 @@ git checkout -- . | ||||
| ### Reproduce official builds | ||||
| 
 | ||||
| 4) Run `git log` and search for the commit that matches a particular release | ||||
| version.  For example, version `0.19.1` can be found with: | ||||
| version.  For example, version `0.19.3` can be found with: | ||||
| 
 | ||||
| ```bash | ||||
| git log | grep -B4 "version bump 0.19.1" | ||||
| git log | grep -B4 "version bump 0.19.3" | ||||
| ``` | ||||
| 
 | ||||
| The output should look like: | ||||
| 
 | ||||
| ```bash | ||||
| $ git log | grep -B4 "version bump 0.19.1" | ||||
| $ git log | grep -B4 "version bump 0.19.3" | ||||
| # highlight-next-line | ||||
| commit 51a861900092bfc01b2fa9960d4c932dcbeb6925 <-- this is the commit hash | ||||
| commit 333e4e40f9c5603bd22a811f54c61c20bc9e17ab <-- this is the commit hash | ||||
| Author: SheetJS <dev@sheetjs.com> | ||||
| Date:   Thu Nov 17 04:35:34 2022 -0500 | ||||
| Date:   Mon Apr 17 23:39:28 2023 -0400 | ||||
| 
 | ||||
|     version bump 0.19.1 | ||||
|     version bump 0.19.3 | ||||
| ``` | ||||
| 
 | ||||
| 5) Switch to that commit: | ||||
| 
 | ||||
| ```bash | ||||
| git checkout 51a861900092bfc01b2fa9960d4c932dcbeb6925 | ||||
| git checkout 333e4e40f9c5603bd22a811f54c61c20bc9e17ab | ||||
| ``` | ||||
| 
 | ||||
| 6) Run the full build sequence | ||||
| @ -301,14 +301,14 @@ The local checksum for the browser script can be computed with: | ||||
| 
 | ||||
| ```bash | ||||
| $ md5sum dist/xlsx.full.min.js | ||||
| 00b46a9f2d30ddc69780ab8049d6809e  dist/xlsx.full.min.js | ||||
| f5c73b5ddc4b431c909d11c2e1d7a8e0  dist/xlsx.full.min.js | ||||
| ``` | ||||
| 
 | ||||
| The checksum for the CDN version can be computed with: | ||||
| 
 | ||||
| ```bash | ||||
| $ curl -L https://cdn.sheetjs.com/xlsx-0.19.1/package/dist/xlsx.full.min.js | md5sum - | ||||
| 00b46a9f2d30ddc69780ab8049d6809e  - | ||||
| $ curl -L https://cdn.sheetjs.com/xlsx-0.19.3/package/dist/xlsx.full.min.js | md5sum - | ||||
| f5c73b5ddc4b431c909d11c2e1d7a8e0  - | ||||
| ``` | ||||
| 
 | ||||
| The two hashes should match. | ||||
|  | ||||
							
								
								
									
										73
									
								
								docz/static/reactnative/App.tsx
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										73
									
								
								docz/static/reactnative/App.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| /* sheetjs (C) SheetJS -- https://sheetjs.com */ | ||||
| 
 | ||||
| import React, { useState, useCallback } from 'react'; | ||||
| import { StyleSheet, Text, Button, Alert, Image, ScrollView } from 'react-native'; | ||||
| import { Table, Row, Rows, TableWrapper } from 'react-native-table-component'; | ||||
| import { read, utils, WorkSheet } from 'xlsx'; | ||||
| 
 | ||||
| const make_width = (ws: WorkSheet): number[] => { | ||||
|   const aoa = utils.sheet_to_json(ws, {header:1}), res: number[] = []; | ||||
|   aoa.forEach((r) => { r.forEach((c, C) => { res[C] = Math.max(res[C]||60, String(c).length * 10); }); }); | ||||
|   for(let C = 0; C < res.length; ++C) if(!res[C]) res[C] = 60; | ||||
|   return res; | ||||
| }; | ||||
| 
 | ||||
| function App(): JSX.Element { | ||||
|   const [data, setData] = useState<any[]>([ | ||||
|     "SheetJS".split(""), | ||||
|     [5,4,3,3,7,9,5], | ||||
|     [8,6,7,5,3,0,9] | ||||
|   ]); | ||||
|   const [widths, setWidths] = useState<number[]>(Array.from({length:7}, () => 20)); | ||||
| 
 | ||||
|   const importFile = useCallback(async() => { | ||||
|     try { | ||||
|       const ab = await (await fetch("https://sheetjs.com/pres.numbers")).arrayBuffer(); | ||||
|       const wb = read(ab); | ||||
| 
 | ||||
|       /* convert first worksheet to AOA */ | ||||
|       const wsname = wb.SheetNames[0]; | ||||
|       const ws = wb.Sheets[wsname]; | ||||
|       const data = utils.sheet_to_json(ws, {header:1}); | ||||
|       /* update state */ | ||||
|       setData(data); | ||||
|       setWidths(make_width(ws)); | ||||
|     } catch(err) { | ||||
|       Alert.alert("importFile Error", "Error " + ((err as any).message || err)); | ||||
|     } | ||||
|   }, []); | ||||
| 
 | ||||
|   return ( | ||||
|     <ScrollView contentContainerStyle={styles.container}> | ||||
|       <Text style={styles.welcome}> </Text> | ||||
|       <Text style={styles.welcome}> <Image source={require("./logo.png")} style={styles.image}/>   SheetJS × React Native</Text> | ||||
|       <Button onPress={importFile} title="Import data from a spreadsheet" color="#841584" /> | ||||
|       <Text style={styles.bolded}>Current Data</Text> | ||||
|       <ScrollView style={styles.table} horizontal={true} > | ||||
|         <Table style={styles.table}> | ||||
|           <TableWrapper> | ||||
|             <Row data={data[0]} style={styles.thead} textStyle={styles.text} widthArr={widths}/> | ||||
|           </TableWrapper> | ||||
|           <ScrollView> | ||||
|             <TableWrapper> | ||||
|               <Rows data={data.slice(1)} style={styles.tr} textStyle={styles.text} widthArr={widths}/> | ||||
|             </TableWrapper> | ||||
|           </ScrollView> | ||||
|         </Table> | ||||
|       </ScrollView> | ||||
|     </ScrollView> | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| const styles = StyleSheet.create({ | ||||
|   container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF' }, | ||||
|   welcome: { fontSize: 20, textAlign: 'center', margin: 10 }, | ||||
|   bolded: { textAlign: 'center', color: '#333333', marginBottom: 5, fontWeight: "bold" }, | ||||
|   thead: { height: 40, backgroundColor: '#f1f8ff' }, | ||||
|   tr: { height: 30 }, | ||||
|   text: { marginLeft: 5, }, | ||||
|   table: { width: "100%" }, | ||||
|   image: { height: 16, width: 16 } | ||||
| }); | ||||
| 
 | ||||
| export default App; | ||||
							
								
								
									
										
											BIN
										
									
								
								docz/static/reactnative/andfetch1.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/reactnative/andfetch1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 70 KiB | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/reactnative/andfetch2.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/reactnative/andfetch2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 91 KiB | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/reactnative/iosfetch1.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/reactnative/iosfetch1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 47 KiB | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/reactnative/iosfetch2.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/reactnative/iosfetch2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 63 KiB | 
							
								
								
									
										
											BIN
										
									
								
								docz/static/vtl/vtl1.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/vtl/vtl1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 76 KiB | 
		Loading…
	
		Reference in New Issue
	
	Block a user