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

Excel Office JS任务窗格:实现自定义API数据刷新功能

实现Excel表格数据刷新与异步推送方案

一、手动刷新功能(模拟「数据→全部刷新」)

可以通过编写专门的刷新函数,实现清除旧数据、拉取最新API数据并更新表格的逻辑,具体代码如下:

const refreshSubjectTable = async () => {
  try {
    // 拉取最新API数据并格式化
    const allSubjects = await hubReportService.getAllSubjects();
    const formatedSubjects = formatSubjectForExcel(allSubjects);

    await Excel.run(async (context) => {
      const currentWorksheet = context.workbook.worksheets.getActiveWorksheet();
      // 获取已创建的subjectHubTable
      const subjectHubTable = currentWorksheet.tables.getItem("subjectHubTable");

      // 删除所有现有数据行(保留表头)
      subjectHubTable.rows.load("count");
      await context.sync();
      if (subjectHubTable.rows.count > 0) {
        // 从末尾往前删除,避免索引偏移问题
        for (let i = subjectHubTable.rows.count - 1; i >= 0; i--) {
          subjectHubTable.rows.getItemAt(i).delete();
        }
        await context.sync();
      }

      // 添加新数据行
      if (formatedSubjects.length > 0) {
        subjectHubTable.rows.add(null, formatedSubjects);
      }

      // 重新调整列宽行高
      subjectHubTable.getRange().format.autofitColumns();
      subjectHubTable.getRange().format.autofitRows();

      await context.sync();
    });
  } catch (error) {
    console.error("表格刷新失败:", error);
    // 可在此添加用户提示,比如弹窗告知刷新失败
  }
};

你可以将这个函数绑定到Office插件的自定义按钮上,点击按钮即可触发刷新,和Excel原生的「全部刷新」逻辑一致。

二、异步推送数据至工作表的可行方案

1. 定时轮询API(最简单易实现)

设置定时器,每隔固定周期自动调用刷新函数,实现数据自动更新:

// 启动定时刷新,间隔5分钟(300000毫秒)
let refreshTimer = setInterval(refreshSubjectTable, 300000);

// 停止定时刷新的方法(比如插件卸载或用户手动关闭时调用)
const stopAutoRefresh = () => {
  if (refreshTimer) {
    clearInterval(refreshTimer);
    refreshTimer = null;
  }
};

建议给用户提供开启/关闭定时刷新的开关,避免不必要的API请求消耗资源。

2. WebSocket实时推送(后端支持时最佳)

如果你的自定义API支持WebSocket协议,可以建立长连接,后端数据更新时主动推送至前端,前端收到数据后立即更新表格:

// 建立WebSocket连接
const ws = new WebSocket("wss://your-api-domain/ws/subjects");

ws.onmessage = async (event) => {
  try {
    const updatedSubjects = JSON.parse(event.data);
    const formatedSubjects = formatSubjectForExcel(updatedSubjects);

    await Excel.run(async (context) => {
      const currentWorksheet = context.workbook.worksheets.getActiveWorksheet();
      const subjectHubTable = currentWorksheet.tables.getItem("subjectHubTable");

      // 清空旧数据
      subjectHubTable.rows.load("count");
      await context.sync();
      if (subjectHubTable.rows.count > 0) {
        for (let i = subjectHubTable.rows.count - 1; i >= 0; i--) {
          subjectHubTable.rows.getItemAt(i).delete();
        }
        await context.sync();
      }

      // 添加推送的最新数据
      if (formatedSubjects.length > 0) {
        subjectHubTable.rows.add(null, formatedSubjects);
      }

      subjectHubTable.getRange().format.autofitColumns();
      await context.sync();
    });
  } catch (error) {
    console.error("处理推送数据失败:", error);
  }
};

// 连接关闭时的重连逻辑
ws.onclose = () => {
  console.log("WebSocket连接断开,尝试重新连接...");
  // 可在此添加自动重连逻辑
};

这种方式能实现真正的实时更新,适合数据变化频繁的场景,但需要后端配合实现WebSocket服务。

3. Office JS后台任务(适合后台持续刷新)

如果需要插件在后台(比如任务窗格最小化时)仍能执行刷新逻辑,可以使用Office JS的后台任务功能,但注意:

  • 仅支持Office 365订阅版等特定版本
  • 需要在插件清单中配置后台任务权限
  • 单任务执行时长有限制(通常最多30分钟)
    具体实现需参考Office JS官方后台任务规范,适合有一定插件开发经验的场景。

内容的提问来源于stack exchange,提问作者Arun N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:05:24