本記事では、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)」を選択して[次へ]をクリックします。
プロジェクト名に「ExcelExportCloudHttpFunction1」を入力して[作成]をクリックします。
「ExcelExportCloudHttpFunction1」プロジェクトが作成されます。
NuGetパッケージを追加
Visual Studioの「NuGet パッケージ マネージャー」からDioDocs for Excelのパッケージ「GrapeCity.DioDocs.Excel.ja」をインストールします。
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
に保存し、これをHttpResponse
のBody
に設定してダウンロードできるように設定しています。
デバッグ実行で確認
作成したCloud Functionsの関数アプリケーションをVisual Studioからデバッグ実行して確認します。ブラウザのアドレスバーにコンソールに表示されるURL「http://127.0.0.1:8080」に、クエリパラメータと文字列「?name=DioDocs(ディオドック)」を追加して、関数アプリケーションを実行します。
実行するとクエリパラメータで渡した文字列「DioDocs(ディオドック)」が追加されたExcelファイル「Result.xlsx」がローカルに出力されます。
Google Cloudへデプロイ
Visual Studioの「ソリューション エクスプローラー」からプロジェクトを右クリックして、コンテキストメニューから[ターミナルで開く]をクリックして「開発者用 PowerShell」を起動します。
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にも以下のようにデプロイが完了した関数アプリケーションが表示されます。
(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アプリケーションのサンプルはこちらです。
- https://github.com/GrapeCityJP/ExcelExportCloudHttpFunction1
- https://github.com/GrapeCityJP/PDFExportCloudHttpFunction1
本記事ではGoogle CloudのCloud Functionsで作成したAPIを使用して直接ローカルへExcelとPDFファイルを出力する方法を紹介しましたが、ファイルの保存先としてCloud Storageを使うより実践的な方法もあります。こちらは次回の記事で紹介しています。
弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。
また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。