2009-03-29 9 views
7

Actualmente estoy refacturando una aplicación de consola cuya principal responsabilidad es generar un informe basado en los valores almacenados en la base de datos.¿Cómo creo un informe html sin hardcoding html?

La forma en que he estado creando el informe arriba hasta ahora es el siguiente:

const string format = "<tr><td>{0, 10}</td><td> 
         {1}</td><td>{2, 8}</td><td>{3}</td><td>{4, -30}</td> 
         <td>{5}</td><td>{6}</td></tr>"; 

if(items.Count > 0) 
{ 
    builder.AppendLine(
     String.Format(format, "Date", "Id", "WorkItemId", 
         "Account Number", "Name", "Address", "Description")); 
} 

foreach(Item item in items) 
{ 
    builder.AppendLine(String.Format(format, item.StartDate, item.Id, 
         item.WorkItemId, item.AccountNumber, 
         String.Format("{0} {1}", 
            item.FirstName, item.LastName), 
         item.Address, item.Description)); 
} 

string report = String.Format("<html><table border=\"1\">{0} 
            </table></html>", 
           builder.ToString()); 

(Lo anterior es sólo una muestra ... y lo del formato ... He intentado darle formato por lo que no requeriría desplazamiento horizontal ....)

Realmente no me gusta de esa manera lo he hecho. Funciona y hace el trabajo por ahora ... pero no creo que pueda mantenerse ... especialmente si el informe se vuelve más complejo en términos del html que debe crearse. Peor aún, otros desarrolladores de mi equipo seguramente copiarán y pegarán mi código para sus aplicaciones que generan un informe html y es probable que creen un lío horrible. (¡Ya he visto tales horrores producidos! Imagine una función de informe que tiene cientos de líneas de sql codificadas para recuperar los detalles del informe ... ¡es suficiente para hacer llorar a un hombre adulto!)

Sin embargo, mientras No me gusta esto en absoluto ... Simplemente no puedo pensar en una forma diferente de hacerlo.

Seguramente debe haber una manera de hacer esto ... estoy seguro de ello. No hace mucho estaba haciendo lo mismo al generar tablas en páginas aspx hasta que alguien me mostró gentilmente que puedo vincular los objetos a un control y dejar que .NET se encargue de la representación. Convirtió el código horrible, similar al código anterior, en dos o tres elegantes líneas de bondad.

¿Alguien sabe de una manera similar de crear el html para este informe sin codificar el html?

Respuesta

10

Haga que su aplicación produzca archivos XML con datos sin formato. Luego, aplique un XSLT externo que contendría HTML.

Más información: http://msdn.microsoft.com/en-us/library/14689742.aspx

+0

Voy a intentarlo y ver cómo voy. Nunca he trabajado con XSLT antes, así que me tomará un poco de tiempo acelerarlo ... Además, esperaré a seleccionar una respuesta hasta que la haya visto en acción ... – mezoid

2

Bueno, podría utilizar uno de los marcos de informes (Crystal, MS RDL, etc.) y exportar como html - sin embargo, sospecho que para datos simples su enfoque actual es menos sobrecarga. Puede ser que utilice un LINQ XML-a-XmlWriter o (en lugar de string.Format, que no se encargará de escape) ...

 new XElement("tr", 
      new XElement("td", item.StartDate), 
      new XElement("td", item.Id), 
      new XElement("td", item.WorkItemId), 

etc. Escapar es especialmente importante para los valores de texto (nombre, descripción, etc.).

4

Se puede usar un motor de plantillas como NVelocity separar su vista de informe y su código. Probablemente haya otros motores de plantillas decentes por ahí ...

+0

NVelocity es una bueno uno ... en consonancia con otros motores de plantillas también – jle

+0

Además, considere StringTemplate, que es lo que utiliza el generador de analizadores/compiladores ANTLR. Lo he usado para problemas similares y me encantó. http://stringtemplate.org/ –

1

Puede considerar el uso de un motor de plantilla simple como http://www.stefansarstedt.com/templatemaschine.html y separar su plantilla del contenido.

Esto es bastante práctico, permite la modificación de la plantilla sin recompilar y todavía tiene la potencia de C# en sus plantillas.

0

Microsoft SQL Reporting Services hace esto bastante bien, y puede hacerlo en múltiples formatos.

Mi empresa lo usa para crear informes PDF y como tenemos requisitos HIPAA, automáticamente le ingresamos una contraseña a través de un control PDF de terceros ...

3

meziod - Otra avenida para examinar es los métodos de extensión para el objeto HtmlTextWriter. Encontré una puñalada brillante en este sitio.

HtmlTextWriter extension

Estoy seguro de que usted podría aprovechar un gran potencial de eso ...

respecto coola -

+0

+1 por mencionar HtmlTextWriter y agregar el enlace a la extensión method-post. Sé que esta es una vieja pregunta, pero me gustaría añadir que los métodos de extensión son extremadamente útiles. – Sprezlaus

0

Como ya se ha mencionado coolashaka, utilizando el HtmlTextWriter es una buena opción, sobre todo si agregar algunos métodos de extensión útiles, por ejemplo:

ejemplo simple:

public static void WriteNav(this 
    HtmlTextWriter writer, List<String> navItems) 
    { 
     writer.RenderBeginTag("nav"); 
     writer.RenderBeginTag(HtmlTextWriterTag.Ul); 
     foreach (var item in navItems) 
     { 
      writer.RenderBeginTag(HtmlTextWriterTag.Ul); 
      writer.AddAttribute(HtmlTextWriterAttribute.Href, "~/" + item + ".html"); 
      writer.RenderBeginTag(HtmlTextWriterTag.A); 
      writer.Write(item); 
      writer.RenderEndTag(); 
      writer.RenderEndTag(); 
     } 
     writer.RenderEndTag(); 
     writer.RenderEndTag(); 

    } 

Sé que esta es una vieja pregunta, pero Google seguirá dirigiendo a la gente aquí en los próximos años.

Cuestiones relacionadas