// @deno-types="https://cdn.sheetjs.com/xlsx-0.20.0/package/types/index.d.ts" import { read, utils, set_cptable, version } from 'https://cdn.sheetjs.com/xlsx-0.20.0/package/xlsx.mjs'; import * as cptable from 'https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/cpexcel.full.mjs'; set_cptable(cptable); import * as Drash from "https://deno.land/x/drash@v2.5.4/mod.ts"; class SheetJSResource extends Drash.Resource { public paths = ["/"]; public OPTIONS(request: Drash.Request, response: Drash.Response) { const allHttpMethods: string[] = [ "GET", "POST", "PUT", "DELETE" ]; response.headers.set("Allow", allHttpMethods.join()); response.headers.set("Access-Control-Allow-Methods", allHttpMethods.join()); response.headers.set("access-control-allow-origin", "*"); response.status_code = 204; return response; } public POST(request: Drash.Request, response: Drash.Response) { const file = request.bodyParam<Drash.Types.BodyFile>("file"); const type = request.bodyParam<string>("type"); try { response.headers.set("access-control-allow-origin", "*"); } catch(e) {} if (!file) throw new Error("File is required!"); var wb = read(file.content, {type: "buffer", dense: true}); return response.html( (type == "csv" ? utils.sheet_to_csv : utils.sheet_to_html)(wb.Sheets[wb.SheetNames[0]])); } public GET(request: Drash.Request, response: Drash.Response): void { try { response.headers.set("access-control-allow-origin", "*"); } catch(e) {} return response.html(`\ <!DOCTYPE html> <html> <head> <title>SheetJS Spreadsheet to HTML Conversion Service</title> <meta charset="utf-8" /> <style> * { padding: 0; margin: 0; box-sizing: border-box; } html, body { width: 100vw; max-width: 100%; font-size: 16px; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; -webkit-font-smoothing: antialiased; background: white; color: black; } body { padding-top: 5px; max-width: 760px; margin-left: auto; margin-right: auto; } table { border-collapse: collapse; } table, tr, th, td { border: 1px solid; } div { padding: 5px; } li { margin: 5px 0;} </style> </head> <body> <h2><a href="//sheetjs.com/">SheetJS</a> Spreadsheet Conversion Service</h2> <br/> <h3>API</h3> <br/> Send a <code>POST</code> request to <a id="u">https://s2c.sheetjs.com</a> with the file in the <code>file</code> body parameter:<br/> <br/> <pre> curl -X POST -F"file=@pres.numbers" <span id="v">https://s2c.sheetjs.com/</span> </pre> <br/> The response will be an HTML TABLE generated from the first worksheet. <br/><br/> For CSV data, pass the parameter <code>type=csv</code>:<br/> <br/> <pre> curl -X POST -F"file=@pres.numbers" -F"type=csv" <span id="w">https://s2c.sheetjs.com/</span> </pre> <br/><br/> <h3>Try it out!</h3> <br/> <form action="/" method="post" enctype="multipart/form-data"> <input type="file" name="file" /><br/><br/> Use the file input element to select a file, then click "Submit"<br/><br/> <button type="submit">Submit</button><br/><br/> </form> SheetJS Library Version: <code>${version}</code> </body> <script>w.innerHTML = v.innerHTML = u.innerHTML = u.href = window.location;</script> </html>`, ); } } const server = new Drash.Server({ hostname: "", port: 3000, protocol: "http", resources: [ SheetJSResource, ], }); server.run(); console.log(`Server running at ${server.address}.`);