我目前正在使用ExcelJS将大型 Excel 文件(10,000 多行)读取到 NodeJS/Angular/Electron 应用程序中。它可以很好地读取较小的文件,但读取较大的文件需要 3.9 到 5 秒的时间,并且在此期间,CSS 根本不会更新。
我目前正在使用 async/await 来加载文件,因为我认为这将允许在等待文件加载时发生其他操作,因为我认为 Node 中的 I/O 操作有自己的线程。我还了解到 CPU 密集型任务会阻塞所有其他 Node 进程。
这是当前加载工作簿的代码:
async openWorkbook(filename: string) {
this.loading = true;
const workbook = new Workbook();
const promise = workbook.xlsx.readFile(this.path + '/sheets/' + filename)
.then(() => {
// use workbook
workbook.getWorksheet(1).name = workbook.getWorksheet(1).name.slice(0, 31);
const excelFile: ExcelFile = { workbook: workbook, filename: filename };
this.wbSource.next(excelFile);
});
const read = await promise;
}
此代码的工作方式与回调实现相同,它们都会阻止应用程序的 CSS。我如何在不阻塞 UI 的情况下读取文件(或执行任何 CPU 密集型任务)?
最佳答案
在这种情况下,我要做的第一件事是通过根本不“打开”大文件来防止内存开销。
所以像这样的东西应该有效:
const stream = fs.createReadStream(filePath);
const workbook = new Excel.Workbook();
stream.pipe(workbook.xlsx.createInputStream());
以及那些chunks阻塞循环一小段时间,即使在 javascript 事件循环中也可以使用它;)
关于javascript - 如何在 NodeJS 中读取大文件(Excel)而不暂停 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527356/