Azure FunctionsとDioDocsでExcelやPDFファイルを出力する (1)

本記事では、Azure Functionsで「DioDocs(ディオドック)」を使用したC#( .NET Core 3.1)のクラスライブラリをベースにした関数を作成し、ExcelやPDFファイルを出力する方法について紹介します。

Azure Functionsとは

Azure FunctionsはMicrosoft Azureで提供されている、各種イベントをトリガーに処理を実行するサーバーレスなアプリケーションを作成できるクラウドサービスです。

今回はVisual Studio 2019でAzure Functionsアプリケーションを作成し、Azureへデプロイして確認してみます。

実装する内容

今回実装する内容は非常にシンプルです。Azure FunctionsアプリケーションでHTTPトリガーを使用する関数を作成します。関数の実行時にDioDocsを使用してExcelとPDFファイルを作成し、クエリパラメータで受け取った文字列を追加します。その後、作成したExcelとPDFファイルをFileContentResultで直接ローカルへ出力する、といった内容です。

アプリケーションを作成

以下のドキュメントを参考にAzure Functionsアプリケーションを作成していきます。

クイック スタート:Visual Studio を使用して Azure で初めての関数を作成する

Visual Studio 2019でプロジェクトテンプレート「Azure Functions」を選択して[次へ]をクリックします。

Azure Functionsのプロジェクトテンプレート

プロジェクト名DioDocsFileExportFunctionAppを入力して[作成]をクリックします。

Azure Functionsのプロジェクトテンプレート

Azure Functionsで作成する関数のテンプレートを選択します。Http Triggerを選択して[作成]をクリックします。

Azure Functionsのプロジェクトテンプレート

DioDocsFileExportFunctionAppプロジェクトが作成されます。

Azure Functionsのプロジェクトテンプレート

NuGetパッケージの追加

Visual Studioの「NuGet パッケージ マネージャー」からDioDocsのパッケージGrapeCity.DioDocs.Excel.jaGrapeCity.DioDocs.Pdf.jaをインストールします。

NuGetパッケージマネージャー

DioDocs for Excelを使うコードを追加

DioDocsでExcelファイルを作成するコードを追加してFunction1を以下のように更新します。

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        string Message = string.IsNullOrEmpty(name)
            ? "Hello, World!!"
            : $"Hello, {name}!!";

        Workbook workbook = new Workbook();
        workbook.Worksheets[0].Range["A1"].Value = Message;

        byte[] output;
        using (var ms = new MemoryStream())
        {
            workbook.Save(ms, SaveFileFormat.Xlsx);
            output = ms.ToArray();
        }

        return new FileContentResult(output, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
        {
            FileDownloadName = "Result.xlsx"
        };
    }
}

DioDocs for PDFを使う関数を追加

ソリューションエクスプローラーからDioDocsFileExportFunctionAppプロジェクトを右クリックして[追加]-[新しい Azure 関数]を選択して、DioDocsでPDFファイルを作成する関数Function2を追加します。

新しいAzure Functionsの関数を追加
新しいAzure Functionsの関数を追加

関数のテンプレートを選択します。Http Triggerを選択して[追加]をクリックします。

新しいAzure Functionsの関数を追加

DioDocs for PDFを使うコードを追加

DioDocsでPDFファイルを作成するコードを追加してFunction2を以下のように更新します。

public static class Function2
{
    [FunctionName("Function2")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        string Message = string.IsNullOrEmpty(name)
            ? "Hello, World!!"
            : $"Hello, {name}!!";

        GcPdfDocument doc = new GcPdfDocument();
        GcPdfGraphics g = doc.NewPage().Graphics;

        g.DrawString(Message, 
            new TextFormat() { Font = StandardFonts.Helvetica, FontSize = 12 },
            new PointF(72, 72));

        byte[] output;

        using (var ms = new MemoryStream())
        {
            doc.Save(ms, false);
            output = ms.ToArray();
        }

        return new FileContentResult(output, "application/pdf")
        {
            FileDownloadName = "Result.pdf"
        };
    }
}

デバッグ実行で確認

作成したAzure Functionsアプリケーションをローカルでデバッグ実行して確認します。Visual Studioからデバッグ実行すると以下のコンソールが表示されます。

デバッグ実行で確認

アプリケーションに含まれる関数のURLはhttp://localhost:7071/api/Function1http://localhost:7071/api/Function2となっています。このURLにクエリパラメータと文字列?name=DioDocsを追加して、それぞれの関数をブラウザで実行します。

デバッグ実行で確認
デバッグ実行で確認

ローカルのフォルダに保存されたResult.xlsxResult.pdfを確認します。クエリパラメータで渡した文字列DioDocsが表示されていれば成功です。

デバッグ実行で確認
デバッグ実行で確認

Azureへデプロイ

作成したAzure FunctionsアプリケーションをAzureへデプロイして確認します。ソリューションエクスプローラーからDioDocsFileExportFunctionAppプロジェクトを右クリックして[発行]を選択します。

デプロイして確認

公開するターゲットは「Azure」を選択します。特定のターゲットは「Azure Function App (Windows)」を選択します。

デプロイして確認
デプロイして確認

アプリケーションの名前やリソースグループなどを設定して[作成]をクリックします。

デプロイして確認

以下の画面に切り替わったら[完了]をクリックします。

デプロイして確認

これで公開の準備が完了しました。Visual Studioで[発行]をクリックして作成したAzure FunctionアプリケーションをAzureへデプロイします。

デプロイして確認

公開が完了するとメッセージが表示されます。

デプロイして確認

デプロイしたアプリケーションを確認

Visual StudioのCloud ExplorerからデプロイしたAzure Functionsアプリケーションを選択して「ポータルで開く」をクリックします。Azureポータルでデプロイしたアプリケーションが表示されます。

デプロイしたAzure Functionsの関数を確認する

Azureポータルで「関数」を選択するとAzure Functionsアプリケーションに含まれる関数Function1Function2が表示されます。

デプロイしたAzure Functionsの関数を確認する

関数Function1をクリックして「コードとテスト」を選択します。「関数の URL を取得」が表示されるのでこちらをクリックします。

デプロイしたAzure Functionsの関数を確認する

ポップアップで表示される「クリップボードにコピー」をクリックして関数のURLをコピーします。

デプロイしたAzure Functionsの関数を確認する

コピーしたURLをブラウザに張り付けて、さらにクエリパラメータと文字列&name=DioDocsを追加します。

デプロイしたAzure Functionsの関数を確認する

関数を実行するとデバッグ実行時と同じように、クエリパラメータで渡した文字列が追加されたExcelファイルがローカルに出力されます。関数Function2も同じ手順で確認できます。


さいごに

動作を確認できるAzure Functionsアプリケーションのサンプルはこちらです。

https://github.com/GrapeCityJP/DioDocsFileExportFunctionApp

本記事ではFileContentResultクラスを使用して直接ローカルへExcelとPDFファイルを出力する方法を紹介しましたが、ファイルの保存先としてAzure Storageを使うより実践的な方法もあります。こちらも今後の記事で紹介したいと思います。