Microsoft Graph API 何时在 Excel 中完成计算?
When is Microsoft Graph API finished calculating in Excel?
我可以在此处了解如何使用 Microsoft Graph API 触发电子表格的计算...
https://docs.microsoft.com/en-us/graph/api/workbookapplication-calculate?view=graph-rest-1.0&tabs=http
但是,当我从计算中提取结果时,它们似乎没有更新。不过,我拉了二、三次,一般都会更新。
我认为这意味着计算尚未完成 b/c 文件大小或计算的复杂性。
但是,由于是异步的,我找不到任何方法来检查计算何时完成。
知道怎么做吗?
更新 1:
这是我(现在)用来创建会话的代码(根据 @UJJAVAL123-MSFT)
var persistChanges = false;
var wrkbk = await graphClient.Me.Drive.Items[strItemId].Workbook
.CreateSession(persistChanges)
.Request()
.PostAsync();
这会给我一个 'id' 的值,就像这样...
cluster=US5&session=15.SN3PEPF000074ED1.A82.1.V24.7737Nwad4oPuVafaO%2fpAkiay14.5.en-US5.en-US26.10037ffe965d2cf2-Unlimited1.A1.N16.16.0.12904.3505114.5.en-US5.en-US1.V1.N0.1.A&usid=1b230e8f-3bd0-cdaa-2da6-47db74154075
我不确定 how/where 使用这个,或者我是否使用整个东西(它看起来像一个查询字符串)或者我是否应该解析并提取其中一个值...
cluster=US5
session=15.SN3PEPF000074ED1.A82.1.V24.xxxxxxxxxxxxxxxxx%2fpAkiay14.5.en-US5.en-US26.10037ffe965d2cf2-Unlimited1.A1.N16.16.0.12904.3505114.5.en-US5.en-US1.V1.N0.1.A
usid=1b230e8f-3bd0-cdaa-2da6-xxxxxxxxxxxx
这是我用来触发计算的代码,但不确定如何连接两者...
var calculationType = "FullRebuild";
await graphClient.Me.Drive.Items[strItemId].Workbook.Application
.Calculate(calculationType)
.Request()
.PostAsync();
此外,我看到可以创建、刷新和关闭会话,但不完全确定如何检查该会话中的特定异步进程。
这是我用来检查值的特定范围的代码,也不确定我们在此处传递 session-id
的位置...
var result = await graphClient.Me.Drive.Items[strItemId].Workbook.Worksheets[strSheetName]
.Range(strRangeName)
.Request()
.GetAsync();
更新 2:
我可以通过传递 workbook-session-id
(这是上面显示的整个字符串)在同一会话中成功 运行 一个 API 调用(大概),我得到了预期的 204 No Content
回应。但是,从 Microsoft Graph 资源管理器中的 c# 代码片段中不清楚如何在请求中传递 workbook-session-id
。
这是它提供的代码...
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
await graphClient.Me.Drive.Items["{item-id}"].Workbook.Application
.Calculate(null)
.Request()
.PostAsync();
所以问题仍然存在,我如何做一个 PostAsync
或 GetAsync
并引用 workbook-session-id
?
此代码不会给我错误...
await graphClient.Me.Drive.Items[strItemId].Workbook.Application
.Calculate(calculationType)
.Request()
.Header("workbook-session-id",wrkbk.Id)
.PostAsync();
所以现在,问题是我什么时候可以得到 workbook-session-id
?当我最初打开工作簿然后将它传递给每个调用时,我是否得到它?
您应该创建一个会话并在每个请求中传递会话 ID。一个存在
请求中的会话 ID 确保您以最有效的方式使用 Excel API
可能的方式。
经过大量测试后,我明白了。
答案是你使用CreateSession
方法(https://docs.microsoft.com/en-us/graph/api/workbook-createsession?view=graph-rest-1.0&tabs=http)获取工作簿信息,然后你设置persistChanges
设置,然后你得到有关工作簿的信息会话。
像这样...
using Microsoft.Graph;
// strItemId = the id from the microsoft graph api of the item
// strUserId = the id of the user from the microsoft graph api (note: must have permissions set correctly)
public static async Task<WorkbookSessionInfo> GetWorkbookSessionId(string strItemId, string strUserId)
{
// true = you can see changes in the workbook
// false = don't update the workbook, just do calculations
var persistChanges = true;
try
{
var wrkbk = await graphClient.Users[strUserId].Drive.Items[strItemId].Workbook
.CreateSession(persistChanges)
.Request()
.PostAsync();
var result = wrkbk;
return result;
}
catch (Exception ex)
{
Console.WriteLine($"Error getting items: {ex.Message}");
return null;
}
}
您将返回一个 WorkbookSessionInfo
对象,其中包含用于后续调用的 SessionId
。这样一来,您的所有通话都将保持在同一个会话中!
https://docs.microsoft.com/en-us/graph/api/resources/workbooksessioninfo?view=graph-rest-1.0
我可以在此处了解如何使用 Microsoft Graph API 触发电子表格的计算... https://docs.microsoft.com/en-us/graph/api/workbookapplication-calculate?view=graph-rest-1.0&tabs=http
但是,当我从计算中提取结果时,它们似乎没有更新。不过,我拉了二、三次,一般都会更新。
我认为这意味着计算尚未完成 b/c 文件大小或计算的复杂性。
但是,由于是异步的,我找不到任何方法来检查计算何时完成。
知道怎么做吗?
更新 1:
这是我(现在)用来创建会话的代码(根据 @UJJAVAL123-MSFT)
var persistChanges = false;
var wrkbk = await graphClient.Me.Drive.Items[strItemId].Workbook
.CreateSession(persistChanges)
.Request()
.PostAsync();
这会给我一个 'id' 的值,就像这样...
cluster=US5&session=15.SN3PEPF000074ED1.A82.1.V24.7737Nwad4oPuVafaO%2fpAkiay14.5.en-US5.en-US26.10037ffe965d2cf2-Unlimited1.A1.N16.16.0.12904.3505114.5.en-US5.en-US1.V1.N0.1.A&usid=1b230e8f-3bd0-cdaa-2da6-47db74154075
我不确定 how/where 使用这个,或者我是否使用整个东西(它看起来像一个查询字符串)或者我是否应该解析并提取其中一个值...
cluster=US5
session=15.SN3PEPF000074ED1.A82.1.V24.xxxxxxxxxxxxxxxxx%2fpAkiay14.5.en-US5.en-US26.10037ffe965d2cf2-Unlimited1.A1.N16.16.0.12904.3505114.5.en-US5.en-US1.V1.N0.1.A
usid=1b230e8f-3bd0-cdaa-2da6-xxxxxxxxxxxx
这是我用来触发计算的代码,但不确定如何连接两者...
var calculationType = "FullRebuild";
await graphClient.Me.Drive.Items[strItemId].Workbook.Application
.Calculate(calculationType)
.Request()
.PostAsync();
此外,我看到可以创建、刷新和关闭会话,但不完全确定如何检查该会话中的特定异步进程。
这是我用来检查值的特定范围的代码,也不确定我们在此处传递 session-id
的位置...
var result = await graphClient.Me.Drive.Items[strItemId].Workbook.Worksheets[strSheetName]
.Range(strRangeName)
.Request()
.GetAsync();
更新 2:
我可以通过传递 workbook-session-id
(这是上面显示的整个字符串)在同一会话中成功 运行 一个 API 调用(大概),我得到了预期的 204 No Content
回应。但是,从 Microsoft Graph 资源管理器中的 c# 代码片段中不清楚如何在请求中传递 workbook-session-id
。
这是它提供的代码...
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
await graphClient.Me.Drive.Items["{item-id}"].Workbook.Application
.Calculate(null)
.Request()
.PostAsync();
所以问题仍然存在,我如何做一个 PostAsync
或 GetAsync
并引用 workbook-session-id
?
此代码不会给我错误...
await graphClient.Me.Drive.Items[strItemId].Workbook.Application
.Calculate(calculationType)
.Request()
.Header("workbook-session-id",wrkbk.Id)
.PostAsync();
所以现在,问题是我什么时候可以得到 workbook-session-id
?当我最初打开工作簿然后将它传递给每个调用时,我是否得到它?
您应该创建一个会话并在每个请求中传递会话 ID。一个存在 请求中的会话 ID 确保您以最有效的方式使用 Excel API 可能的方式。
经过大量测试后,我明白了。
答案是你使用CreateSession
方法(https://docs.microsoft.com/en-us/graph/api/workbook-createsession?view=graph-rest-1.0&tabs=http)获取工作簿信息,然后你设置persistChanges
设置,然后你得到有关工作簿的信息会话。
像这样...
using Microsoft.Graph;
// strItemId = the id from the microsoft graph api of the item
// strUserId = the id of the user from the microsoft graph api (note: must have permissions set correctly)
public static async Task<WorkbookSessionInfo> GetWorkbookSessionId(string strItemId, string strUserId)
{
// true = you can see changes in the workbook
// false = don't update the workbook, just do calculations
var persistChanges = true;
try
{
var wrkbk = await graphClient.Users[strUserId].Drive.Items[strItemId].Workbook
.CreateSession(persistChanges)
.Request()
.PostAsync();
var result = wrkbk;
return result;
}
catch (Exception ex)
{
Console.WriteLine($"Error getting items: {ex.Message}");
return null;
}
}
您将返回一个 WorkbookSessionInfo
对象,其中包含用于后续调用的 SessionId
。这样一来,您的所有通话都将保持在同一个会话中!
https://docs.microsoft.com/en-us/graph/api/resources/workbooksessioninfo?view=graph-rest-1.0