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ファイルの処理に合わせた構成が可能です。

