Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

サーバーサイドでExcelファイルを読み書きするWebアプリケーションを作る

ASP.NET MVCやMicrosoft Azure Functions上でExcel処理を記述しよう

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/05/26 14:00
目次

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ファイルの参照がバインドされます。

MyFuncrions.cs
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ポータルサイトから行った時の図です。

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



  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 矢後 比呂加(ヤゴ ヒロカ)

     Microsoft MVP for Visual Studio and Development Technologies(https://mvp.microsoft.com/ja-jp/PublicProfile/5000246)  シグマコンサルティング株式会社にて、Microsoft Azu...

バックナンバー

連載:ComponentZine(ComponentOne Studio)

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5