2008-12-06 98 views
2

我正在尋找免費的模板生成引擎來生成簡單的報告。我想一些基本的功能,如:用於在.NET中生成簡單報告的模板引擎

  • 筆頭循環(與任何的IEnumerable)
  • 傳遞變量
  • 傳遞模板文件(主模板,頁腳,標題)

我我們將使用它來生成HTML和XML報告。我不在尋找一個ASP.NET模板引擎。

這是一個WinForms應用程序。

我見過這個問題Can you recommend a .net template engine?,但是所有這些模板引擎對我來說都是過度殺毒,並且專注於ASP.NET。

請只推薦免費的圖書館。

//我仍在尋找一個NVelocity,但它看起來沒有什麼前途的.NET,過於複雜,當你下載它的一堆文件不清楚該怎麼做,沒有教程,啓動文檔等

+0

我不知道答案,但提示:如果您想吸引更多用戶,請刪除問題並重新插入,並且不要設置社區wiki標誌。 「社區維基」upvotes不增加用戶的聲譽... – splattne 2008-12-06 16:49:26

+0

感謝您的提示,我不知道這一限制。我會爲未來的問題做到這一點。 – 2008-12-06 17:05:14

回答

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> 
1

我會推薦StringTemplate(http://www.stringtemplate.org)。我用它來生成郵件。您可以使用存儲在Filesystem或數據庫中的模板組(花費一點點工作)。

+0

你是否知道一些.NET模板的.NET例子的網站? – 2008-12-06 16:56:56

2

我們使用NVelocity作爲我們基於MonoRail的網站的一部分。坦率地說,我不會推薦NVelocity。它是一個直接的端口(並且直接指CTRL + C,CTRL + V,將一些Java關鍵字更改爲C#關鍵字 - 這是不可維護的)從Java版本轉換爲.NET版本。由於原來的.NET維護者將其置於不健康的狀態,因此Castle不得不分發它來添加一些面向.NET的功能(字典訪問,花哨的foreach循環)。如果你嘗試在多行中分割一個long if語句,有些問題會轉義掉它自己的一些指令。我不是故意要拋棄它,它是一種很好的語言,它是免費的,它用在我們的網站上,它每天處理數千個請求 - 我只是不會再使用它,除非我看到一個新的實現相同的語法。

對於生成電子郵件的系統的其他領域,我只是使用舊式方法來替換字符串中的$ SPECIAL_KEYWORDS $(即,將關鍵字映射爲值的字典,遍歷它並替換) 。效率不高,但效果不錯。

期待閱讀一些其他答案。

0

感謝您的幫助,CodeDOM專門給我展示了一種不錯的方式, 現在我正在使用這個:http://www.stefansarstedt.com/templatemaschine.html

這不是最好的,有點髒,但爲我做的伎倆。這是適合我的LGPL,簡稱。

我看了看其他的建議,但不喜歡他們,太複雜了我想要的東西(文件和DLL相當混亂-tons,依賴性等 - )

0

約翰Resig的有一個偉大的Javascript模板結尾叫做micro-template。爲模板的語法是:

<script type="text/html" id="item_tmpl"> 
    <div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>"> 
    <div class="grid_1 alpha right"> 
     <img class="righted" src="<%=profile_image_url%>"/> 
    </div> 
    <div class="grid_6 omega contents"> 
     <p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p> 
    </div> 
    </div> 
</script> 

模板功能將支持使用JavaScript,因此你得到的循環功能,並完全訪問DOM,所以任何的jQuery或其他框架爲您處理。這是一種非常靈活的方法,因爲它可以讓您以很少的努力和改動快速將新功能包含到網頁中。它也適用於.Net,如Dave Ward的post所示。

該模板可以是一個html文件,您可以使用$ .get()命令檢索該文件。您爲模板提供一個JSON對象作爲數據源。最後,還有一個功能允許您預編譯模板。

0

這裏是另一個模板引擎:UltTemplate Engine

這裏是模板代碼:

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: [email protected] 
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 = "[email protected]"; 
       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); 
      } 
     } 
2

雖然我看到你已經接受了答案,但我鼓勵你看看Spark view engine。從網站

例子:

<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> 
0

,因爲我通過這些答案,我不禁注意到,所有的答案,圖書館等都是較小的應用程序相當複雜的閱讀。因此,我想建議T4T Text Templates

這裏是一個教程Writing之一。它不需要任何未包含在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);