Office JS/Excel JS:如何创建加载项当前工作簿的副本?
实现当前Excel工作簿副本的步骤
核心思路
通过Office.context.document.getFileAsync以Compressed Byte Array格式读取当前工作簿,手动将获取到的字节数组转换为base64编码字符串,再传入Excel.createWorkbook(base64)即可创建副本。
具体实现代码
// 创建当前工作簿的副本 function createWorkbookCopy() { // 以压缩字节数组格式获取文件(大文件会自动分片) Office.context.document.getFileAsync(Office.FileType.CompressedBinary, { sliceSize: 1024 * 1024 }, function (result) { if (result.status === Office.AsyncResultStatus.Succeeded) { const file = result.value; const slices = []; // 递归读取所有文件切片 function readSlice(sliceIndex) { file.getSliceAsync(sliceIndex, function (sliceResult) { if (sliceResult.status === Office.AsyncResultStatus.Succeeded) { slices.push(sliceResult.value.data); if (sliceIndex < file.sliceCount - 1) { readSlice(sliceIndex + 1); } else { // 合并所有切片为完整的Uint8Array const totalLength = slices.reduce((sum, slice) => sum + slice.length, 0); const combinedArray = new Uint8Array(totalLength); let offset = 0; slices.forEach(slice => { combinedArray.set(slice, offset); offset += slice.length; }); // 将字节数组转换为base64字符串 const base64Str = arrayBufferToBase64(combinedArray.buffer); // 用base64创建工作簿副本 Excel.createWorkbook(base64Str).then(() => { console.log("副本创建成功"); file.closeAsync(); // 释放文件资源 }).catch(err => { console.error("创建副本失败:", err); file.closeAsync(); }); } } else { console.error("读取切片失败:", sliceResult.error); file.closeAsync(); } }); } readSlice(0); } else { console.error("获取文件失败:", result.error); } }); } // 辅助函数:将ArrayBuffer转换为base64 function arrayBufferToBase64(buffer) { let binary = ''; const bytes = new Uint8Array(buffer); const len = bytes.byteLength; for (let i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); } return window.btoa(binary); }
关键说明
- 必须选择
Office.FileType.CompressedBinary格式,这是唯一能还原为完整Excel文件的格式,转换为base64后可被Excel.createWorkbook正确解析。 - 大文件会被自动分割为多个切片,需遍历读取所有切片并合并成完整字节数组,否则会导致文件损坏。
- base64转换的核心逻辑是先将字节数组转为二进制字符串,再通过
window.btoa()完成编码,该方法适配压缩字节数组的二进制内容。 - 操作完成后必须调用
file.closeAsync()释放文件资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Pablo V
相关产品推荐
相关产品推荐

