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);
 |