Stop conversion or loading using InterruptMonitor when it is taking too long with JavaScript via C++
Possible Usage Scenarios
Aspose.Cells for JavaScript via C++ allows you to stop the conversion of Workbook to various formats like PDF, HTML etc. using the InterruptMonitor object when it is taking too long. The conversion process is often both CPU and Memory intensive and it is often useful to halt it when resources are limited. You can use InterruptMonitor both for stopping conversion as well as to stop loading huge workbook. Please use Workbook.interruptMonitor property for stopping conversion and LoadOptions.interruptMonitor property for loading huge workbook.
Stop conversion or loading using InterruptMonitor when it is taking too long
The following sample code explains the usage of InterruptMonitor object. The code converts quite a large Excel file to PDF. It will take several seconds (i.e. more than 30 seconds) to get it converted because of these lines of code.
// Access cell J1000000 and add some text inside it.
let cell = ws.cells.get("J1000000");
cell.putValue("This is text.");
As you see J1000000 is quite a farther cell in XLSX file. However, the waitForWhileAndThenInterrupt() method interrupts the conversion after 10 seconds and the program ends/terminates. Please use the following code to execute the sample code.
new StopConversionOrLoadingUsingInterruptMonitor().testRun();
Sample Code
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
<meta charset="utf-8" />
</head>
<body>
<h1>Stop Conversion Using InterruptMonitor Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat, Utils, InterruptMonitor } = AsposeCells;
AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: [
"arial.ttf",
"NotoSansSC-Regular.ttf"
]
}).then(() => {
console.log("Aspose.Cells initialized");
});
class StopConversionOrLoadingUsingInterruptMonitor {
static outputDir = "output"; // browser uses filename directly
constructor() {
// Create InterruptMonitor object
this.im = new InterruptMonitor();
this._timeoutId = null;
}
// This function will create workbook and convert it to Pdf format
async createWorkbookAndConvertItToPdfFormat(monitorThread, fileUint8Array) {
// Create a workbook object
let wb;
if (fileUint8Array) {
// Opening the Excel file through the file stream
wb = new Workbook(fileUint8Array);
} else {
wb = new Workbook();
}
// Assign it InterruptMonitor object
wb.interruptMonitor = this.im;
// Access first worksheet
const ws = wb.worksheets.get(0);
// Access cell J1000000 and add some text inside it.
const cell = ws.cells.get("J1000000");
cell.value = "This is text.";
// Save the workbook to Pdf format (async) and provide download
const outputData = await wb.saveAsync(SaveFormat.Pdf);
const blob = new Blob([outputData], { type: "application/pdf" });
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'output_InterruptMonitor.pdf';
downloadLink.style.display = 'block';
downloadLink.textContent = 'Download PDF File';
document.getElementById('result').innerHTML = '<p style="color: green;">Excel to PDF - Successful Conversion. Click the download link to get the PDF file.</p>';
// Stop monitor thread (clear scheduled interrupt)
if (monitorThread && typeof monitorThread.interrupt === 'function') {
monitorThread.interrupt();
}
}
// This function will interrupt the conversion process after 10s
waitForWhileAndThenInterrupt() {
// schedule an interrupt after 10 seconds
this._timeoutId = setTimeout(() => {
this.im.interrupt();
}, 1000 * 10);
// return a monitorThread object that can cancel the scheduled interrupt
return {
interrupt: () => {
if (this._timeoutId !== null) {
clearTimeout(this._timeoutId);
this._timeoutId = null;
}
}
};
}
async testRun(fileUint8Array) {
const monitorThread = this.waitForWhileAndThenInterrupt();
await this.createWorkbookAndConvertItToPdfFormat(monitorThread, fileUint8Array);
}
}
document.getElementById('runExample').addEventListener('click', async () => {
const fileInput = document.getElementById('fileInput');
const resultDiv = document.getElementById('result');
// Basic input validation: proceed even if no file (will create a new workbook)
let fileUint8Array = null;
if (fileInput.files && fileInput.files.length) {
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
fileUint8Array = new Uint8Array(arrayBuffer);
}
const example = new StopConversionOrLoadingUsingInterruptMonitor();
// Let errors propagate (no try-catch) as required
await example.testRun(fileUint8Array);
});
</script>
</html>