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

本記事では、Google Cloudで提供されているFaaS、Cloud Functionsで「DioDocs(ディオドック)」を使用したC#( .NET Core 3.1)の関数アプリケーションを作成し、ExcelやPDFファイルを出力する方法について紹介します。

Cloud Functionsとは?

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

Cloud Functionsは.NET Core 3.1をサポートしており、C#で .NET Coreベースの関数アプリケーションを作成できます。今回はVisual Studioで利用できるCloud Functionsのテンプレートを使用してVisual Studio 2022で関数アプリケーションを作成し、Google Cloudへデプロイして確認してみます。

実装する内容

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

事前準備

Google Cloudでプロジェクトの作成、選択、サービスの有効化

クイックスタート: .NET を使用して HTTP Cloud Functions の関数を作成してデプロイする 」の「gcloud CLI を使用した GCP プロジェクトの作成」の手順1~4のとおりに、Google Cloud プロジェクトを作成、選択して「Cloud Functions API」サービスと「Cloud Build API」サービスを有効にします。

Cloud SDKのインストールと初期化

gcloud CLI を使用した GCP プロジェクトの作成」の手順5「gcloud CLI をインストールして初期化します。」を実施します。このリンクからはCloud SDKのトップページにリンクされているだけで少々わかりづらいのですが、 ここからリンクされている「Cloud SDK のインストール」の手順に沿ってCloud SDKをインストール、初期化します。

これでgcloud CLIが使えるようになったのでその後、手順6「gcloud コンポーネントを更新してインストールします。」を実行しておきます。

.NETの開発環境の設定

gcloud CLI を使用した GCP プロジェクトの作成」の手順7「開発環境を準備します。」を実施します。

テンプレートパッケージのインストール

dotnet new installコマンドを使用してCloud Functionsのプロジェクトテンプレートをインストールしておきます。「テンプレート パッケージの使用」に記載の以下のコマンドを実行します。

dotnet new -i Google.Cloud.Functions.Templates

これでVisual StudioからCloud Functionsのプロジェクトを作成できるようになります。

Cloud Functionsアプリケーションを作成

Visual Studio 2022でプロジェクトテンプレート「Google Cloud Functions HttpFunction (Google LLC)」を選択して[次へ]をクリックします。

Cloud Functionsアプリケーションを作成

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

Cloud Functionsアプリケーションを作成

「ExcelExportCloudHttpFunction1」プロジェクトが作成されます。

Cloud Functionsアプリケーションを作成

NuGetパッケージを追加

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

NuGetパッケージを追加

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

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

using GrapeCity.Documents.Excel;
using System.IO;

:

public async Task HandleAsync(HttpContext context)
{
    HttpRequest request = context.Request;
    string name = request.Query["name"].ToString();

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

    //Workbook.SetLicenseKey("");

    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();
    }

    context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    context.Response.Headers.Add("Content-Disposition", "attachment;filename=Result.xlsx");
    await context.Response.Body.WriteAsync(output);
}

DioDocs for Excelで作成したExcelファイルをMemoryStreamに保存し、これをHttpResponseBodyに設定してダウンロードできるように設定しています。

デバッグ実行で確認

作成したCloud Functionsの関数アプリケーションをVisual Studioからデバッグ実行して確認します。ブラウザのアドレスバーにコンソールに表示されるURL「http://127.0.0.1:8080」に、クエリパラメータと文字列「?name=DioDocs(ディオドック)」を追加して、関数アプリケーションを実行します。

デバッグ実行で確認

実行するとクエリパラメータで渡した文字列「DioDocs(ディオドック)」が追加されたExcelファイル「Result.xlsx」がローカルに出力されます。

デバッグ実行で確認

Google Cloudへデプロイ

Visual Studioの「ソリューション エクスプローラー」からプロジェクトを右クリックして、コンテキストメニューから[ターミナルで開く]をクリックして「開発者用 PowerShell」を起動します。

Google Cloudへデプロイ

gcloud functions deployコマンドを実行してGoogle CloudへCloud Functionsの関数アプリケーションをデプロイします。

gcloud functions deploy diodocs-excel-export-function1 --entry-point ExcelExportCloudHttpFunction1.Function --runtime dotnet3 --trigger-http --allow-unauthenticated
コマンド実行時にエラー「PSSecurityException」が発生する場合は、「開発者 コマンドプロンプト」もしくは「Developer PowerShell 7」へ変更してコマンドを実行します。(開発者用 PowerShellをそのまま使用する場合は、Windowsの設定から「プライバシーとセキュリティ」-「開発者向け」-「PowerShell」で実行ポリシーを変更するとエラーは解消されます)

Google CloudのCloud Functionsにも以下のようにデプロイが完了した関数アプリケーションが表示されます。

Google Cloudへデプロイ

(2022.11.16追記)

2022.8.10に第2世代のCloud FunctionsがGAされています。また、.NET 6も利用できるようになっていますので、そちらを利用する場合は以下のコマンドを実行してください。

gcloud functions deploy diodocs-excel-export-function1 --gen2 --entry-point ExcelExportCloudHttpFunction1.Function --runtime dotnet6 --trigger-http --allow-unauthenticated

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

ブラウザのアドレスバーに、関数アプリケーションのURLにクエリパラメータと文字列「?name=DioDocs(ディオドック)」を追加して、関数アプリケーションを実行します。

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

この関数アプリケーションを実行するとクエリパラメータで渡した文字列「DioDocs(ディオドック)」が追加されたExcelファイル「Result.xlsx」がローカルに出力されます。

デバッグ実行で確認

PDFを出力するには?

Visual Studioの「NuGet パッケージ マネージャー」から DioDocs for PDFのパッケージ「GrapeCity.DioDocs.Pdf.ja」をインストールします。 DioDocs for PDFでPDFファイルを作成するコードを追加してHandleAsyncを以下のように更新します。

using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using System.Drawing;
using System.IO;

:

public async Task HandleAsync(HttpContext context)
{
    HttpRequest request = context.Request;
    string name = request.Query["name"].ToString();

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

    //GcPdfDocument.SetLicenseKey("");

    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();
    }

    context.Response.ContentType = "application/pdf";
    context.Response.Headers.Add("Content-Disposition", "attachment;filename=Result.pdf");
    await context.Response.Body.WriteAsync(output);
}

さいごに

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

本記事ではGoogle CloudのCloud Functionsで作成したAPIを使用して直接ローカルへExcelとPDFファイルを出力する方法を紹介しましたが、ファイルの保存先としてCloud Storageを使うより実践的な方法もあります。こちらは次回の記事で紹介しています。


弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。

また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。

\  この記事をシェアする  /