2

簡単なレポートを生成する無料のテンプレート エンジンを探しています。次のような基本的な機能が必要です。

  • ループを記述する機能 (任意の IEnumerable を使用)
  • 変数を渡す
  • テンプレート ファイルの受け渡し (メイン テンプレート、フッター、ヘッダー)

これを使用して、HTML および XML でレポートを生成します。ASP.NET テンプレート エンジンを探しているわけではありません。

これは、WinForms アプリケーション用です。

この質問を見たことがあります。.net テンプレート エンジンをお勧めできますか? 、しかし、これらのテンプレート エンジンはすべて私にとって完全にやり過ぎであり、ASP.NET に焦点を当てています。

無料のライブラリのみを推奨してください。

// 私はまだ NVelocity を探していますが、.NET には有望ではないようです。非常に複雑です。ダウンロードすると、何をすべきか明確でないファイルの束であり、チュートリアルやスタートアップ ドキュメントなどはありません。

4

8 に答える 8

3

次に、nVelocity はお勧めしません。恐ろしい港です。

.NET には、CodeDOM を使用したテンプレート機能が組み込まれています。

これを行う方法のかなり良いチュートリアルを次に示します。

http://www.codeproject.com/KB/cs/smarttemplateengine.aspx

少しコーディングするだけで、インライン C# を含むテンプレートを作成できます。

<html>
    <head>
         <title>My Report</title>
    </head>
    <body>
        <% foreach (ReportRow r in ReportData) { %>
             <!-- Markup and Code for Report -->
        <% } %>
    </body>
</html>
于 2008-12-06T17:33:00.640 に答える
2

