Bewährte Methoden für das Arbeiten mit der Excel-API
Artikel
Dieser Artikel enthält Empfehlungen für die Arbeit mit den Excel-APIs in Microsoft Graph.
Verwalten von Sitzungen auf die effizienteste Weise
Wenn Innerhalb eines bestimmten Zeitraums mehrere Aufrufe ausgeführt werden müssen, empfiehlt es sich, eine Sitzung zu erstellen und die Sitzungs-ID bei jeder Anforderung zu übergeben. Um die Sitzung in der API darzustellen, verwenden Sie den workbook-session-id: {session-id}-Header. Auf diese Weise können Sie die Excel-APIs auf die effizienteste Weise verwenden.
Im folgenden Beispiel wird gezeigt, wie Sie mit diesem Ansatz einer Tabelle eine neue Zahl hinzufügen und dann einen Datensatz in einer Arbeitsmappe suchen.
POST https://graph.microsoft.com/v1.0/me/drive/items/{id}/workbook/createSession
Content-type: application/json
{
"persistChanges": true
}
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Drives.Item.Items.Item.Workbook.CreateSession;
var requestBody = new CreateSessionPostRequestBody
{
PersistChanges = true,
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].Workbook.CreateSession.PostAsync(requestBody);
// Code snippets are only available for the latest major version. Current major version is $v1.*
// Dependencies
import (
"context"
msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives"
//other-imports
)
requestBody := graphdrives.NewCreateSessionPostRequestBody()
persistChanges := true
requestBody.SetPersistChanges(&persistChanges)
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=go
createSession, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().CreateSession().Post(context.Background(), requestBody, nil)
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
com.microsoft.graph.drives.item.items.item.workbook.createsession.CreateSessionPostRequestBody createSessionPostRequestBody = new com.microsoft.graph.drives.item.items.item.workbook.createsession.CreateSessionPostRequestBody();
createSessionPostRequestBody.setPersistChanges(true);
var result = graphClient.drives().byDriveId("{drive-id}").items().byDriveItemId("{driveItem-id}").workbook().createSession().post(createSessionPostRequestBody);
<?php
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Graph\Generated\Drives\Item\Items\Item\Workbook\CreateSession\CreateSessionPostRequestBody;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$requestBody = new CreateSessionPostRequestBody();
$requestBody->setPersistChanges(true);
$result = $graphServiceClient->drives()->byDriveId('drive-id')->items()->byDriveItemId('driveItem-id')->workbook()->createSession()->post($requestBody)->wait();
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph import GraphServiceClient
from msgraph.generated.drives.item.items.item.workbook.create_session.create_session_post_request_body import CreateSessionPostRequestBody
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = CreateSessionPostRequestBody(
persist_changes = True,
)
result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.create_session.post(request_body)
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Drives.Item.Items.Item.Workbook.Functions.Vlookup;
using Microsoft.Kiota.Abstractions.Serialization;
var requestBody = new VlookupPostRequestBody
{
LookupValue = new UntypedString("pear"),
TableArray = new UntypedObject(new Dictionary<string, UntypedNode>
{
{
"Address", new UntypedString("Sheet1!B2:C7")
},
}),
ColIndexNum = new UntypedDouble(2),
RangeLookup = new UntypedBoolean(false),
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].Workbook.Functions.Vlookup.PostAsync(requestBody, (requestConfiguration) =>
{
requestConfiguration.Headers.Add("workbook-session-id", "{session-id}");
});
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
com.microsoft.graph.drives.item.items.item.workbook.functions.vlookup.VlookupPostRequestBody vlookupPostRequestBody = new com.microsoft.graph.drives.item.items.item.workbook.functions.vlookup.VlookupPostRequestBody();
vlookupPostRequestBody.setLookupValue("pear");
UntypedNode tableArray = new UntypedNode();
tableArray.setAddress("Sheet1!B2:C7");
vlookupPostRequestBody.setTableArray(tableArray);
vlookupPostRequestBody.setColIndexNum(2d);
vlookupPostRequestBody.setRangeLookup(false);
var result = graphClient.drives().byDriveId("{drive-id}").items().byDriveItemId("{driveItem-id}").workbook().functions().vlookup().post(vlookupPostRequestBody, requestConfiguration -> {
requestConfiguration.headers.add("workbook-session-id", "{session-id}");
});
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph import GraphServiceClient
from msgraph.generated.drives.item.items.item.workbook.functions.vlookup.vlookup_request_builder import VlookupRequestBuilder
from kiota_abstractions.base_request_configuration import RequestConfiguration
from msgraph.generated.drives.item.items.item.workbook.functions.vlookup.vlookup_post_request_body import VlookupPostRequestBody
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = VlookupPostRequestBody(
lookup_value = "pear",
table_array = UntypedNode(
address = "Sheet1!B2:C7",
),
col_index_num = 2,
range_lookup = False,
)
request_configuration = RequestConfiguration()
request_configuration.headers.add("workbook-session-id", "{session-id}")
result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.functions.vlookup.post(request_body, request_configuration = request_configuration)
POST https://graph.microsoft.com/v1.0/me/drive/items/{id}/workbook/closeSession
Content-type: application/json
workbook-session-id: {session-id}
{
}
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Drives.Item.Items.Item.Workbook.CloseSession;
var requestBody = new CloseSessionPostRequestBody
{
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].Workbook.CloseSession.PostAsync(requestBody, (requestConfiguration) =>
{
requestConfiguration.Headers.Add("workbook-session-id", "{session-id}");
});
// Code snippets are only available for the latest major version. Current major version is $v1.*
// Dependencies
import (
"context"
abstractions "github.com/microsoft/kiota-abstractions-go"
msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives"
//other-imports
)
headers := abstractions.NewRequestHeaders()
headers.Add("workbook-session-id", "{session-id}")
configuration := &graphdrives.DriveItemItemItemWorkbookCloseSessionRequestBuilderPostRequestConfiguration{
Headers: headers,
}
requestBody := graphdrives.NewCloseSessionPostRequestBody()
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=go
graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().CloseSession().Post(context.Background(), requestBody, configuration)
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
com.microsoft.graph.drives.item.items.item.workbook.closesession.CloseSessionPostRequestBody closeSessionPostRequestBody = new com.microsoft.graph.drives.item.items.item.workbook.closesession.CloseSessionPostRequestBody();
graphClient.drives().byDriveId("{drive-id}").items().byDriveItemId("{driveItem-id}").workbook().closeSession().post(closeSessionPostRequestBody, requestConfiguration -> {
requestConfiguration.headers.add("workbook-session-id", "{session-id}");
});
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph import GraphServiceClient
from msgraph.generated.drives.item.items.item.workbook.close_session.close_session_request_builder import CloseSessionRequestBuilder
from kiota_abstractions.base_request_configuration import RequestConfiguration
from msgraph.generated.drives.item.items.item.workbook.close_session.close_session_post_request_body import CloseSessionPostRequestBody
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = CloseSessionPostRequestBody(
)
request_configuration = RequestConfiguration()
request_configuration.headers.add("workbook-session-id", "{session-id}")
await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.close_session.post(request_body, request_configuration = request_configuration)
Arbeiten mit APIs, deren Ausführung sehr lange dauert
Möglicherweise stellen Sie fest, dass einige Vorgänge unbestimmte Zeit in Anspruch nehmen. z. B. das Öffnen einer großen Arbeitsmappe. Es ist einfach, ein Timeout zu erreichen, während auf die Antwort auf diese Anforderungen gewartet wird. Um dieses Problem zu beheben, stellen wir das Zeitintensive Vorgangsmuster bereit. Wenn Sie dieses Muster verwenden, müssen Sie sich keine Gedanken über das Timeout für die Anforderung machen.
Derzeit ist für die Excel-API für die Sitzungserstellung in Microsoft Graph das Zeitintensive Vorgangsmuster aktiviert. Dieses Muster umfasst die folgenden Schritte:
Fügen Sie der Anforderung einen Prefer: respond-async Header hinzu, um anzugeben, dass es sich um einen Zeitintensiven Vorgang handelt, wenn Sie eine Sitzung erstellen.
Ein zeitintensiver Vorgang gibt eine 202 Accepted Antwort zusammen mit einem Location-Header zurück, um den Vorgang status abzurufen. Wenn die Sitzungserstellung in einigen Sekunden abgeschlossen ist, wird eine reguläre Sitzungsantwort für die Erstellung zurückgegeben, anstatt das Muster für einen zeitintensiven Vorgang zu verwenden.
Mit der 202 Accepted Antwort können Sie den Vorgang status an der angegebenen Position abrufen. Zu den status Werten gehören notStarted, running, succeededund failed.
Nach Abschluss des Vorgangs können Sie das Sitzungserstellungsergebnis über die angegebene URL in der erfolgreichen Antwort abrufen.
Im folgenden Beispiel wird eine Sitzung mit dem Zeitintensiven Vorgangsmuster erstellt.
Anfängliche Anforderung zum Erstellen einer Sitzung
POST https://graph.microsoft.com/v1.0/me/drive/items/{drive-item-id}/workbook/createSession
Prefer: respond-async
Content-type: application/json
{
"persistChanges": true
}
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Drives.Item.Items.Item.Workbook.CreateSession;
var requestBody = new CreateSessionPostRequestBody
{
PersistChanges = true,
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].Workbook.CreateSession.PostAsync(requestBody, (requestConfiguration) =>
{
requestConfiguration.Headers.Add("Prefer", "respond-async");
});
// Code snippets are only available for the latest major version. Current major version is $v1.*
// Dependencies
import (
"context"
abstractions "github.com/microsoft/kiota-abstractions-go"
msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives"
//other-imports
)
headers := abstractions.NewRequestHeaders()
headers.Add("Prefer", "respond-async")
configuration := &graphdrives.DriveItemItemItemWorkbookCreateSessionRequestBuilderPostRequestConfiguration{
Headers: headers,
}
requestBody := graphdrives.NewCreateSessionPostRequestBody()
persistChanges := true
requestBody.SetPersistChanges(&persistChanges)
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=go
createSession, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().CreateSession().Post(context.Background(), requestBody, configuration)
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
com.microsoft.graph.drives.item.items.item.workbook.createsession.CreateSessionPostRequestBody createSessionPostRequestBody = new com.microsoft.graph.drives.item.items.item.workbook.createsession.CreateSessionPostRequestBody();
createSessionPostRequestBody.setPersistChanges(true);
var result = graphClient.drives().byDriveId("{drive-id}").items().byDriveItemId("{driveItem-id}").workbook().createSession().post(createSessionPostRequestBody, requestConfiguration -> {
requestConfiguration.headers.add("Prefer", "respond-async");
});
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph import GraphServiceClient
from msgraph.generated.drives.item.items.item.workbook.create_session.create_session_request_builder import CreateSessionRequestBuilder
from kiota_abstractions.base_request_configuration import RequestConfiguration
from msgraph.generated.drives.item.items.item.workbook.create_session.create_session_post_request_body import CreateSessionPostRequestBody
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = CreateSessionPostRequestBody(
persist_changes = True,
)
request_configuration = RequestConfiguration()
request_configuration.headers.add("Prefer", "respond-async")
result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.create_session.post(request_body, request_configuration = request_configuration)
In einigen Fällen wird die Erstellung, wenn die Erstellung innerhalb von Sekunden erfolgreich ist, nicht in das Muster für zeitintensive Vorgänge übergehen. stattdessen wird als reguläre Erstellungssitzung zurückgegeben, und die erfolgreiche Anforderung gibt eine 201 Created Antwort zurück.
Das folgende Beispiel zeigt die Antwort, wenn die Anforderung fehlschlägt.
Hinweis: Das hier gezeigte Antwortobjekt kann zur besseren Lesbarkeit gekürzt werden.
HTTP/1.1 500 Internal Server Error
Content-type: application/json
{
"error":{
"code": "internalServerError",
"message": "An internal server error occurred while processing the request.",
"innerError": {
"code": "internalServerErrorUncategorized",
"message": "An unspecified error has occurred.",
"innerError": {
"code": "GenericFileOpenError",
"message": "The workbook cannot be opened."
}
}
}
}
Abfragen status der Erstellungssitzung mit langer Ausführungszeit
Mit dem Zeitintensiven Vorgangsmuster können Sie die Erstellung status am angegebenen Speicherort mithilfe der folgenden Anforderung abrufen. Das empfohlene Intervall zum Abfragen status beträgt etwa 30 Sekunden. Das maximale Intervall sollte nicht mehr als 4 Minuten betragen.
Anforderung
GET https://graph.microsoft.com/v1.0/me/drive/items/{drive-item-id}/workbook/operations/{operation-id}
{
}
Antwort
Im Folgenden wird die Antwort angezeigt, wenn der Vorgang über den status verfügtrunning.
Das Abrufen von Sitzungsinformationen hängt von der ursprünglichen Anforderung ab. Sie müssen das Ergebnis nicht abrufen, wenn die ursprüngliche Anforderung keinen Antworttext zurückgibt.
Reduzieren von Drosselungsfehlern
Excel-APIs in Microsoft Graph wirken sich auf die Ressourcennutzung mehrerer Abhängigkeitsdienste aus. Die Auswirkungen können zwischen verschiedenen Anforderungen variieren: Sie können beispielsweise erwarten, dass das Aktualisieren einer kurzen Zeichenfolge in einer einzelnen Zelle einer kleinen Arbeitsmappe weniger Ressourcen beansprucht als das Hinzufügen einer großen Tabelle mit komplexen Formeln zu einer großen Arbeitsmappe.
Selbst mit der gleichen API können Parameter und Zielarbeitsmappen erhebliche Unterschiede mit sich bringen. Daher ist die Drosselung der Excel-API nicht mit einfachen und universellen Grenzwertnummern definiert, da sie zu restriktiveren Grenzwerten führen würden. Die folgenden bewährten Methoden helfen Ihnen, Aufgaben schneller mit weniger Drosselungsfehlern abzuschließen.
Retry-After-Header
In vielen Fällen enthält eine Drosselungsantwort einen Retry-After -Header. Das Respektieren des Werts des Headers und das Verzögern ähnlicher Anforderungen würde dem Client helfen, die Drosselung wiederherzustellen. Ausführliche Informationen zur Behandlung von Fehlerantworten von Excel-APIs in Microsoft Graph finden Sie unter Fehlerbehandlung für Excel-APIs in Microsoft Graph.
Drosselung und Parallelität
Ein weiterer Faktor im Zusammenhang mit der Drosselung ist die Anforderungsparallelität. Es wird nicht empfohlen, die Parallelität zu erhöhen, wenn Sie Excel-APIs verwenden (z. B. die Parallelisierung der Anforderungen mit derselben Arbeitsmappe), insbesondere für Schreibanforderungen. Es sei denn, es besteht ein spezifisches Problem, z. B. ein erheblicher Netzwerkaufwand im Vergleich zur sehr kurzen Anforderungsausführungszeit, wird im häufigsten Fall die sequenzielle Verwendung empfohlen: Senden Sie für jede Arbeitsmappe nur die nächste Anforderung, nachdem sie eine erfolgreiche Antwort auf die aktuelle Anforderung erhalten hat.
Gleichzeitige Schreibanforderungen an dieselbe Arbeitsmappe werden in der Regel nicht parallel ausgeführt (in einigen Fällen auch). Stattdessen sind sie häufig die Ursache für Drosselung, Timeout (wenn Anforderungen auf Servern in die Warteschlange gestellt werden), Mergekonflikte (wenn gleichzeitige Sitzungen beteiligt sind) und andere Arten von Fehlern. Außerdem erschweren sie die Fehlerbehandlung. Wenn Sie beispielsweise eine Fehlerantwort erhalten, gibt es keine Möglichkeit, die status anderer ausstehender Anforderungen zu bestätigen, sodass es schwierig ist, den Zustand der Arbeitsmappe zu bestimmen oder wiederherzustellen.