2023-01-05 23:33:49 +00:00
---
2023-09-11 04:44:15 +00:00
title: Data Conduction in Ionic Apps
sidebar_label: Ionic
description: Build data-intensive mobile apps with Ionic and Cordova. Seamlessly integrate spreadsheets into your app using SheetJS. Let data in your Excel spreadsheets shine.
2023-02-28 11:40:44 +00:00
pagination_prev: demos/static/index
2023-01-05 23:33:49 +00:00
pagination_next: demos/desktop/index
sidebar_position: 4
sidebar_custom_props:
summary: Native Components + Web View
---
2023-04-27 09:12:19 +00:00
import current from '/version.js';
2023-04-29 11:21:37 +00:00
import CodeBlock from '@theme/CodeBlock';
2023-04-27 09:12:19 +00:00
2023-09-11 04:44:15 +00:00
[Ionic ](https://ionicframework.com/ ) is a mobile app framework for building iOS
and Android apps with the Cordova platform.
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
[SheetJS ](https://sheetjs.com ) is a JavaScript library for reading and writing
data from spreadsheets.
This demo uses Ionic and SheetJS to process data and generate spreadsheets.
We'll explore how to load SheetJS in an Ionic app and use Ionic APIs and plugins
to extract data from, and write data to, spreadsheet files on the device.
The ["Demo" ](#demo ) creates an app that looks like the screenshots below:
2023-03-20 05:44:17 +00:00
< table > < thead > < tr >
< th > < a href = "#demo" > iOS< / a > < / th >
2023-03-29 00:26:39 +00:00
< th > < a href = "#demo" > Android< / a > < / th >
2023-03-20 05:44:17 +00:00
< / tr > < / thead > < tbody > < tr > < td >

2023-03-29 00:26:39 +00:00
< / td > < td >

2023-03-20 05:44:17 +00:00
< / td > < / tr > < / tbody > < / table >
2023-09-11 04:44:15 +00:00
:::info pass
This demo covers Ionic apps using the Cordova platform.
The [CapacitorJS demo ](/docs/demos/mobile/capacitor ) covers CapacitorJS apps.
:::
2023-03-20 05:44:17 +00:00
2023-12-05 03:46:54 +00:00
:::note Tested Deployments
This demo was tested in the following environments:
2024-06-03 03:25:20 +00:00
**Real Devices**
2023-12-05 03:46:54 +00:00
2024-04-30 04:29:40 +00:00
| OS | Device | Config | Date |
|:-----------|:--------------------|:-------|:-----------|
2025-03-31 02:09:31 +00:00
| Android 34 | NVIDIA Shield | B | 2025-03-30 |
| iOS 15.6 | iPhone 13 Pro Max | B | 2025-03-30 |
2024-06-03 03:25:20 +00:00
**Simulators**
| OS | Device | Config | Dev Platform | Date |
|:-----------|:--------------------|:-------|:-------------|:-----------|
2025-03-31 02:09:31 +00:00
| Android 34 | Pixel 3a | B | `darwin-arm` | 2025-03-30 |
| iOS 18.2 | iPhone SE (3rd gen) | B | `darwin-arm` | 2025-03-30 |
2024-04-30 04:29:40 +00:00
< details >
< summary > < b > Configurations< / b > (click to show)< / summary >
Configuration A:
2023-12-05 03:46:54 +00:00
2024-06-03 03:25:20 +00:00
- Ionic: `@ionic/angular 8.2.0` , `@ionic/angular-toolkit 11.0.1`
- Cordova: `cordova-lib@12.0.1` , `android 13.0.0, ios 7.1.0`
- File Integration: `@awesome-cordova-plugins/file` version `6.7.0`
2025-03-31 02:09:31 +00:00
Configuration B:
- Ionic: `@ionic/angular 8.5.2` , `@ionic/angular-toolkit 12.1.1`
- Cordova: `cordova-lib@12.0.2` , `android 14.0.0, ios 7.1.1`
- File Integration: `@awesome-cordova-plugins/file` version `6.16.0`
2024-04-30 04:29:40 +00:00
< / details >
2023-12-05 03:46:54 +00:00
:::
2024-04-14 07:40:38 +00:00
:::danger Telemetry
2023-01-05 23:33:49 +00:00
2025-02-24 01:17:05 +00:00
Before starting this demo, manually disable telemetry:
2023-01-05 23:33:49 +00:00
```bash
2025-03-31 02:09:31 +00:00
npx -y @ionic/cli config set -g telemetry false
npx -y @capacitor/cli telemetry off
2023-01-05 23:33:49 +00:00
```
To verify telemetry was disabled:
```bash
2025-03-31 02:09:31 +00:00
npx -y @ionic/cli config get -g telemetry
npx -y @capacitor/cli telemetry
2023-01-05 23:33:49 +00:00
```
:::
2023-03-20 05:44:17 +00:00
## Integration Details
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
The [SheetJS NodeJS Module ](/docs/getting-started/installation/nodejs ) can be
2023-09-22 06:32:55 +00:00
imported from any component or script in the app.
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
### Internal State
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
The ["Angular" demo ](/docs/demos/frontend/angular ) discusses a number of state
representations and preview strategies.
For this demo, the internal state is an "array of arrays"[^1] (`any[][]`):
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
```ts title="Array of Arrays state"
import { Component } from '@angular/core';
type AOA = any[][];
2023-03-20 05:44:17 +00:00
2023-09-11 04:44:15 +00:00
@Component ({...})
export class SheetJSTablePage {
data: AOA = [
["S", "h", "e", "e", "t", "J", "S"],
[ 5, 4, 3, 3, 7, 9, 5]
];
// ...
}
```
### Displaying Data
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
`ion-grid` [^2] is a display grid component. The Angular `ngFor` directive[^3]
simplifies iteration over the array of arrays:
```html title="Template for displaying an array of arrays"
2023-01-05 23:33:49 +00:00
< ion-grid >
< ion-row * ngFor = "let row of data" >
< ion-col * ngFor = "let val of row" >
{{val}}
< / ion-col >
< / ion-row >
< / ion-grid >
```
2023-09-11 04:44:15 +00:00
### File Operations
2024-06-03 03:25:20 +00:00
The `cordova-plugin-file` plugin reads and writes files on devices.
:::caution pass
For Android 30+, due to scoped storage rules, the standard file module writes
private files that cannot be accessed from the Files app.
A Storage Access Framework plugin must be used to write external files.
:::
`@awesome-cordova-plugins/file` is a wrapper designed for Ionic + Angular apps.
2023-03-20 05:44:17 +00:00
2023-09-11 04:44:15 +00:00
:::info pass
2023-03-20 05:44:17 +00:00
2023-09-11 04:44:15 +00:00
The plugins in the `@ionic-native` scope have been deprecated. The community
modules in the `@awesome-cordova-plugins` scope should be used.
2023-03-20 05:44:17 +00:00
2023-09-11 04:44:15 +00:00
:::
#### Reading Files
`this.file.readAsArrayBuffer` reads file data from a specified URL and resolves
to `ArrayBuffer` objects.
These objects can be parsed with the SheetJS `read` method[^4]. The SheetJS
`sheet_to_json` method[^5] with the option `header: 1` generates an array of
arrays which can be assigned to the page state:
2023-01-05 23:33:49 +00:00
2025-02-24 01:17:05 +00:00
```ts title="Read file from device and update state"
2023-09-11 04:44:15 +00:00
/* read a workbook file */
2023-01-05 23:33:49 +00:00
const ab: ArrayBuffer = await this.file.readAsArrayBuffer(url, filename);
2023-09-11 04:44:15 +00:00
/* parse */
2023-03-20 05:44:17 +00:00
const wb: XLSX.WorkBook = XLSX.read(ab, {type: 'array'});
2023-09-11 04:44:15 +00:00
/* generate an array of arrays from the first worksheet */
const ws: XLSX.WorkSheet = wb.SheetNames[wb.Sheets[0]];
const aoa: AOA = XLSX.utils.sheet_to_json(ws, {header: 1});
/* update state */
this.data = aoa;
2023-03-20 05:44:17 +00:00
```
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
#### Writing Files
2023-03-20 05:44:17 +00:00
2023-09-11 04:44:15 +00:00
`this.file.writeFile` writes file data stored in `Blob` objects to the device.
2023-03-20 05:44:17 +00:00
2023-09-11 04:44:15 +00:00
From the array of arrays, the SheetJS `aoa_to_sheet` method[^6] generates a
worksheet object. The `book_new` and `book_append_sheet` helpers[^7] generate a
workbook object. The SheetJS `write` method[^8] with the option `type: "array"`
will generate an `ArrayBuffer` , from which a `Blob` can be created:
2023-03-20 05:44:17 +00:00
2025-02-24 01:17:05 +00:00
```ts title="Export state data to XLSX workbook and write to device"
2023-09-11 04:44:15 +00:00
/* generate worksheet */
const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(this.data);
/* generate workbook and add the worksheet */
const wb: XLSX.WorkBook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'SheetJS');
/* write XLSX to ArrayBuffer */
const ab: ArrayBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
/* generate Blob */
let blob = new Blob([ab], {type: 'application/octet-stream'});
/* write Blob to device */
2023-01-05 23:33:49 +00:00
this.file.writeFile(url, filename, blob, {replace: true});
```
## Demo
2023-09-11 04:44:15 +00:00
The app in this demo will display data in a table.
2024-04-26 04:16:13 +00:00
On load, a [test file ](https://docs.sheetjs.com/pres.numbers ) will be processed.
2023-09-11 04:44:15 +00:00
When a document is selected with the file picker, it will be processed and the
table will refresh to show the contents.
"Import Data" will attempt to read `SheetJSIonic.xlsx` from a known location. An
alert will display the expected location.
"Export Data" will attempt to export the table data to `SheetJSIonic.xlsx` in a
known location. After writing, an alert will display the location of the file.
### Platform Setup
2025-03-31 02:09:31 +00:00
0) Disable telemetry:
```bash
npx -y @ionic/cli config set -g telemetry false
npx -y @capacitor/cli telemetry off
```
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
1) Follow the official instructions for iOS and Android development[^9].
2024-06-03 03:25:20 +00:00
< details >
< summary > < b > Installation Notes< / b > (click to show)< / summary >
Ionic requires Java 17.
< / details >
2023-09-11 04:44:15 +00:00
2) Install required global dependencies:
2023-01-05 23:33:49 +00:00
```bash
2023-10-28 08:57:22 +00:00
npm i -g cordova cordova-res @angular/cli native-run @ionic/cli
2023-01-05 23:33:49 +00:00
```
2024-06-03 03:25:20 +00:00
:::note pass
In some systems, the command must be run as the root user:
```bash
sudo npm i -g cordova cordova-res @angular/cli native-run @ionic/cli
```
:::
2023-09-11 04:44:15 +00:00
### Base Project
2023-01-05 23:33:49 +00:00
2023-09-11 04:44:15 +00:00
3) Create a new project:
2023-01-05 23:33:49 +00:00
```bash
2023-03-29 00:26:39 +00:00
ionic start SheetJSIonic blank --type angular --cordova --quiet --no-git --no-link --confirm
2023-01-05 23:33:49 +00:00
```
2023-09-11 04:44:15 +00:00
When asked to select `NgModules` or `Standalone Components` , select `NgModules`
2025-02-24 01:17:05 +00:00
If a prompt asks to confirm Cordova use, enter < kbd > Y< / kbd > to continue.
2023-01-05 23:33:49 +00:00
2025-03-31 02:09:31 +00:00
If a prompt asks to create an Ionic account, enter < kbd > N< / kbd > to opt out.
2023-01-05 23:33:49 +00:00
2023-12-05 03:46:54 +00:00
:::caution pass
2024-06-03 03:25:20 +00:00
Due to conflicts in the dependency tree, the command failed in some test runs.
2023-12-05 03:46:54 +00:00
2024-06-03 03:25:20 +00:00
If the package installation fails, forcefully install all modules:
2023-12-05 03:46:54 +00:00
```bash
cd SheetJSIonic
npm i --force @angular/cli
npm i --force
cd ..
```
:::
2023-09-11 04:44:15 +00:00
4) Set up Cordova:
2023-01-05 23:33:49 +00:00
```bash
2023-03-20 05:44:17 +00:00
cd SheetJSIonic
2023-03-29 00:26:39 +00:00
ionic cordova plugin add cordova-plugin-file
2023-09-11 04:44:15 +00:00
npm i --save @awesome -cordova-plugins/core @awesome -cordova-plugins/file @ionic/cordova -builders
2023-01-05 23:33:49 +00:00
```
2023-09-11 04:44:15 +00:00
:::caution pass
2023-03-29 00:26:39 +00:00
2023-09-11 04:44:15 +00:00
If the `npm i` step fails due to `rxjs` resolution, add the highlighted lines
2023-03-29 00:26:39 +00:00
to `package.json` to force a resolution:
```js title="package.json"
"private": true,
// highlight-start
"overrides": {
"rxjs": "~7.5.0"
},
// highlight-end
"dependencies": {
2023-03-20 05:44:17 +00:00
```
2023-09-11 04:44:15 +00:00
Note that the required `rxjs` version will be displayed in the error log.
2023-05-07 13:58:36 +00:00
After adding the lines, the `npm i` command will succeed.
2023-03-29 00:26:39 +00:00
2023-03-20 05:44:17 +00:00
:::
2023-09-11 04:44:15 +00:00
5) Install dependencies:
2023-01-05 23:33:49 +00:00
2023-04-29 11:21:37 +00:00
< CodeBlock language = "bash" > {`\
2023-05-07 13:58:36 +00:00
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
2023-04-29 11:21:37 +00:00
< / CodeBlock >
2023-01-05 23:33:49 +00:00
2025-02-24 01:17:05 +00:00
6) Add the `@awesome-cordova-plugins/file` plugin to `src/app/app.module.ts` :
2023-01-05 23:33:49 +00:00
2025-02-24 01:17:05 +00:00
```ts title="src/app/app.module.ts (add highlighted lines)"
2023-01-05 23:33:49 +00:00
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
// highlight-next-line
2023-09-11 04:44:15 +00:00
import { File } from '@awesome-cordova-plugins/file/ngx';
2023-01-05 23:33:49 +00:00
@NgModule ({
declarations: [AppComponent],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
// highlight-next-line
providers: [File, { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
bootstrap: [AppComponent],
})
export class AppModule {}
```
2023-09-11 04:44:15 +00:00
7) Download [`home.page.ts` ](pathname:///ionic/home.page.ts ) and replace:
2023-01-05 23:33:49 +00:00
```bash
curl -o src/app/home/home.page.ts -L https://docs.sheetjs.com/ionic/home.page.ts
```
2025-02-24 01:17:05 +00:00
:::note pass
In PowerShell, the command may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'L'.
```
`curl.exe` must be invoked directly:
```bash
curl.exe -o src/app/home/home.page.ts -L https://docs.sheetjs.com/ionic/home.page.ts
```
:::
2025-03-31 02:09:31 +00:00
### Android
8) Add the Android platform to the project:
```bash
ionic cordova platform add android --confirm
npm i --save cordova-android
```
9) Enable file reading and writing in the Android app.
Edit `platforms/android/app/src/main/AndroidManifest.xml` and add the following
two lines before the `application` tag:
```xml title="platforms/android/app/src/main/AndroidManifest.xml (add to file)"
< uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" / >
< uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" / >
```
In the `application` tag, add the attribute `android:requestLegacyExternalStorage="true"` .
10) Build the app and start the emulator:
```bash
ionic cordova emulate android
```
When the app is loaded, a list of Presidents should be displayed. This list is
dynamically generated by fetching and parsing a test file.
:::caution pass
In some test runs, `cordova build android --emulator` step failed with error:
```
Could not find or parse valid build output file
```
This was resolved by forcefully installing `cordova-android` :
```bash
npm i --save cordova-android
```
:::
:::caution pass
In some test runs, Ionic could not find the emulator:
```
ERR_NO_TARGET: No target devices/emulators available.
```
The target emulator can be found by running
```bash
avdmanager list avd
```
In a test run, the output showed a Pixel 3a with the following details:
```text
// highlight-next-line
Name: Pixel_3a_API_34
Device: pixel_3a (Google)
Path: /Users/SheetJS/.android/avd/Pixel_4_API_33.avd
```
The Ionic command accepts a `--target` flag. Pass the emulator name:
```bash
ionic cordova emulate android --target=Pixel_3a_API_34
```
:::
:::caution pass
In some tests, the build failed with a Gradle error:
```
Could not find an installed version of Gradle either in Android Studio,
or on your system to install the gradle wrapper. Please include gradle
in your path or install Android Studio
```
On macOS, this issue was resolved by installing Gradle with Homebrew manager:
```bash
brew install gradle
```
:::
:::danger pass
When the demo was last tested on Android, reading files worked as expected.
However, the generated files were not externally visible from the Files app.
**This is a known bug with Android SDK 33 and the underlying file plugins!**
:::
2025-02-24 01:17:05 +00:00
2023-09-11 04:44:15 +00:00
### iOS
2025-03-31 02:09:31 +00:00
:::danger pass
**iOS testing can only be performed on Apple hardware running macOS!**
Xcode and iOS simulators are not available on Windows or Linux.
:::
11) Add the iOS platform to the project:
```bash
ionic cordova platform add ios --confirm
```
:::note pass
If `cordova-plugin-file` is added before the platforms, installation may fail:
```
CordovaError: Could not load API for ios project
```
This can be resolved by removing and reinstalling the `ios` platform:
```bash
ionic cordova platform rm ios
ionic cordova platform add ios --confirm
```
:::
12) Enable file sharing and make the documents folder visible in the iOS app.
2023-09-11 04:44:15 +00:00
Add the following lines to `platforms/ios/SheetJSIonic/SheetJSIonic-Info.plist` :
```xml title="platforms/ios/SheetJSIonic/SheetJSIonic-Info.plist (add to file)"
< 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)
2025-03-31 02:09:31 +00:00
13) Build the app and start the simulator
2023-01-05 23:33:49 +00:00
```bash
2023-03-29 00:26:39 +00:00
ionic cordova emulate ios
2023-01-05 23:33:49 +00:00
```
2023-09-11 04:44:15 +00:00
When the app is loaded, a list of Presidents should be displayed. This list is
dynamically generated by fetching and parsing a test file.
:::caution pass
2023-01-05 23:33:49 +00:00
2023-03-20 05:44:17 +00:00
In some test runs, the `cordova build ios --emulator` step failed with error:
```
> cordova build ios --emulator
Could not load API for ios project
```
This was resolved by forcefully installing `cordova-ios` :
```bash
npm i --save cordova-ios
```
:::
2023-03-29 00:26:39 +00:00
2023-09-11 04:44:15 +00:00
:::info pass
In the most recent test, the `native-run ios` command failed with
```
[native-run] ERR_UNKNOWN: Path 'platforms/ios/build/emulator/SheetJSIonic.app' not found
```
Inspecting `platforms/ios/build/` , the actual folder name was:
```bash
% ls platforms/ios/build
#highlight-next-line
Debug-iphonesimulator
```
The iOS simulator can be launched manually:
```bash
native-run ios --app platforms/ios/build/Debug-iphonesimulator/SheetJSIonic.app --virtual
```
:::
2023-12-05 03:46:54 +00:00
:::caution pass
In some tests, the `emulate` command failed with:
```
Error: Unknown argument: platform
[ERROR] An error occurred while running subprocess ng.
ng run app:ionic-cordova-build --platform=ios exited with exit code 1.
```
The fix is to manually add `@ionic/cordova-builders` :
```bash
ng add @ionic/cordova -builders
```
:::
2025-03-31 02:09:31 +00:00
### iOS Device
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
14) Connect an iOS device to the computer and "Trust" the device if prompted.
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
15) Enable code signing for the project:
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
Open the `SheetJSIonic.xcodeproj` project in Xcode:
```bash
open platforms/ios/SheetJSIonic.xcodeproj
2023-09-11 04:44:15 +00:00
```
2025-03-31 02:09:31 +00:00
Select the "SheetJSIonic" project in the "Project navigator" side panel.
In the main panel, select "Signing & Capabilities".
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
In the "Team" dropdown, select a certificate.
In the "Bundle Identifier" text box, enter `com.sheetjs.SheetJSIonic`
16) Launch the app on the device:
2023-03-29 00:26:39 +00:00
```bash
2025-03-31 02:09:31 +00:00
ionic cordova run ios --device --verbose
2023-03-29 00:26:39 +00:00
```
2025-03-31 02:09:31 +00:00
:::info pass
2023-03-29 00:26:39 +00:00
2025-03-31 02:09:31 +00:00
In the most recent test, the `native-run ios` command failed with
2023-03-29 00:26:39 +00:00
```
2025-03-31 02:09:31 +00:00
[native-run] ERR_UNKNOWN: Path 'platforms/ios/build/device/SheetJSIonic.ipa' not found
2023-03-29 00:26:39 +00:00
```
2025-03-31 02:09:31 +00:00
Inspecting `platforms/ios/build/` , the actual folder name was:
2023-03-29 00:26:39 +00:00
```bash
2025-03-31 02:09:31 +00:00
% ls platforms/ios/build
#highlight-next-line
Debug-iphoneos
2023-03-29 00:26:39 +00:00
```
2025-03-31 02:09:31 +00:00
To force `native-run` to use the device, the name must be found by inspecting
the output of `native-run ios --list` :
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
```bash
% native-run ios --list
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
Connected Devices:
Name API Target ID
---------------------------------------------
SheetJS iOS 15.6 12345678-90ABCDEF12345678
2023-09-11 04:44:15 +00:00
```
2025-03-31 02:09:31 +00:00
`native-run` accepts a `--device` flag. Pass the device name:
2023-09-11 04:44:15 +00:00
```bash
2025-03-31 02:09:31 +00:00
native-run ios --app platforms/ios/build/Debug-iphoneos/SheetJSIonic.ipa --device SheetJS
2023-09-11 04:44:15 +00:00
```
:::
2025-03-31 02:09:31 +00:00
17) Test the app.
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
The app will fetch a file and display the contents in a table.
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
Tap "Export Data" to create a file. To find the file, switch to the "Files" app
and browse "On My iPhone" > "SheetJSIonic". There should be a new spreadsheet
named "SheetJSIonic".
2023-09-11 04:44:15 +00:00
2025-03-31 02:09:31 +00:00
Switch to the "Numbers" app and open that file. Tap "EDIT" to make changes.
Change cell A7 to "SheetJS Dev" and cell B7 to 47. Tap "Done" and close the app.
Switch back to "SheetJSIonic" and tap "Import Data". Tap "Choose Files" in the
popup. Tap "Browse" in the bottom of the sheet. Navigate to "On My iPhone" >
"SheetJSIonic" and tap the new "SheetJSIonic" spreadsheet. The screen will show
the file with the new line.
2023-09-11 04:44:15 +00:00
[^1]: See ["Array of Arrays" in the API reference ](/docs/api/utilities/array#array-of-arrays )
[^2]: See [`ion-grid` ](https://ionicframework.com/docs/api/grid ) in the Ionic documentation.
[^3]: See [`ngFor` ](https://angular.io/api/common/NgFor ) in the Angular documentation.
[^4]: See [`read` in "Reading Files" ](/docs/api/parse-options )
[^5]: See ["Array Output" in "Utility Functions" ](/docs/api/utilities/array#array-output )
[^6]: See [`aoa_to_sheet` in "Utilities" ](/docs/api/utilities/array#array-of-arrays-input )
[^7]: See ["Workbook Helpers" in "Utilities" ](/docs/api/utilities/wb ) for details on `book_new` and `book_append_sheet` .
[^8]: See [`write` in "Writing Files" ](/docs/api/write-options )
2024-06-03 03:25:20 +00:00
[^9]: See ["Developing for iOS" ](https://ionic-docs-o31kiyk8l-ionic1.vercel.app/docs/v6/developing/ios ) and ["Developing for Android" ](https://ionic-docs-o31kiyk8l-ionic1.vercel.app/docs/v6/developing/android ). The Ionic team removed these pages from the official docs site and recommend the `vercel.app` docs site.
[^10]: See the [JDK Archive ](https://jdk.java.net/archive/ ) for Java 17 JDK download links.