.net class templates reporting report

Templating Engine para generar informes simples en.NET



class templates (8)

En segundo lugar, no estoy recomendando nVelocity. Es un puerto horrible.

.NET en realidad ha incorporado habilidades de plantillas mediante el uso de CodeDOM.

Aquí hay un buen tutorial de cómo hacerlo:

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

Con algunos códigos menores, podrá crear plantillas que tengan C # en línea:

<html> <head> <title>My Report</title> </head> <body> <% foreach (ReportRow r in ReportData) { %> <!-- Markup and Code for Report --> <% } %> </body> </html>

Estoy buscando un motor de plantillas gratuito para generar informes simples. Quiero algunas características básicas como:

  • Capacidad de escribir bucles (con cualquier IEnumerable)
  • Pasar variables
  • Pasar archivos de plantillas (plantilla principal, pie de página, encabezado)

Lo usaré para generar informes en HTML y XML. No estoy buscando un motor de plantillas ASP.NET.

Esto es para una aplicación WinForms.

He visto esta pregunta ¿ Me puede recomendar un motor de plantilla .net? Sin embargo, todos esos motores de plantillas son excesivos para mí y están enfocados para ASP.NET.

Por favor, solo recomiende bibliotecas gratuitas.

// Todavía estoy buscando una NVelocity pero no parece prometedora para .NET, demasiado complicada, cuando la descargas hay un montón de archivos que no tienen claro qué hacer, ningún tutorial, documento de inicio, etc.


Gracias por la ayuda, CodeDOM específicamente me mostró una buena manera, ahora estoy trabajando con esto: http://www.stefansarstedt.com/templatemaschine.html

No es el mejor y un poco sucio pero haciendo el truco para mí. Es LGPL lo que me queda, y corto.

He visto las otras sugerencias, pero no me han gustado, demasiado complicado para lo que quiero (y bastante desordenado, toneladas de archivos DLL, dependencias, etc.)


Recomendaría StringTemplate ( http://www.stringtemplate.org ). Lo usé para la generación de correos. Puede usar Grupos de plantillas almacenados en el Sistema de archivos o en una base de datos (cuesta un poco de trabajo).


Usamos NVelocity como parte de nuestro sitio web basado en MonoRail. Honestamente, no recomendaría NVelocity. Es un puerto directo (y me refiero directamente a CTRL + C, CTRL + V, cambiar algunas palabras clave de Java a palabras clave de C #, esto no se puede mantener) de la versión de Java a la versión de .NET. Castle tuvo que bifurcarlo para agregar algunas características orientadas a .NET (acceso al diccionario, bucles foreach de fantasía) ya que los mantenedores originales de .NET lo están dejando en un estado insalubre. Tiene problemas para escapar de algunas de sus propias directivas, se irrita mucho si intenta dividir una sentencia larga en varias líneas. No me refiero a volcarlo todo, es un lenguaje agradable, es gratis y se usa en nuestro sitio, que sirve miles de solicitudes por día; simplemente no volvería a usarlo a menos que haya una nueva implementación de la aplicación. misma sintaxis

Para otras áreas del sistema que generan correos electrónicos, solo uso el método anticuado de reemplazar $ SPECIAL_KEYWORDS $ en una cadena (es decir, un diccionario que correlaciona palabras clave con valores, itera a través de él y lo reemplaza). No es eficiente, pero funciona lo suficientemente bien.

Esperamos leer algunas de las otras respuestas.


John Resig tiene un gran final de plantilla de Javascript llamado micro-plantilla . La sintaxis para una plantilla es:

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

La función de plantilla admitirá el uso de Javascript y, por lo tanto, obtendrá la funcionalidad de bucle y acceso total al DOM, por lo que cualquier jQuery u otro framework estará a su disposición. Este es un enfoque muy flexible, ya que le permite incluir rápidamente nuevas características en una página web con muy poco esfuerzo y alteración. También funciona bien con .Net como se muestra en esta publicación de Dave Ward.

La plantilla puede ser un archivo html que puede recuperar con un comando $ .get (). Alimenta la plantilla con un objeto JSON como fuente de datos. Finalmente, también hay una función que le permite precompilar la plantilla.


Aquí hay otro motor de plantillas: UltTemplate Engine

Aquí está el código de la plantilla:

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%}

y aquí está el resultado:

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

Aquí está el código 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); } }


Aunque veo que ya has aceptado una respuesta, te animo a que eches un vistazo al motor Spark view .

Ejemplo del sitio:

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


Mientras leo estas respuestas, no puedo dejar de notar que todas las respuestas, bibliotecas, etc. son bastante complicadas para las aplicaciones más pequeñas. Por lo tanto, me gustaría sugerir T4T Text Templates .

Aquí hay un tutorial para escribir uno. No necesita ninguna biblioteca que no esté incluida en Visual Studio. Si no necesita plantillas o informes demasiado complejos, podría valer la pena echar un vistazo.

Ejemplo de código de plantilla:

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

En el código de su aplicación, puede generar el contenido de su plantilla usando una llamada como esta:

MyWebPage page = new MyWebPage(); String pageContent = page.TransformText(); System.IO.File.WriteAllText("outputPage.html", pageContent);