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

前回に引き続き、本記事でも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レスポンスで直接ローカルへ出力していましたが、今回は作成したExcelとPDFファイルをCloud Storageへ出力します。

Cloud Storageへの保存にはGoogle Cloud APIを各言語で使用するためのクライアントライブラリで、.NETアプリケーション開発向けに提供されている「Google Cloud Client Libraries for .NET」を使用します。

事前準備

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アプリケーションを作成

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

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

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

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

NuGetパッケージを追加

DioDocs for Excel

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

NuGetパッケージを追加

Google.Cloud.Storage.V1(Google Cloud Client Libraries for .NET)

同じ手順でCloud Storage用のクライアントアプリのパッケージ「Google.Cloud.Storage.V1」をインストールします。

NuGetパッケージを追加

Cloud Storageにバケットを作成

Cloud StorageにDioDocs for Excelで作成したExcelファイルの保存先になるバケット「diodocs-export」を、Google Cloudのコンソールから作成します。

Cloud Storageにバケットを作成
Cloud Storageにバケットを作成

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

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

using Google.Cloud.Functions.Framework;
using Google.Cloud.Storage.V1;
using GrapeCity.Documents.Excel;
using Microsoft.AspNetCore.Http;
using System.IO;
using System.Threading.Tasks;

:

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 workbook = new Workbook();
    workbook.Worksheets[0].Range["A1"].Value = Message;

    using MemoryStream outputstream = new MemoryStream();
    StorageClient sc = StorageClient.Create();
    workbook.Save(outputstream, SaveFileFormat.Xlsx);
    await sc.UploadObjectAsync("diodocs-export", "Result.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", outputstream);
}

DioDocs for Excelで作成したExcelファイル「Result.xlsx」をMemoryStreamに保存し、これをStorageClientクラスのUploadObjectAsyncメソッドを使用してCloud Storageへアップロードしています。

デバッグ実行で確認

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

デバッグ実行で確認

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

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

Google Cloudへデプロイ

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

Google Cloudへデプロイ

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

gcloud functions deploy diodocs-excel-export-function2 --entry-point ExcelExportCloudHttpFunction2.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」がCloud Storageに出力されます。

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

PDFを出力するには?

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

using Google.Cloud.Functions.Framework;
using Google.Cloud.Storage.V1;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using Microsoft.AspNetCore.Http;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;

:

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 doc = new GcPdfDocument();
    GcPdfGraphics g = doc.NewPage().Graphics;

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

    using MemoryStream outputstream = new MemoryStream();
    StorageClient sc = StorageClient.Create();
    doc.Save(outputstream, false);
    await sc.UploadObjectAsync("diodocs-export", "Result.pdf", "application/pdf", outputstream);
}

さいごに

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

Cloud FunctionsでDioDocsを利用する際に、日本語フォントを使用するTipsについては次回の記事で紹介したいと思います。


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

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

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