xlsx-preview
Version:
Preview the .xlsx in the browser, convert to HTML with styles.
53 lines (50 loc) • 1.66 kB
text/typescript
import { Workbook } from "exceljs";
import { setMinimumNumberCols, setMinimumNumberRows } from "./constants/base";
import { sheetsInAll } from "./htmls/genHtmlStructure";
import genSheet from "./htmls/genSheet";
import { XlsxData, XlsxOptions } from "./types";
export async function xlsx2Html(data: XlsxData, options?: XlsxOptions) {
if (options?.minimumRows) {
setMinimumNumberRows(options.minimumRows);
}
if (options?.minimumCols) {
setMinimumNumberCols(options.minimumCols);
}
let buffer: ArrayBuffer;
if (data instanceof Blob) {
buffer = await data.arrayBuffer();
} else if (data instanceof ArrayBuffer) {
buffer = data;
} else {
throw "xlsx2Html(data, options): The parameter data can only be passed ArrayBuffer, Blob or File type";
}
const workbook = new Workbook();
await workbook.xlsx.load(buffer);
const sheetsLen = workbook.worksheets.length;
const sheets: string[] = [];
for (let idx = 0; idx < sheetsLen; idx++) {
const result = await genSheet(workbook.worksheets[idx]);
sheets.push(result);
}
// Separate sheets.
if (options?.separateSheets === true) {
if (options.output === "arrayBuffer") {
const all = sheets.map((sheet) => toBuffer(sheet));
return all;
}
return sheets;
}
const result = sheetsInAll(sheets, workbook.worksheets);
// Output ArrayBuffer
if (options?.output === "arrayBuffer") {
return toBuffer(result);
}
return result;
}
function toBuffer(data: string) {
const blob = new Blob([data], { type: "text/html" });
return blob.arrayBuffer();
}
export default {
xlsx2Html
}