MonoRail ベースの Web サイトの一部として NVelocity を使用しています。正直なところ、NVelocity はお勧めしません。これは、Java バージョンから .NET バージョンへの直接ポートです (直接とは、CTRL+C、CTRL+V を意味し、一部の Java キーワードを C# キーワードに変更します。これは保守できません)。Castle は、元の .NET メンテナーが不健全な状態のままにしているために、いくつかの .NET 指向の機能 (辞書アクセス、ファンシーな foreach ループ) を追加するためにそれをフォークする必要がありました。独自のディレクティブの一部をエスケープする際に問題があり、長い if ステートメントを複数行に分割しようとすると、非常にイライラします。私はそれをすべてダンプするつもりはありません.それは素晴らしい言語であり、無料であり、1日に何千ものリクエストを処理する私たちのサイトで使用されています.同じ構文。

電子メールを生成するシステムの他の領域については、文字列内の $SPECIAL_KEYWORDS$ を置換する昔ながらの方法 (つまり、キーワードを値にマップし、それを反復して置換する辞書) を使用するだけです。効率的ではありませんが、十分に機能します。

他の回答のいくつかを読むことを楽しみにしています。

于 2008-12-06T16:57:38.997 に答える
2

すでに回答を受け入れているようですが、Spark ビュー エンジンをご覧になることをお勧めします。

サイトからの例:

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
  <li each="var p in products">${p.Name}</li>
</ul>
<else>
  <p>No products available</p>
</else>
于 2010-05-09T23:37:39.153 に答える
2

StringTemplate ( http://www.stringtemplate.org ) をお勧めします。メールの生成に使用しました。ファイルシステムまたはデータベースに保存されているテンプレート グループを使用できます (少し手間がかかります)。

于 2008-12-06T16:51:52.567 に答える
0

助けてくれてありがとう、CodeDOMは私に素晴らしい方法を具体的に示しました、今私はこれで働いています:http: //www.stefansarstedt.com/templatemaschine.html

それは最高ではなく、少し汚いですが、私のためにトリックをやっています。私にぴったりのLGPLで、短いです。

私は他の提案を見てきましたが、それらが気に入らなかったので、私が望むものには複雑すぎました(そして非常に厄介な-大量のDLL、依存関係など-)

于 2008-12-06T20:26:56.470 に答える
0

別のテンプレート エンジンは次のとおりです: UltTemplate エンジン

テンプレートコードは次のとおりです。

Dear $User.FullName$,
{%set orders=User.GetOrders() /}
Thank you for your order of $orders.Length$ items, We believe you will be very satisfied with the quality of costume pieces included in each. It is this quality that makes our imaginative play apparel so unique.

We created an account for you to track your orders. Here is the login information:
Email: $User.EmailAddress$
Password: $User.Password$

Following is the details of your order (OrderId: $OrderId$):
#   Part ID    Name            Quantity     Price(per unit)       Sub Total
{%set Total=0.0 /}{%foreach orderproduct,i in orders%}{%set Total = Total + orderproduct.Price * orderproduct.Quantity/}
{%rendertemplate orderproducttemplate item=orderproduct/}{$foreach%}
                                                                                               Total: $PadLeft(Format(Total,"$$#.##"),11)$

If you have any concern, please call us at 913-555-0115.

Sincerely,

$CompanyName$

{%template orderproducttemplate%}$PadLeft(i,4)$$PadLeft(item.PartId, 7)$    $PadRight(item.ProductName, 15)$        $PadRight(item.Quantity, 5)$        $PadLeft(Format(item.Price,"$$#.##"), 7)$   $PadLeft(Format(item.Price*item.Quantity,"$$#.##"), 12)${$template%}

出力は次のとおりです。

Dear John Borders,

Thank you for your order of 3 items, We believe you will be very satisfied with the quality of costume pieces included in each. It is this quality that makes our imaginative play apparel so unique.

We created an account for you to track your orders. Here is the login information:
Email: myemail@somedomain.com
Password: 123abc

Following is the details of your order (OrderId: 1625DGHJ):
#   Part ID    Name            Quantity     Price(per unit)       Sub Total

   0   1239    Product A              3            $104.09        $312.27
   1     22    Product B              1            $134.09        $134.09
   2    167    Product C              5              $14.7          $73.5

                                               Total:     $519.86

If you have any concern, please call us at 913-555-0115.

Sincerely,

My Company Name

C# コードは次のとおりです。

        class OrderProduct
        {
            private int _partId;
            private string _productName;
            private int _quantity;
            private float _price;

            public int PartId
            {
                get { return _partId; }
                set { _partId = value; }
            }

            public string ProductName
            {
                get { return _productName; }
                set { _productName = value; }
            }

            public int Quantity
            {
                get { return _quantity; }
                set { _quantity = value; }
            }

            public float Price
            {
                get { return _price; }
                set { _price = value; }
            }
        }

        class User
        {
            private string _fullName;
            private string _emailAddress;
            private string _password;

            public string FullName
            {
                get { return _fullName; }
                set { _fullName = value; }
            }

            public string EmailAddress
            {
                get { return _emailAddress; }
                set { _emailAddress = value; }
            }

            public string Password
            {
                get { return _password; }
                set { _password = value; }
            }

            public OrderProduct[] GetOrders()
            {
                OrderProduct[] ops = new OrderProduct[3];

                ops[0] = new OrderProduct();
                ops[0].PartId = 1239;
                ops[0].Price = 104.09f;
                ops[0].ProductName = "Product A";
                ops[0].Quantity = 3;

                ops[1] = new OrderProduct();
                ops[1].PartId = 22;
                ops[1].Price = 134.09f;
                ops[1].ProductName = "Product B";
                ops[1].Quantity = 1;

                ops[2] = new OrderProduct();
                ops[2].PartId = 167;
                ops[2].Price = 14.7f;
                ops[2].ProductName = "Product C";
                ops[2].Quantity = 5;

                return ops;
            }
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            try
            {
                dt.LoadFromString(txtSource.Text);
                dt.SetValue("CompanyName", "My Company Name");

                User u = new User();
                u.EmailAddress = "myemail@somedomain.com";
                u.FullName = "John Borders";
                u.Password = "123abc";
                dt.SetValue("User", u);
                dt.SetValue("OrderId", "1625DGHJ");

                txtOutput.Text = dt.Run();
            }
            catch (Exception exc)
            {
                MessageBox.Show("An error occurred: " + exc.Message);
            }
        }
于 2010-05-09T23:21:43.510 に答える
0

これらの回答を読んでいると、小さなアプリケーションの場合、すべての回答やライブラリなどがかなり複雑であることに注意せざるを得ません。したがって、 T4T Text Templatesを提案したいと思います。

これは、1つを書くためのチュートリアルです。Visual Studio に含まれていないライブラリは必要ありません。過度に複雑なテンプレートやレポートが必要ない場合は、覗いてみる価値があるかもしれません。

テンプレート コードの例:

    <#@ template language="C#" #>
<html><body>
<h1>Sales for Previous Month</h2>
<table>
    <# for (int i = 1; i <= 10; i++)
       { #>
         <tr><td>Test name <#= i #> </td>
             <td>Test value <#= i * i #> </td> </tr>
    <# } #>
 </table>
This report is Company Confidential.
</body></html>

アプリケーション コードでは、次のような呼び出しを使用してテンプレートのコンテンツを生成できます。

MyWebPage page = new MyWebPage();
String pageContent = page.TransformText();
System.IO.File.WriteAllText("outputPage.html", pageContent);
于 2016-02-29T09:28:57.200 に答える