forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			84 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
							 | 
						||
| 
								 | 
							
								/* vim: set ts=2: */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { Component } from "@angular/core";
							 | 
						||
| 
								 | 
							
								import * as dockModule from "tns-core-modules/ui/layouts/dock-layout";
							 | 
						||
| 
								 | 
							
								import * as buttonModule from "tns-core-modules/ui/button";
							 | 
						||
| 
								 | 
							
								import * as textModule from "tns-core-modules/text";
							 | 
						||
| 
								 | 
							
								import * as dialogs from "ui/dialogs";
							 | 
						||
| 
								 | 
							
								import * as fs from "tns-core-modules/file-system";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* NativeScript does not support import syntax for npm modules */
							 | 
						||
| 
								 | 
							
								const XLSX = require("./xlsx.full.min.js");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@Component({
							 | 
						||
| 
								 | 
							
								  selector: "my-app",
							 | 
						||
| 
								 | 
							
								  template: `
							 | 
						||
| 
								 | 
							
								    <GridLayout rows="auto, *, auto">
							 | 
						||
| 
								 | 
							
								      <ActionBar row="0" title="SheetJS NativeScript Demo" class="action-bar"></ActionBar>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      <!-- data converted to HTML and rendered in web view -->
							 | 
						||
| 
								 | 
							
								      <WebView row="1" src="{{html}}"></WebView>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      <DockLayout row="2" dock="bottom" stretchLastChild="false">
							 | 
						||
| 
								 | 
							
								        <Button text="Import File" (tap)="import()" style="padding: 10px"></Button>
							 | 
						||
| 
								 | 
							
								        <Button text="Export File" (tap)="export()" style="padding: 10px"></Button>
							 | 
						||
| 
								 | 
							
								      </DockLayout>
							 | 
						||
| 
								 | 
							
								    </GridLayout>
							 | 
						||
| 
								 | 
							
								  `
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export class AppComponent {
							 | 
						||
| 
								 | 
							
								  html: string = "";
							 | 
						||
| 
								 | 
							
								  constructor() {
							 | 
						||
| 
								 | 
							
								    const ws = XLSX.utils.aoa_to_sheet([[1,2],[3,4]]);
							 | 
						||
| 
								 | 
							
								    this.html = XLSX.utils.sheet_to_html(ws);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Import button */
							 | 
						||
| 
								 | 
							
								  async import() {
							 | 
						||
| 
								 | 
							
								    const filename: string = "SheetJSNS.xlsx";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* find appropriate path */
							 | 
						||
| 
								 | 
							
								    const target: fs.Folder = fs.knownFolders.documents() || fs.knownFolders.ios.sharedPublic();
							 | 
						||
| 
								 | 
							
								    const url: string = fs.path.normalize(target.path + "///" + filename);
							 | 
						||
| 
								 | 
							
								    const file: fs.File = fs.File.fromPath(url);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      /* get binary string */
							 | 
						||
| 
								 | 
							
								      const bstr: string = await file.readText(textModule.encoding.ISO_8859_1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      /* read workbook */
							 | 
						||
| 
								 | 
							
								      const wb = XLSX.read(bstr, { type: "binary" });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      /* grab first sheet */
							 | 
						||
| 
								 | 
							
								      const wsname: string = wb.SheetNames[0];
							 | 
						||
| 
								 | 
							
								      const ws = wb.Sheets[wsname];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      /* update table */
							 | 
						||
| 
								 | 
							
								      this.html = XLSX.utils.sheet_to_html(ws);
							 | 
						||
| 
								 | 
							
								      dialogs.alert(`Attempting to read to SheetJSNS.xlsx in ${url}`);
							 | 
						||
| 
								 | 
							
								    } catch(e) {
							 | 
						||
| 
								 | 
							
								      dialogs.alert(e.message);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Export button */
							 | 
						||
| 
								 | 
							
								  async export() {
							 | 
						||
| 
								 | 
							
								    const wb = XLSX.read(this.html, { type: "string" });
							 | 
						||
| 
								 | 
							
								    const filename: string = "SheetJSNS.xlsx";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* generate binary string */
							 | 
						||
| 
								 | 
							
								    const wbout: string = XLSX.write(wb, { bookType: 'xlsx', type: 'binary' });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* find appropriate path */
							 | 
						||
| 
								 | 
							
								    const target: fs.Folder = fs.knownFolders.documents() || fs.knownFolders.ios.sharedPublic();
							 | 
						||
| 
								 | 
							
								    const url: string = fs.path.normalize(target.path + "///" + filename);
							 | 
						||
| 
								 | 
							
								    const file: fs.File = fs.File.fromPath(url);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* attempt to save binary string to file */
							 | 
						||
| 
								 | 
							
								    await file.writeText(wbout, textModule.encoding.ISO_8859_1);
							 | 
						||
| 
								 | 
							
								    dialogs.alert(`Wrote to SheetJSNS.xlsx in ${url}`);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |