94 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
|  | #!/bin/bash
 | ||
|  | # https://docs.sheetjs.com/docs/demos/frontend/bundler/parcel | ||
|  | cd /tmp | ||
|  | rm -rf sheetjs-parceljs | ||
|  | 
 | ||
|  | mkdir sheetjs-parceljs | ||
|  | cd sheetjs-parceljs | ||
|  | npm init -y | ||
|  | 
 | ||
|  | npm i --save https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz | ||
|  | 
 | ||
|  | cat >index.html <<EOF | ||
|  | <body> | ||
|  | <h3>SheetJS <span id="vers"></span> export demo</h3> | ||
|  | <button id="xport">Click to Export!</button> | ||
|  | <script src="index.js" type="module"></script> | ||
|  | <body> | ||
|  | EOF | ||
|  | 
 | ||
|  | cat >index.js <<EOF | ||
|  | // ESM-style import from "xlsx" | ||
|  | import { utils, version, writeFileXLSX } from 'xlsx'; | ||
|  | 
 | ||
|  | document.getElementById("vers").innerText = version; | ||
|  | document.getElementById("xport").onclick = async() => { | ||
|  |   /* fetch JSON data and parse */ | ||
|  |   const url = "https://docs.sheetjs.com/executive.json"; | ||
|  |   const raw_data = await (await fetch(url)).json(); | ||
|  | 
 | ||
|  |   /* filter for the Presidents */ | ||
|  |   const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez")); | ||
|  | 
 | ||
|  |   /* sort by first presidential term */ | ||
|  |   prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start); | ||
|  |   prez.sort((l,r) => l.start.localeCompare(r.start)); | ||
|  | 
 | ||
|  |   /* flatten objects */ | ||
|  |   const rows = prez.map(row => ({ | ||
|  |     name: row.name.first + " " + row.name.last, | ||
|  |     birthday: row.bio.birthday | ||
|  |   })); | ||
|  | 
 | ||
|  |   /* generate worksheet and workbook */ | ||
|  |   const worksheet = utils.json_to_sheet(rows); | ||
|  |   const workbook = utils.book_new(); | ||
|  |   utils.book_append_sheet(workbook, worksheet, "Dates"); | ||
|  | 
 | ||
|  |   /* fix headers */ | ||
|  |   utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); | ||
|  | 
 | ||
|  |   /* calculate column width */ | ||
|  |   const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); | ||
|  |   worksheet["!cols"] = [ { wch: max_width } ]; | ||
|  | 
 | ||
|  |   /* create an XLSX file and try to save to Presidents.xlsx */ | ||
|  |   writeFileXLSX(workbook, "Presidents.xlsx"); | ||
|  | }; | ||
|  | EOF | ||
|  | 
 | ||
|  | cat >test.js <<EOF | ||
|  | const puppeteer = require('puppeteer'); | ||
|  | const express = require('express'); | ||
|  | const app = express(); | ||
|  | app.use(express.static('./dist')); | ||
|  | app.listen(7262, async() => { | ||
|  |   await new Promise((res,rej) => setTimeout(res, 1000)); | ||
|  |   const browser = await puppeteer.launch(); | ||
|  |   const page = await browser.newPage(); | ||
|  |   page.on("console", msg => console.log("PAGE LOG:", msg.text())); | ||
|  |   await page.setViewport({width: 1920, height: 1080}); | ||
|  |   const client = await page.target().createCDPSession(); | ||
|  |   await client.send('Browser.setDownloadBehavior', { | ||
|  |     behavior: 'allow', | ||
|  |     downloadPath: require("path").resolve('./') | ||
|  |   }); | ||
|  |   page.on('request', req => console.log(req.url())); | ||
|  |   await page.goto('http://localhost:7262/'); | ||
|  |   await new Promise((res,rej) => setTimeout(res, 1000)); | ||
|  |   await page.click("#xport"); | ||
|  |   await new Promise((res,rej) => setTimeout(res, 1000)); | ||
|  |   await browser.close(); | ||
|  |   process.exit(); | ||
|  | }); | ||
|  | EOF | ||
|  | 
 | ||
|  | node -e 'var pjson = JSON.parse(fs.readFileSync("./package.json")); console.log(pjson); delete pjson.main; fs.writeFileSync("package.json", JSON.stringify(pjson))' | ||
|  | 
 | ||
|  | for n in 1.12.4 2.12.0; do | ||
|  |   npx -y parcel build index.html | ||
|  |   node test.js | ||
|  |   npx -y xlsx-cli Presidents.xlsx | head -n 3 | ||
|  |   rm -f Presidents.xlsx | ||
|  | done |