Excel中的Microsoft Graph API什么时候计算完?

问题描述 投票:0回答:1

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

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

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

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

有什么办法可以做到这一点?

更新1:

这是我(现在)用来创建会话的代码(按 @UJAVAL123-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:

我可以在同一个会话中成功运行一个API调用(大概是),通过传入 workbook-session-id (就是上面显示的全部字符串),我得到了预期的 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? 我是否在最初打开工作簿时得到它,然后传递给每次调用?

microsoft-graph microsoft-graph-excel
1个回答
1
投票

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

请在这里查看 API调用以获得一个会话


0
投票

所以经过大量的测试,我想明白了。

答案是,你使用的是 CreateSession 方法 (https:/docs.microsoft.comen-usgraphapiworkbook-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.comen-usgraphapiresourcesworkbooksessioninfo?view=graph-rest-1.0。

© www.soinside.com 2019 - 2024. All rights reserved.