Generate Report Events

This demo shows how to listen to ReportGenerationStageChanged while a ReportSheet is generating, and update the loading tip text dynamically for each stage.

Open the demo in new window can open the designer This demo shows how to listen to ReportGenerationStageChanged while a ReportSheet is generating, and update the loading tip text dynamically for each stage. It tracks these stages: analyzing-template loading-data generating-report When each stage starts, the tip is updated and render mode is refreshed asynchronously. When generating-report ends, the loading tip is hidden. Sample Code
window.onload = async () => { const loadingTip = createLoadingTip(); showLoading(loadingTip, 'Loading spread json...'); const { spread, designer } = createSpreadAndDesigner(); bindReportGenerationStageEvents(spread, loadingTip); const res = await fetch('$DEMOROOT$/en/sample/features/report-sheet/generate-report-events/spread.json'); await spread.fromJSON(await res.json()); window.spread = spread; if (designer) { rewriteReportPreviewCommands(designer); designer.refresh(); } await spread.getActiveSheetTab().setRenderModeAsync('Preview'); } function createSpreadAndDesigner() { const demoHost = document.getElementById('demo-host'); if (window !== top) { return { spread: new GC.Spread.Sheets.Workbook(demoHost, { sheetCount: 1 }), } } else { const designer = new GC.Spread.Sheets.Designer.Designer(demoHost, undefined, undefined, { sheetCount: 1 }); return { designer, spread: designer.getWorkbook(), } } } function rewriteReportPreviewCommands(designer) { const statesNames = GC.Spread.Sheets.Designer.StatesNames; const previewCmd = GC.Spread.Sheets.Designer.getCommand(GC.Spread.Sheets.Designer.CommandNames.ReportSheetDataEntryPreview); previewCmd.execute = async (context) => { const report = context.Spread.getActiveSheetTab(); if (report) { await report.setRenderModeAsync('Preview'); } context.setData(statesNames.ParameterPanelVisible, true); }; const paginatedPreviewCmd = GC.Spread.Sheets.Designer.getCommand(GC.Spread.Sheets.Designer.CommandNames.ReportSheetPaginatedPreview); paginatedPreviewCmd.execute = async (context) => { const report = context.Spread.getActiveSheetTab(); if (report) { await report.setRenderModeAsync('PaginatedPreview'); } context.setData(statesNames.ParameterPanelVisible, true); }; const config = GC.Spread.Sheets.Designer.DefaultConfig; config.commandMap = { [GC.Spread.Sheets.Designer.CommandNames.ReportSheetDataEntryPreview]: previewCmd, [GC.Spread.Sheets.Designer.CommandNames.ReportSheetPaginatedPreview]: paginatedPreviewCmd }; designer.setConfig(config); } function bindReportGenerationStageEvents(spread, loadingTip) { spread.bind( GC.Spread.Sheets.Events.ReportGenerationStageChanged, (sender, args) => { const { stage, phase } = args || {}; if (phase === 'start') { switch (stage) { case 'analyzing-template': showLoading(loadingTip, 'Analyzing template...', phase); break; case 'loading-data': showLoading(loadingTip, 'Loading data...', phase); break; case 'generating-report': showLoading(loadingTip, 'Generating report...', phase); break; default: break; } } if (phase === 'end' && stage === 'generating-report') { hideLoading(loadingTip); } } ); } function createLoadingTip() { if (!document.getElementById('report-loading-tip-style')) { const style = document.createElement('style'); style.id = 'report-loading-tip-style'; style.textContent = ` @keyframes report-loading-spin { to { transform: rotate(360deg); } } `; document.head.appendChild(style); } const div = document.createElement('div'); div.style.position = 'absolute'; div.style.inset = '0'; div.style.display = 'none'; div.style.alignItems = 'center'; div.style.justifyContent = 'center'; div.style.background = 'rgba(246, 248, 252, 0.82)'; div.style.backdropFilter = 'blur(2px)'; div.style.zIndex = '1000'; div.innerHTML = ` <div style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:12px;background:#ffffff;border:1px solid #e4e7ec;box-shadow:0 8px 24px rgba(16,24,40,0.12);"> <div style="width:18px;height:18px;border:2px solid #d0d5dd;border-top-color:#1570ef;border-radius:50%;animation:report-loading-spin .9s linear infinite;"></div> <span data-role="tip-text" style="font:600 14px/1.3 'Segoe UI',Arial,sans-serif;color:#101828;letter-spacing:.1px;"></span> </div> `; document.body.appendChild(div); return div; } function showLoading(loadingTip, text, phase) { if (!loadingTip) return; loadingTip.style.display = 'flex'; const tipText = loadingTip.querySelector('[data-role="tip-text"]'); if (tipText) { tipText.textContent = text; } } function hideLoading(loadingTip) { if (!loadingTip) return; loadingTip.style.display = 'none'; }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer/styles/gc.spread.sheets.designer.light.min.css"> <link rel="stylesheet" type="text/css" href="styles.css"> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-print/dist/gc.spread.sheets.print.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-reportsheet-addon/dist/gc.spread.report.reportsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script> const designerDependencyScripts = [ '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-barcode/dist/gc.spread.sheets.barcode.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-pdf/dist/gc.spread.sheets.pdf.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-slicers/dist/gc.spread.sheets.slicers.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-formula-panel/dist/gc.spread.sheets.formulapanel.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-io/dist/gc.spread.sheets.io.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer-resources-en/dist/gc.spread.sheets.designer.resource.en.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer/dist/gc.spread.sheets.designer.all.min.js', '$DEMOROOT$/spread/source/js/designer/license.js', ] function appendScriptNode (src) { const script = document.createElement('script'); script.src = src; script.async = false; script.type = 'text/javascript'; document.head.appendChild(script); } if (top === window) { // not in iframe designerDependencyScripts.forEach(appendScriptNode); } </script> <script src="app.js" type="text/javascript"></script> </head> <body> <div class="sample-tutorial"> <div id="demo-host"></div> </div> </body> </html>
body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } #demo-host { width: 100%; height: 100%; overflow: hidden; float: left; }