forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			74 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /* sheetjs (C) 2013-present SheetJS -- https://sheetjs.com */ | ||
|  | const XLSX = require('xlsx'); | ||
|  | const electron = require('@electron/remote'); | ||
|  | 
 | ||
|  | /* list of supported extensions */ | ||
|  | const EXTENSIONS = "xls|xlsx|xlsm|xlsb|xml|csv|txt|dif|sylk|slk|prn|ods|fods|htm|html|numbers".split("|"); | ||
|  | 
 | ||
|  | /* write file with Electron API */ | ||
|  | async function exportFile() { | ||
|  |   const HTMLOUT = document.getElementById('htmlout'); | ||
|  |   const wb = XLSX.utils.table_to_book(HTMLOUT.getElementsByTagName("TABLE")[0]); | ||
|  |   const o = await electron.dialog.showSaveDialog({ | ||
|  |     title: 'Save file as', | ||
|  |     filters: [{ | ||
|  |       name: "Spreadsheets", | ||
|  |       extensions: EXTENSIONS | ||
|  |     }] | ||
|  |   }); | ||
|  |   XLSX.writeFile(wb, o.filePath); | ||
|  |   electron.dialog.showMessageBox({ message: "Exported data to " + o.filePath, buttons: ["OK"] }); | ||
|  | } | ||
|  | document.getElementById('exportBtn').addEventListener('click', exportFile, false); | ||
|  | 
 | ||
|  | /* common handler to create HTML tables on the page */ | ||
|  | function process_wb(wb) { | ||
|  |   const HTMLOUT = document.getElementById('htmlout'); | ||
|  |   const XPORT = document.getElementById('exportBtn'); | ||
|  |   XPORT.disabled = false; | ||
|  |   HTMLOUT.innerHTML = ""; | ||
|  |   wb.SheetNames.forEach(function(sheetName) { | ||
|  |     const htmlstr = XLSX.utils.sheet_to_html(wb.Sheets[sheetName],{editable:true}); | ||
|  |     HTMLOUT.innerHTML += htmlstr; | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | /* read file with Electron API */ | ||
|  | async function handleReadBtn() { | ||
|  |   const o = await electron.dialog.showOpenDialog({ | ||
|  |     title: 'Select a file', | ||
|  |     filters: [{ | ||
|  |       name: "Spreadsheets", | ||
|  |       extensions: EXTENSIONS | ||
|  |     }], | ||
|  |     properties: ['openFile'] | ||
|  |   }); | ||
|  |   if(o.filePaths.length == 0) throw new Error("No file was selected!"); | ||
|  |   process_wb(XLSX.readFile(o.filePaths[0])); | ||
|  | } | ||
|  | document.getElementById('readBtn').addEventListener('click', handleReadBtn, false); | ||
|  | 
 | ||
|  | /* read file with Web APIs */ | ||
|  | async function readFile(files) { | ||
|  |   const f = files[0]; | ||
|  | 	const data = await f.arrayBuffer(); | ||
|  |   process_wb(XLSX.read(data)); | ||
|  | } | ||
|  | 
 | ||
|  | // file input element
 | ||
|  | document.getElementById('readIn').addEventListener('change', (e) => { readFile(e.target.files); }, false); | ||
|  | 
 | ||
|  | // drag and drop
 | ||
|  | const drop = document.getElementById('drop'); | ||
|  | drop.addEventListener('drop', (e) => { | ||
|  |   e.stopPropagation(); e.preventDefault(); | ||
|  |   readFile(e.dataTransfer.files); | ||
|  | }, false); | ||
|  | 
 | ||
|  | const handleDrag = (e) => { | ||
|  |   e.stopPropagation(); e.preventDefault(); | ||
|  |   e.dataTransfer.dropEffect = 'copy'; | ||
|  | }; | ||
|  | drop.addEventListener('dragenter', handleDrag, false); | ||
|  | drop.addEventListener('dragover', handleDrag, false); |