この記事は公開から3年以上経過しています。
.NETアプリケーション開発でHTMLやCSVなどのテキストファイルを動的に生成する際、サードパーティ製ライブラリなどを使わず、StringBuilderで1行ずつゴリゴリ書いたり自前で置換などを行うこともなくPerl/ASP/PHP/BlazorのようなCGIライクな処理をT4で実現する方法。
手順&サンプルソースコード
本例はC#で説明していますが、VB.NETもほぼ同様です。
-
C#のコンソールアプリケーションプロジェクトを作成し、プロジェクトに
新しい項目の追加
からランタイム テキスト テンプレート
を選択してT4テンプレートファイルReport.tt
を追加する。 -
前項で作成した
Report.tt
に、動的にHTMLを生成するためのコードをHTMLとC#で記述する(Bootstrap5のCDNを利用しています)。T4テンプレートファイル
<#@ template language="C#" #> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous" /> <title><#= ReportData.Title #></title> </head> <body> <div class="container" style="padding: 50px"> <div class="row"> <div class="col"> <h1><#= ReportData.Header #></h1> </div> </div> <div class="row"> <div class="col"> <div class="table-responsive"> <table class="table"> <thead> <tr> <th>Name</th> <th>Score</th> </tr> </thead> <tbody> <# foreach(var row in ReportData.Rows) { #> <tr> <td><#= row.Name #></td> <td><#= row.Score #></td> </tr> <# } #> </tbody> </table> </div> </div> </div> </div> </body> </html>
-
プロジェクトに新規クラスファイル
ReportCode.cs
を追加し、前項で作成したテンプレートにデータを引き渡すコードを記述する。T4テンプレートの部分クラス&DTOクラス群
using System.Collections.Generic; namespace T4Test210720 { // Report.ttの部分クラス partial class Report { public ReportData ReportData { get; } public Report(ReportData reportData) { ReportData = reportData; } } // レポートデータ public sealed class ReportData { // タイトル public string Title { get; set; } // ヘッダ public string Header { get; set; } // テーブル行データ群 public IReadOnlyCollection<RowData> Rows { get; set; } } // テーブル行データ public sealed class RowData { // 名前 public string Name { get; set; } // スコア public string Score { get; set; } } }
※クラス名はT4テンプレート名と同じ
Report
でpartial
キーワードがあることに注意。 -
Program.cs
に、T4テンプレートへデータを引き渡してHTMLの生成&表示を行うコードを記述する。メイン処理
using System.Diagnostics; using System.IO; namespace T4Test210720 { internal class Program { private static void Main(string[] args) { // サンプルデータ var reportData = new ReportData { Title = "Hello T4!", Header = "An example of the T4 in C#", Rows = new[] { new RowData { Name = "Foo", Score = "80" }, new RowData { Name = "Bar", Score = "50" }, new RowData { Name = "Baz", Score = "100" } } }; // レポートHTML生成 var report = new Report(reportData); var reportHtml = report.TransformText(); // レポートHTMLファイル生成 var htmlFile = "test.html"; File.WriteAllText(htmlFile, reportHtml); // レポートHTMファイル表示 Process.Start(htmlFile); } } }
サンプルプログラムは以上です。上記コードを実行すると、下図のように動的生成したHTMLファイルを既定のウェブブラウザで表示します。
このときのHTMLソースは以下のとおりです。テンプレート内のコントロールブロック<# #>
に記載したC#コードが実行された結果で動的にHTMLが生成されていることが確認できます。
ちなみにT4に関する詳細については下記参考ウェブサイト(Microsoft Docs)に、とてもわかりやすく説明されているので、ここでの説明は割愛します。
参考ウェブサイトなど
- Microsoft Docs
コード生成と T4 テキスト テンプレート
以上です。