@sparta-utils/excel-validate-helper
Version:
Excel 读取、校验、错误标注和导出工具库
71 lines (70 loc) • 3.06 kB
JavaScript
export class ExcelExporter {
/**
* 导出文件,支持xlsx/csv/pdf,返回 Promise
*/
static export(blob, options = {}) {
return new Promise((resolve, reject) => {
var _a;
const { fileName = 'export.xlsx', format = 'xlsx', onSuccess, onError, onProgress } = options;
// 环境检查
if (typeof window === 'undefined' || typeof document === 'undefined') {
const err = new Error('ExcelExporter.export 必须在浏览器环境中调用');
onError === null || onError === void 0 ? void 0 : onError(err);
reject(err);
return;
}
// 参数校验
if (!(blob instanceof Blob)) {
const err = new TypeError('参数 blob 必须是 Blob 类型');
onError === null || onError === void 0 ? void 0 : onError(err);
reject(err);
return;
}
// 根据格式自动判断默认文件名和 MIME 类型(部分示例)
const ext = fileName.includes('.')
? (_a = fileName.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()
: '';
const expectedExt = format;
let finalFileName = fileName;
if (ext !== expectedExt) {
finalFileName = fileName.replace(/(\.[^.]+)?$/, `.${expectedExt}`);
}
// IE 特殊处理
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
try {
;
window.navigator.msSaveOrOpenBlob(blob, finalFileName);
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess();
resolve();
}
catch (error) {
onError === null || onError === void 0 ? void 0 : onError(error);
reject(error);
}
return;
}
// 这里可以预留onProgress,实际blob导出多是瞬时完成,如需大文件导出,需要自行实现分片上传等机制
onProgress === null || onProgress === void 0 ? void 0 : onProgress(0);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = finalFileName;
document.body.appendChild(a);
try {
a.click();
onProgress === null || onProgress === void 0 ? void 0 : onProgress(100);
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess();
resolve();
}
catch (error) {
onError === null || onError === void 0 ? void 0 : onError(error);
reject(error);
}
finally {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
});
}
}