Microsoft Graph API何时在Excel中完成计算



我可以在这里看到如何使用Microsoft Graph API触发电子表格的计算。。。https://learn.microsoft.com/en-us/graph/api/workbookapplication-calculate?view=graph-rest-1.0&tabs=http

但是,当我从计算中提取结果时,它们似乎不会更新。然而,我拉了第二次或第三次,它通常是更新的。

我认为这意味着计算还没有完成文件大小或计算复杂性的b/c。

然而,由于是异步的,我找不到任何方法来检查计算何时完成。

知道怎么做吗?

更新1:

这是我(现在(用来创建会话的代码(根据@UJJAVAL123-MFT(

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

我不确定如何/在哪里使用它,也不确定我是否使用了整个东西(它看起来像一个查询字符串(,或者我是否应该解析并提取其中一个值。。。

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(这是上面显示的ENTIRE字符串(,我可以在同一个会话中成功地运行API调用(大概(,并得到预期的204 No Content响应。但是,从Microsoft Graph Explorer中的c#代码段中还不清楚如何在请求中传递workbook-session-id

这是它提供的代码。。。

GraphServiceClient graphClient = new GraphServiceClient( authProvider );
await graphClient.Me.Drive.Items["{item-id}"].Workbook.Application
.Calculate(null)
.Request()
.PostAsync();

所以问题仍然存在,我如何做PostAsyncGetAsync并引用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可能的方式。

查看此处获取API调用以获取会话

所以经过大量的测试,我发现了它。

答案是使用CreateSession方法(https://learn.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://learn.microsoft.com/en-us/graph/api/resources/workbooksessioninfo?view=graph-rest-1.0

最新更新