| 
									
										
										
										
											2022-08-04 03:00:20 +00:00
										 |  |  | /* 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]; | 
					
						
							| 
									
										
										
										
											2022-08-08 06:59:57 +00:00
										 |  |  |   const data = await f.arrayBuffer(); | 
					
						
							| 
									
										
										
										
											2022-08-04 03:00:20 +00:00
										 |  |  |   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); |