import { PortalUtils } from '../utils/utils'; export interface ExcelExportDataSource { sheets: ExcelExportSheet[]; outputFileName: string; } export interface ExcelExportSheet { headers: ExcelExportHeader[]; rows: string[][]; sheetName: string; } export interface ExcelExportHeader { caption: string; width?: number; } export class ExcelJsProvider { private static _excelJs: any = null; static getExcelJs(): Promise { if (ExcelJsProvider.excelJsInstance() != null) { return new Promise((resolve, reject) => { resolve(ExcelJsProvider._excelJs); }); } return new Promise((resolve, reject) => { import('exceljs/dist/exceljs.js') .then((excelWrapper) => { ExcelJsProvider._excelJs = excelWrapper; resolve(excelWrapper); }) .catch((reason) => { reject(reason); }); }); } static exportToExcel(args: ExcelExportDataSource): Promise { return new Promise((resolve, reject) => { ExcelJsProvider.getExcelJs() .then(() => { let colArr = []; const workbook = new (ExcelJsProvider.excelJsInstance().Workbook)(); workbook.created = new Date(); workbook.modified = new Date(); workbook.lastPrinted = new Date(); args.sheets.forEach((sheet) => { sheet.headers.forEach((item) => { colArr.push({ header: item.caption, width: item.width != null ? item.width : 25, }); }); const worksheet = workbook.addWorksheet(sheet.sheetName); worksheet.columns = colArr; colArr = []; worksheet.views = [{ state: 'frozen', xSplit: 0, ySplit: 1 }]; const firstRow = worksheet.getRow(1); firstRow.font = { name: 'Arial', family: 4, size: 10, bold: true, color: { argb: '00000000' }, bgColor: { argb: '80EF1C1C' }, }; firstRow.alignment = { vertical: 'middle', horizontal: 'center' }; firstRow.height = 20; firstRow._cells.forEach((cell) => { cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'cccccc' }, }; }); sheet.rows.forEach((rowArr) => { const rowExportData = []; rowArr.forEach((rowItem) => { rowExportData.push(rowItem); }); worksheet.addRow(rowExportData); }); }); const mySelf = this; workbook.xlsx .writeBuffer() .then((data: any) => { const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); PortalUtils.downloadBlob( blob, args.outputFileName, () => { resolve(null); }, ); }) .catch((err) => { reject(err); }); }) .catch((err) => { reject(err); }); }); } static excelJsInstance(): any { return ExcelJsProvider._excelJs; } }