Azure FunctionsでExcelファイルを読み書きする
Excelコンポーネントは、.NET Framework向けのライブラリなので、サーバー以外のクライアントアプリであるWPF等でも動作し、ASP.NET MVCが動作する環境と同じであればクラウド上でも動作します。Microsoft Azureの場合は、IaaSの仮想マシンやPaaSのApp Service・WebJob、さらにサーバーレスアーキテクチャのサービスのAzure Functionsの選択肢があります。ただし、ComponentOne Studioはライセンス製品なので、認証されたマシンで予めビルドが必要になるなど、ライセンスの考慮は必要になります。
Excelファイルの処理を、例えばAzure Functionsに切り出すことにより、Excelファイルの処理にのみリソース(マシンのリソースや、料金等)を集中できます。例えば、1日1回のバッチとして動かしたり、HTTPをトリガーとして起動して結果をメールで送信したりする、といった構成を素早く立ち上げることができます。
ここでは、Azure FunctionsにてExcelファイルを読み書きする処理を動かす方法を簡単に紹介します。Azure BLOBストレージ上にExcelファイルが配置されたときをトリガーとし、生成したExcelファイルは同じくAzure BLOBストレージ上に配置するよう設定します。
Azure Functionsでは、JavaScript・C#・F#など、さまざまな言語で関数を作成でき、直接Azureポータルのサイトからコードを記述できます。また、関数をC#で記述したファイル(.cs)を事前にコンパイルし、dllファイルをアップロードすることもできます。今回はライセンス認証のために事前にビルドが必要なので、後者の方法を選択します。以下のサイトから、ベースとなるプロジェクトをダウンロードします(または、本記事に添付しているサンプルファイル内のPreCompiledFunctionSampleを利用します)。
Azure Functionsにおけるプリコンパイルのサポートについてはこちらを参照します。
先述のように、ライセンスファイル「License.licx」を追加し、「C1.C1Excel.4.dll」を参照します。
プロジェクト内の「MyFuncrions.cs」クラスには、次のように記述します。ここでは、Azure BLOBストレージにアップロードされたExcelファイルを読み取り、一番左上のセルに「よくできました!」と書き込む処理を記述しています。MyFunctionクラスのRunメソッドの引数には、Azure Functionsにより、それぞれ次のように内容がバインドされます。myBlob変数にはトリガーとなったBLOBファイルが、name変数には、トリガーとなったBLOBファイルの名前が、outputBlob変数には出力先となるBLOBファイルの参照がバインドされます。
using C1.C1Excel; using System.IO; using System.Threading.Tasks; namespace PreCompiledFunctionSample { public class MyFunction { public static async Task Run(Stream myBlob, string name, Stream outputBlob) { using (var input = new MemoryStream()) using (var output = new MemoryStream()) { myBlob.CopyTo(input); var excelBook = new C1XLBook(); excelBook.Load(input, FileFormat.OpenXml); XLSheet sheet = excelBook.Sheets[0]; sheet[rowIndex: 0, colIndex: 0].Value = "よくできました!"; excelBook.Save(output, FileFormat.OpenXml); var byteArray = output.ToArray(); await outputBlob.WriteAsync(byteArray, 0, byteArray.Length); } } //省略
プロジェクトをビルドした後、生成された「PreCompiledFunctionSample.dll」と「C1.C1Excel.4.dll」と「function.json」の3つのファイルを、Azure Functions上にアップロードします。次の図は、Azureポータルサイトでアップロードした後の画面です。
トリガーと出力の設定は、Azure ポータルサイト上から行うか、または「function.json」でコードベースで設定します。次の図は、Azureポータルサイトから行った時の図です。
{ "bindings": [ { "type": "blobTrigger", "name": "myBlob", "path": "mycontainer/{name}", "connection": "c1func8159_STORAGE", "direction": "in" }, { "type": "blob", "name": "outputBlob", "path": "outcontainer/{name}", "connection": "c1func8159_STORAGE", "direction": "out" } ], "scriptFile": "PreCompiledFunctionSample.dll", "entryPoint": "PreCompiledFunctionSample.MyFunction.Run", "disabled": false }
Azure Functionsを起動後、Azure BLOBストレージの「mycontainer」コンテナーに「Book1.xlsx」ファイルをアップロードすると、処理が開始され、「outcontainer」コンテナーに「Book1.xlsx」ファイルが生成されることが確認できます。
まとめ
Excelコンポーネントを使用すると、Excelファイルの読み書きを行うプログラムを記述できます。.NET Framework上で動作するので、ASP.NET MVC等で作成したWebアプリケーションにExcelファイルを活用した機能を搭載できます。また、Azure Functionsなどのクラウド上でも動作するので、Excelファイルの処理に合わせた構成が可能です。