💻

SharePoint Online の Excel Services (SOAP API) を叩いてみる

2022/01/01に公開

はじめに

Excel Services を使うと SharePoint のドキュメント ライブラリに保存されている Excel ファイルを直接編集できます。一般的には、プログラムからの Excel の編集といえば、Open XML SDK を使うか、サードパーティー製のコンポーネントを使うかになります。Excel Services を使えば、それらを使う必要がなく、セルの読み書き程度であれば簡単にできてしまいます。[1] SOAP なので Visual Studio からは サービス参照の追加 で簡単に呼び出すことができます。

ただし SharePoint Online の場合はこの方法では問題があります。SharePoint Online は OAuth なので、対応していないと思われる WCF ではアクセス許可が通りません。なので、自力で HTTP ヘッダーを追加してあげる必要があります。

サンプル コード

https://github.com/karamem0/samples/tree/main/sharepoint-excel-service-using-oauth

実装方法

Access Token の取得方法は以下の記事を参考にしてください。今回のサンプルではリフレッシュ トークンを使ったアクセス トークンの再取得も実装しています。

https://zenn.dev/karamem0/articles/2016_12_17_000000

WCF でカスタム HTTP ヘッダーを追加するには Message Inspectors という機能を使えばいいようです。

IClientMessageInspector を実装するクラスを作ります。メッセージを送信する前に Bearer Token を追加します。

public class BearerClientMessageInspector : IClientMessageInspector
{

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        var property = new HttpRequestMessageProperty();
        property.Headers.Add("Authorization", "Bearer {{access-token}}");
        request.Properties[HttpRequestMessageProperty.Name] = property;
        return null;
    }

}

IEndpointBehavior を実装するクラスを作り、ClientRuntime.ClientMessageInspectors にメッセージ インスペクターを追加します。

public class BearerEndpointBehavior : IEndpointBehavior
{

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.ClientMessageInspectors.Add(new BearerClientMessageInspector());
    }

}

SoapClientEndpointBehaviors にビヘイビアーを追加します。

using (var client = new ExcelServiceSoapClient())
{
    client.Endpoint.EndpointBehaviors.Add(new BearerEndpointBehavior());
    var status = default(Status[]);
    var sessionId = client.OpenWorkbook(FilePath, "", "", out status);
    var cell = client.GetCellA1(sessionId, "Sheet1", "A1", false, out status);
    client.CloseWorkbook(sessionId);
}

おわりに

Graph Excel REST API 使えってことですね。

脚注
  1. まさかこのご時世に Excel COM でやろうとする人はいないですよね。 ↩︎

Discussion