からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

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

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

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

サンプル コード

github.com

Access Token の取得方法は以下の記事を参考にしてください。今回のサンプルでは Refresh Token を使った Access Token の再取得も実装しています。

blog.karamem0.jp

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;
    }

    (snip)

}

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

public class BearerEndpointBehavior : IEndpointBehavior {

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

    (snip)

}

SoapClient の EndpointBehaviors にビヘイビアーを追加します。

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);
}

*1:まさかこのご時世に Excel COM でやろうとする人はいないですよね