如何在Angular 2中判断Excel文件是否包含宏?
解决XLSX库判断Excel含宏的问题
我来帮你排查这个问题——你写的wb_has_macro方法没得到预期结果,核心问题出在异步操作的返回值处理,还有宏检测的逻辑可以优化,咱们一步步来调整:
原代码的核心问题
- 异步回调无法返回值:
FileReader的onload是异步触发的,你在回调里写的return true/false根本不会被方法外部拿到——原方法执行到fileReader.readAsArrayBuffer(wb._file)就直接结束了,返回的是undefined,这是你拿不到正确结果的关键原因。 - 宏检测逻辑冗余:判断工作表是否为
chart和宏完全无关,这部分代码是多余的,反而可能干扰判断。
修正后的代码(用Promise处理异步)
我们把方法改成返回Promise,这样就能正确获取异步操作的结果,同时优化宏检测的逻辑:
async wb_has_macro(wb/*:selectedfile*/)/*:Promise<boolean>*/ { return new Promise((resolve) => { const fileReader = new FileReader(); fileReader.onload = (e) => { const arrayBuffer = fileReader.result; const data = new Uint8Array(arrayBuffer); const arr = new Array(); for (let i = 0; i !== data.length; ++i) { arr[i] = String.fromCharCode(data[i]); } const bstr = arr.join(''); this.workbook = XLSX.read(bstr, { type: 'binary' }); // 核心判断:XLSX库的vbaraw字段专门存储VBA宏的原始内容 const hasMacro = !!this.workbook.vbaraw; resolve(hasMacro); }; fileReader.readAsArrayBuffer(wb._file); }); }
如何使用修正后的方法
因为现在方法是异步的,你需要用await或者.then()来获取结果:
// 方式1:用.then()处理 this.wb_has_macro(selectedFile).then(hasMacro => { console.log("该Excel文件是否包含宏:", hasMacro); // 在这里编写后续的业务逻辑 }); // 方式2:在async函数内部用await async checkMacro() { const hasMacro = await this.wb_has_macro(selectedFile); console.log("是否含宏:", hasMacro); }
补充说明
- XLSX库的
vbaraw字段是判断宏的可靠依据:只要该字段存在且有值,就说明文件包含VBA宏。 - 如果你想额外结合文件格式判断(比如
.xlsm通常是带宏的Excel格式),可以在判断里加上文件名后缀的检测,但优先以vbaraw的内容检测为准,避免误判。
内容的提问来源于stack exchange,提问作者Talha Akbar
相关产品推荐
相关产品推荐

