5.5 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	| title | pagination_prev | pagination_next | sidebar_position | sidebar_custom_props | ||
|---|---|---|---|---|---|---|
| CapacitorJS | demos/static/index | demos/desktop/index | 5 | 
 | 
The NodeJS Module can be imported from the main entrypoint or any script in the project.
The "Complete Example" creates an app that looks like the screenshots below:
| iOS | Android | 
|---|---|
:::warning Telemetry
Before starting this demo, manually disable telemetry. On Linux and MacOS:
npx @capacitor/cli telemetry off
To verify telemetry was disabled:
npx @capacitor/cli telemetry
:::
Integration Details
This example uses Svelte, but the same principles apply to other frameworks.
Reading data
The standard HTML5 File Input element logic works in CapacitorJS:
<script>
import { read, utils } from 'xlsx';
let html = "";
/* show file picker, read file, load table */
async function importFile(evt) {
  // highlight-start
  const f = evt.target.files[0];
  const wb = read(await f.arrayBuffer());
  // highlight-end
  const ws = wb.Sheets[wb.SheetNames[0]]; // get the first worksheet
  html = utils.sheet_to_html(ws); // generate HTML and update state
}
</script>
<main>
  <!-- highlight-next-line -->
  <input type="file" on:change={importFile}/>
  <div bind:this={tbl}>{@html html}</div>
</main>
Writing data
@capacitor/filesystem can write Base64 strings:
<script>
import { Filesystem, Directory } from '@capacitor/filesystem';
import { utils, writeXLSX } from 'xlsx';
let html = "";
let tbl;
/* get state data and export to XLSX */
async function exportFile() {
  const elt = tbl.getElementsByTagName("TABLE")[0];
  const wb = utils.table_to_book(elt);
  /* generate Base64 string for Capacitor */
  // highlight-start
  const data = writeXLSX(wb, { type: "base64" });
  await Filesystem.writeFile({
    data,
    path: "SheetJSCap.xlsx",
    directory: Directory.Documents
  }); // write file
  // highlight-end
}
</script>
<main>
  <button on:click={exportFile}>Export XLSX</button>
  <div bind:this={tbl}>{@html html}</div>
</main>
Demo
:::note
This demo was tested on an Intel Mac on 2023 April 01 with Capacitor 4.7.3 and
@capacitor/filesystem 4.1.4
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.
:::
Base Project
- Disable telemetry.
npx @capacitor/cli telemetry off
Verify that telemetry is disabled by running
npx @capacitor/cli telemetry
(it should print Telemetry is off)
- Create a new Svelte project:
npm create vite@latest sheetjs-cap -- --template svelte
cd sheetjs-cap
- Install dependencies:
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
npm i --save @capacitor/core @capacitor/cli @capacitor/filesystem
- Create CapacitorJS structure:
npx cap init sheetjs-cap com.sheetjs.cap --web-dir=dist
npm run build
- Download src/App.svelteand replace:
curl -o src/App.svelte -L https://docs.sheetjs.com/cap/App.svelte
iOS
- 
Follow the React Native demo to ensure the iOS simulator is ready. 
- 
Create iOS app 
npm i --save @capacitor/ios
npx cap add ios
- Enable file sharing and make the documents folder visible in the iOS app.
The following lines must be added to ios/App/App/Info.plist:
<plist version="1.0">
<dict>
<!-- highlight-start -->
	<key>UIFileSharingEnabled</key>
	<true/>
	<key>LSSupportsOpeningDocumentsInPlace</key>
	<true/>
<!-- highlight-end -->
  <key>CFBundleDevelopmentRegion</key>
(The root element of the document is plist and it contains one dict child)
- Run the app in the simulator
npm run build
npx cap sync
npx cap run ios
- Test the app
Open the app and observe that presidents are listed in the table.
Touch "Export XLSX" and a popup will be displayed.
To see the generated file, switch to the "Files" app in the simulator and look
for SheetJSCap.xlsx in "On My iPhone" > "sheetjs-cap"
Android
- 
Follow the React Native demo to ensure the Android simulator is ready. 
- 
Create Android app 
npm i --save @capacitor/android
npx cap add android
- Enable file reading and writing in the Android app.
The following lines must be added to android/app/src/main/AndroidManifest.xmlafter thePermissionscomment:
    <!-- Permissions -->
<!-- highlight-start -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- highlight-end -->
    <uses-permission android:name="android.permission.INTERNET" />
- Run the app in the simulator
npm run build
npx cap sync
npx cap run android
- Test the app
Open the app and observe that presidents are listed in the table.
Touch "Export XLSX" and the emulator will ask for permission:
Tap "Allow" and a popup will be displayed with a path.
To see the generated file, switch to the "Files" app in the simulator, tap the
≡ icon and tap "Documents". Tap "Documents" folder to find SheetJSCap.xlsx.

