Office-JS 插件在多个打开的 Excel 中出现问题

Posted

技术标签:

【中文标题】Office-JS 插件在多个打开的 Excel 中出现问题【英文标题】:Office-JS Addin having problems in multiple opened Excel 【发布时间】:2020-04-16 06:55:50 【问题描述】:

当我在多个打开的 Excel 实例中使用我的 Angular Excel 插件 (Office js) 时,我遇到了一些问题。

在更详细地描述问题之前,我想简要解释一下 AddIn 的作用:

用户可以在 Excel 中定义 UDF 函数以从服务器获取数据并在 Excel 中显示。但是,UDF 函数不会直接执行,而是仅在触发更新时执行。之后,请求被发送到服务器,数据被提取、格式化并显示在 Excel 中。如果用户点击“更新”按钮,则迭代工作簿中的所有工作表并搜索相应的 UDF 函数。请求直接发送到服务器。在某些情况下,响应请求并在 Excel 中显示数据可能需要一些时间(例如,当用户在 100 个工作表中定义了 100 个 UDF 函数,每个工作表包含一个 UDF)。

我目前有以下问题:

1) 如果用户打开了一个包含 100 个工作表中定义的 UDF 函数的 Excel 实例和另一个包含 70 个包含 UDF 函数的工作表的实例,当我在打开的 Excel 实例之间切换时出现“发生意外服务器错误”错误。更新没有运行,有时请求根本没有发送或无法处理。我认为以下代码 sn-p 可能会导致此问题:

Excel.run(异步上下文 => 常量表:Excel.Worksheet = context.workbook.worksheets.getActiveWorksheet(); ...

context.workbook 始终返回当前打开的工作簿或当前在活动 Excel 实例中打开的工作簿。但我还没有找到按名称或 ID 访问工作簿的方法。

有没有可能插件只能在一个实例中正常工作,还是我做错了什么?

2) 如果您已经通过 AddIn 开始更新工作簿(例如 100 个具有 UDF 函数的工作表)并且 Excel 失去焦点(例如通过切换到 Word 或 Edge),那么正如 1) 中已经提到的,并非所有请求都是已发送或处理。

我希望你们中的一些人已经遇到过类似的问题,也许有解决方案。

【问题讨论】:

对于 2#,您能分享一下脚本实验室的要点吗?我想在我身边有一个repro。 *** 中有一个指导方针:只在一个帖子中关注一个问题,因此第二个问题可能会丢失,所以也许你可以为第二个问题创建另一个帖子 【参考方案1】:

感谢 Marco Siebert 向我们报告此问题。

对于 1#,这是我们现在正在调查的已知问题,它也在 https://officespdev.uservoice.com/forums/224641-feature-requests-and-feedback/suggestions/39781582-fix-generalexceptions-being-thrown-when-multiple-e 跟踪,

为了解决这个问题,我们需要修复在这个场景中使用的每个 API,我们有一个工作项 3743479 来解决这个问题。您也可以在用户语音中支持此功能。此外,您能否分享一下您尝试在多个工作簿场景中使用的 API?

对于您的问题:“context.workbook 始终返回当前打开的工作簿或当前在活动 Excel 实例中打开的工作簿。但我还没有找到按名称或 ID 访问工作簿的方法。” 这是设计使然,因为 JS 插件是每个工作簿的。因此,我们不支持访问其他工作簿内容,除了 addFromBase64 API,它提供了将工作表从另一个工作簿复制到当前工作簿的功能。

【讨论】:

嗨,Raymound,我想你误解了我的意思。我打开了两个 Excel 实例,每个实例都打开了一个工作簿。当我在实例 1 中单击 AddIn 中的更新然后切换到实例 2 并更新时,就会出现问题。 AddIn 似乎没有在单独的上下文中运行,似乎只有一个实例用于两个打开的 Excel。我以为每个 Excel 实例都在运行一个单独的 AddIn 实例,但事实似乎并非如此。 我认为根本原因与此问题相似。 github.com/OfficeDev/office-js/issues/771,该客户正在使用 setInterval(),但是当 API 等待服务器更新然后最终用户切换到另一个工作簿时,也会出现问题。它的 API 失败并且将抛出异常。您的场景中的错误消息是什么? GeneralException 已修复。我不知道为什么,但也许你可以试试这个?我有一个异步函数,每次出现我发现的函数时都会调用它,所以它可能是 1-n 次。 async refresh(...) await Excel.run(async context => const worksheet = context.workbook.worksheets.getItem(worksheetName); worksheet.load(); await context.sync(); ... 当我在 Excel 的两个实例中运行它时,当我在更新到另一个实例时切换时出现 GeneralException。将代码更改为:worksheet.load('name'); 有效。 当我执行 worksheet.load() 而不是 worksheet.load('name') 然后在更新时切换到第二个 Excel 时出现上述异常。 是的,这是我们现在正在跟踪的一个已知问题,worksheet.load() 将加载工作表下的所有属性,这还包括一些不支持的属性(例如:worksheet.gridline)在 2 个工作簿中切换场景。我们现在正在修复有类似问题的 API:worksheet.gridline、worksheet.showheadings、worksheetFreezePanes.getLocationOrNullObject、worksheet.add、worksheet.delete、Worksheet.activate、Range.select、Workbook.getSelectedRange、Workbook。 getSelectedRanges, Workbook.getActiveCell

以上是关于Office-JS 插件在多个打开的 Excel 中出现问题的主要内容,如果未能解决你的问题,请参考以下文章

打开多个excel文件,如何显示在前端

在 Excel /automation 中强制加载插件

自动在excel插件中注册用户自定义函数

打开EXCEL出现“此工作薄包含一个或多个无法更新的链接”

用VBA代码打开其他excel工作簿(有打开密码的)???

解决双击excel文件打开多个excel.exe进程的问题