You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:22:21