【问题标题】:Office JS API fails to write less than 10000 cell values to a tableOffice JS API 无法将少于 10000 个单元格值写入表
【发布时间】:2017-01-13 06:41:20
【问题描述】:

我们正在使用 office js API 将数据写入表。该代码在 2016 年 11 月之前在 excel online 上运行良好,之后停止运行。

代码只是将值设置为表格,它尝试写入的单元格总数小于 10,000,设置值的方法是:

dataTable.getHeaderRowRange().values = [data.headerValues];
dataTable.getDataBodyRange().formulas = data.values;
dataTable.getTotalRowRange().formulas = [data.totalRow];

重现问题的完整代码托管在GitHub

您可以使用下面的清单在办公室在线运行代码:

<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="TaskPaneApp">
  <Id>5B1D06A5-5F14-4B8F-B07D-E698084397F6</Id>
  <Version>1.0.0.0</Version>
  <ProviderName>Provider</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="Testing Office API" />
  <Description DefaultValue="Testing Office API"/>
  <Hosts>
    <Host Name="Workbook" />
  </Hosts>
  <DefaultSettings>
    <SourceLocation DefaultValue="https://renil-abdulkader.github.io/office-js-api-testing/" />
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

单击加载数据按钮只会写入部分数据,控制台将显示以下错误:{"name":"OfficeExtension.Error","code":"GeneralException","message":"There was an internal error while processing the request.","traceMessages":[],"debugInfo":{"errorLocation":"Range.formulas"}}

发生这种情况后的其他问题是:

  1. 添加绑定会失败
  2. 一旦绑定失败,删除选项卡就会开始失败
  3. 如果 Excel 表上有多个用户,用户将开始收到 You are no longer connected to the server 错误消息。

更新 1:我们正在写入 68 行,每行 136 列。更新了代码以编写前 40 行和后 30 行,该代码工作正常,但不是整个 68 行。所以数据本身应该没有问题。

【问题讨论】:

  • 我怀疑您已达到 Excel 的存储限制。对于清单建议大小的用户,您需要使用数据库来存储数据。 Connect to a Azure SQL Database/SQL Server from Office 365 可能会引导您找到解决方案。
  • 存储限制在哪里指定?
  • 这个数据肯定不会达到 10MB 的限制,正如我所提到的,这在之前运行良好。
  • 当然。更新了我从 office API 得到的错误信息。此外,如果您愿意,可以使用上面提供的清单运行代码。
  • 能够重现错误。会回复的。

标签: office-js


【解决方案1】:

这是由于在线平台上的超时错误。作为一种缓解措施,是否可以分块进行大型公式(或值)更新,以便没有一个请求会遇到超时问题?该块大小可能取决于环境。也许是从 2K 细胞开始? 如果我们能够提供替代解决方案,我将跟进此线程。

【讨论】:

  • 所以不使用 table.formulas setter 而是使用 range 来设置值?我们绝对可以尝试。但是当我们尝试批量承诺时,它不起作用。我可以更新代码来做批处理,看看我是否可以重现错误。
  • 值或公式集都会触发重新计算。所以,我不认为这有什么不同。如果要设置公式,则应使用公式属性。通过“'块'我的意思是说,通过将原始网格分解为更小的网格来更新(值或公式)。而不是说 10k 单元格更新,对 2k 单元格进行 5 次更新。我会回到超时限制是否可以扩展。无论如何,对于在线(浏览器)客户端,您也希望考虑用户体验。理想情况下,您不希望“正在处理它......”消息太长。否则,用户可能会取消或关闭。
  • 我认为分块书写会使“Working on it...”的信息保持更长时间。我会更新代码并通知您。
  • 我们如何使用多个 ctx.sync() 进行循环,因为在这种情况下我们需要写入批处理数据?我可以遵循任何文档吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多