SharePoint Online の Excel Services (SOAP API) を叩いてみる
はじめに
Excel Services を使うと SharePoint のドキュメント ライブラリに保存されている Excel ファイルを直接編集できます。一般的には、プログラムからの Excel の編集といえば、Open XML SDK を使うか、サードパーティー製のコンポーネントを使うかになります。Excel Services を使えば、それらを使う必要がなく、セルの読み書き程度であれば簡単にできてしまいます。[1] SOAP なので Visual Studio からは サービス参照の追加 で簡単に呼び出すことができます。
ただし SharePoint Online の場合はこの方法では問題があります。SharePoint Online は OAuth なので、対応していないと思われる WCF ではアクセス許可が通りません。なので、自力で HTTP ヘッダーを追加してあげる必要があります。
サンプル コード
実行手順
Access Token の取得方法は以下の記事を参考にしてください。今回のサンプルではリフレッシュ トークンを使ったアクセス トークンの再取得も実装しています。
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());
}
}
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);
}
おわりに
Graph Excel REST API 使えってことですね。
-
まさかこのご時世に Excel COM でやろうとする人はいないですよね。 ↩︎
Discussion