前回に引き続き、本記事でも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)」を選択して[次へ]をクリックします。
プロジェクト名に「ExcelExportCloudHttpFunction2」を入力して[作成]をクリックします。
「ExcelExportCloudHttpFunction2」プロジェクトが作成されます。
NuGetパッケージを追加
DioDocs for Excel
Visual Studioの「NuGet パッケージ マネージャー」からDioDocs for Excelのパッケージ「GrapeCity.DioDocs.Excel.ja」をインストールします。
Google.Cloud.Storage.V1(Google Cloud Client Libraries for .NET)
同じ手順でCloud Storage用のクライアントアプリのパッケージ「Google.Cloud.Storage.V1」をインストールします。
Cloud Storageにバケットを作成
Cloud StorageにDioDocs for Excelで作成したExcelファイルの保存先になるバケット「diodocs-export」を、Google Cloudのコンソールから作成します。
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」を起動します。
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にも以下のようにデプロイが完了した関数アプリケーションが表示されます。
(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アプリケーションのサンプルはこちらです。
- https://github.com/GrapeCityJP/ExcelExportCloudHttpFunction2
- https://github.com/GrapeCityJP/PDFExportCloudHttpFunction2
Cloud FunctionsでDioDocsを利用する際に、日本語フォントを使用するTipsについては次回の記事で紹介したいと思います。
弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。
また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。