2008-12-06 4 views
2

Я ищу бесплатный шаблон для генерации простых отчетов. Я хочу, чтобы некоторые базовые функции, такие как:Templating Engine для генерации простых отчетов в .NET

  • Умение писать Loops (с любым IEnumerable)
  • Передача переменных
  • Передача файлов шаблонов (основной шаблон, сноска, заголовок)

I» Это можно использовать для создания отчетов в формате HTML и XML. Я не ищу шаблонный шаблон ASP.NET.

Это для приложений WinForms.

Я видел этот вопрос Can you recommend a .net template engine?, однако все эти шаблонные двигатели являются полным избытком для меня и сфокусированы на ASP.NET.

Пожалуйста, рекомендуйте только бесплатные библиотеки. не

// Я все еще ищу в NVelocity, но это не выглядит многообещающим для .NET, слишком сложным, когда вы загружаете это кучу файлов, не ясно, что делать, не учебник, документ запуска и т.д.

+0

Я не знаю ответа, но tip: если вы хотите привлечь больше пользователей, удалите вопрос и вставьте его и не установите флаг wiki сообщества. «community 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). Я использовал его для генерации писем. Вы можете использовать группы шаблонов, хранящиеся в Файловой системе или в базе данных (это требует немного работы).

+0

Вы знаете какой-либо сайт для некоторых .NET-примеров для stringtemplate? – 2008-12-06 16:56:56

2

Мы используем NVelocity как часть нашего веб-сайта на основе MonoRail. Честно говоря, я бы не рекомендовал NVelocity. Это прямой порт (и прямым я имею в виду CTRL + C, CTRL + V, изменить некоторые ключевые слова Java на ключевые слова C# - это не поддерживается) от версии Java до версии .NET. Замок должен был разветвить его, чтобы добавить некоторые .NET-ориентированные функции (доступ к словарю, причудливые петли foreach), так как оригинальные разработчики .NET оставляют его в нездоровом состоянии. Имеет проблемы, сдерживающие некоторые из его собственных директив, становится очень раздраженным, если вы попытаетесь разделить длинный оператор if на несколько строк. Я не хочу сбрасывать его, это хороший язык, он бесплатный, и он используется на нашем сайте, который обслуживает тысячи запросов в день - я просто не буду использовать его снова, если не увижу новую реализацию такой же синтаксис.

Для других областей системы, которые генерируют электронные письма, я просто использую старомодный метод замены $ SPECIAL_KEYWORDS $ в строке (то есть, словарь, который сопоставляет ключевые слова для значений, перебирает его и заменяет) , Неэффективен, но работает достаточно хорошо.

Посмотрите вперед, чтобы прочитать некоторые другие ответы.

0

Спасибо за помощь, CodeDOM специально показал мне хороший способ, сейчас я работаю с этим: http://www.stefansarstedt.com/templatemaschine.html

Это не самое лучшее и немного грязное, но для меня это трюк. Это LGPL, который подходит мне и короткий.

Я посмотрел на другие предложения, но их не любят, слишком сложны для того, что я хочу (и довольно грязный -Тонны из DLL, зависимостей etc.-)

0

Резиг имеет большой шаблон 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, как показано в этом 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 один. Он не нуждается в каких-либо библиотеках, которые не включены в визуальную студию. Если вам не нужны слишком сложные шаблоны или отчеты, возможно, стоит заглянуть.

Шаблон Пример кода:

<#@ 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);