119 lines
3.4 KiB
TypeScript
119 lines
3.4 KiB
TypeScript
// @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}.`);
|
|
|