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

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

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 Explorer 中的 c# Code Snippet 中不清楚如何workbook-session-id在请求中传递。

这是它提供的代码...

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

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

所以问题仍然存在,我该如何做PostAsyncorGetAsync并引用workbook-session-id

此代码不会给我错误...

await graphClient.Me.Drive.Items[strItemId].Workbook.Application
    .Calculate(calculationType)
    .Request()
    .Header("workbook-session-id",wrkbk.Id)
    .PostAsync();

所以现在,问题是我什么时候得到workbook-session-id?当我最初打开工作簿然后将其传递给每个调用时,我是否得到它?

4

2 回答 2

1

您应该创建一个会话并在每个请求中传递会话 ID。请求中存在会话 ID 可确保您以最有效的方式使用 Excel API。

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

于 2020-05-06T09:26:02.807 回答
0

所以经过大量的测试后,我想通了。

答案是您使用该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

于 2020-05-19T12:52:04.067 回答