Office js 如何使用Office JavaScript API确保Excel Online请求小于5MB

Office js 如何使用Office JavaScript API确保Excel Online请求小于5MB,office-js,excel-online,Office Js,Excel Online,显然,在Excel Online中发出请求时有5MB的限制(请参阅) 我们使用Office JavaScript API将大量数据写入Excel工作表,使用以下代码: //示例行-在我们的实际代码中,这来自API 常量行=[ [“日期”、“产品”、“销售”、“客户”], [“13/03/2020”,“巧克力饼干”,598.00,93], //……还有更多 ] getRangeByIndexes(0,0,numRows,numColumns); 超过上述限制将导致抛出此错误:RichApi.er

显然,在Excel Online中发出请求时有5MB的限制(请参阅)

我们使用Office JavaScript API将大量数据写入Excel工作表,使用以下代码:

//示例行-在我们的实际代码中,这来自API
常量行=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
]
getRangeByIndexes(0,0,numRows,numColumns);
超过上述限制将导致抛出此错误:
RichApi.error:发生内部错误。

生成时,行数和列数未知;数据的大小取决于外接程序用户运行的查询

是否有可靠的方法确保我们的请求不超过限制?

我尝试跟踪JSON序列化值数组的大小,并允许一些开销因素:

Excel.run(异步上下文=>{
const sheet=context.workbook.worksheets.add();
//5MB的50%:允许50%的开销
常数阈值=0.5*(5*1000*1000);
设字节=0;
//示例行-在我们的实际代码中,这来自一个API
常数numColumns=4;
常量行=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
];
for(让rowIndex=0;rowIndex=阈值){
wait context.sync();
字节=0;
}
}
返回context.sync();
}

即使允许50%的开销,对
context.sync()
的调用仍然抛出
RichApi.Error:发生了一个内部错误。
带有一些数据。也许我可以将其设置为非常低的值(比如10%)但在大多数情况下,这将是非常低效的。我希望有一种更可靠的方法来计算有效负载大小,或者有一种方法来询问Office API以检查挂起的请求的大小。

请求有效负载大小与: -API调用的计数 -对象的计数(例如范围对象) -要设置的值的长度

所以为了提高脚本的效率,需要优化尽可能小的API调用数。如果要为每行调用Range.Values API,将有更多的负载开销

下面是一个带有优化API调用的示例,以供参考:

    const newValues = [
  ["Date", "Product", "Sales", "Customers"],
  ["13/03/2020", "Chocolate biscuits", 598.00, 93],
  // ... and many more
];

for (let rowIndex = 0; rowIndex < newValues.length;) {
  const row = newValues[rowIndex];
  var bytes = JSON.stringify([row]).length;
  var valuesToSet = [];
  valuesToSet.push(row);

  var rowCountForNextBatch = 1;
  for (; (rowIndex + rowCountForNextBatch) < newValues.length; rowCountForNextBatch++) {
    const nextRow = newValues[rowIndex + rowCountForNextBatch];
    bytes += JSON.stringify([nextRow]).length;

    if (bytes >= THRESHOLD) {
      break;
    }
    valuesToSet.push(nextRow);
  }

  console.log(valuesToSet);
  console.log(rowCountForNextBatch);
  sheet.getRangeByIndexes(rowIndex, 0, rowCountForNextBatch, numColumns).values = valuesToSet;
  await context.sync();

  rowIndex += rowCountForNextBatch;
} 
const newValues=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
];
for(让rowIndex=0;rowIndex=阈值){
打破
}
值设置推送(下一步);
}
console.log(valuesToSet);
console.log(下一批的行计数);
sheet.getRangeByIndexes(rowIndex,0,下一个批次的RowCount,numColumns)。值=值设置;
wait context.sync();
rowIndex+=下一批次的行数;
} 

请求有效负载大小与: -API调用的计数 -对象的计数(例如范围对象) -要设置的值的长度

所以为了提高脚本的效率,需要优化尽可能小的API调用数。如果要为每行调用Range.Values API,将有更多的负载开销

下面是一个带有优化API调用的示例,以供参考:

    const newValues = [
  ["Date", "Product", "Sales", "Customers"],
  ["13/03/2020", "Chocolate biscuits", 598.00, 93],
  // ... and many more
];

for (let rowIndex = 0; rowIndex < newValues.length;) {
  const row = newValues[rowIndex];
  var bytes = JSON.stringify([row]).length;
  var valuesToSet = [];
  valuesToSet.push(row);

  var rowCountForNextBatch = 1;
  for (; (rowIndex + rowCountForNextBatch) < newValues.length; rowCountForNextBatch++) {
    const nextRow = newValues[rowIndex + rowCountForNextBatch];
    bytes += JSON.stringify([nextRow]).length;

    if (bytes >= THRESHOLD) {
      break;
    }
    valuesToSet.push(nextRow);
  }

  console.log(valuesToSet);
  console.log(rowCountForNextBatch);
  sheet.getRangeByIndexes(rowIndex, 0, rowCountForNextBatch, numColumns).values = valuesToSet;
  await context.sync();

  rowIndex += rowCountForNextBatch;
} 
const newValues=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
];
for(让rowIndex=0;rowIndex=阈值){
打破
}
值设置推送(下一步);
}
console.log(valuesToSet);
console.log(下一批的行计数);
sheet.getRangeByIndexes(rowIndex,0,下一个批次的RowCount,numColumns)。值=值设置;
wait context.sync();
rowIndex+=下一批次的行数;
} 

可以进一步说明为什么跟踪JSON的大小不可靠?出了什么问题?基本上我做的是:
javascript让bytes=0;for(const row of rows){sheet.getRangeByIndexes(0,0,numRows,numColumns)。value=row.values;bytes+=JSON.stringify(row.values)。length;if(bytes>THRESHOLD){wait context.sync();}}
我基本上必须将
阈值设置为相当低的值,比如
500000
,这样才能工作,即使这样,它也不总是工作,所以我想我的字节估计一定是做错了什么。我不知道引擎盖下发生了什么,所以做出一些类似的假设似乎很危险。谢谢,但请继续用代码编辑您的原始问题,而不是将其放在注释中,以使其可读。请提供更多代码。我无法区分
是Office对象还是您自己的对象。此外,请比“并非始终有效”等短语更具体。您能检查一下单元格内容是否超过65535字节吗?您能进一步说明为什么跟踪JSON的大小不可靠吗?出了什么问题吗?基本上我做的是: