2009-03-29 5 views
7

В настоящее время я реорганизую консольное приложение, основной задачей которого является создание отчета на основе значений, хранящихся в базе данных.Как создать html-отчет без hardcoding html?

Пути я создание отчета до сезама теперь следующим образом:

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()); 

(выше только образец ... и сожалеют о форматировании ... Я пытался отформатировать поэтому он не требует горизонтальной прокрутки ....)

Мне действительно не нравится, что я это сделал. Он работает и выполняет эту работу на данный момент ... но я просто не думаю, что он обслуживается ... особенно если отчет становится более сложным с точки зрения html, который необходимо создать. Хуже того, другие разработчики в моей команде обязательно скопируют и вставляют мой код для своих приложений, которые генерируют html-отчет и, вероятно, создадут ужасный беспорядок. (Я уже видел такие ужасы, которые возникли! Представьте функцию отчета, которая содержит сотни строк жестко запрограммированного sql, чтобы получить детали отчета ... его достаточно, чтобы заставить взрослого человека плакать!)

Однако, хотя Мне это совсем не нравится ... Я просто не могу придумать другого способа сделать это.

Несомненно, должен быть способ сделать это ... Я уверен в этом. Не так давно я делал то же самое при создании таблиц на страницах aspx, пока кто-то не показал мне, что я могу просто привязать объекты к элементу управления и позволить .NET позаботиться об рендеринге. Он превратил ужасный код, похожий на приведенный выше код, в две или три элегантные линии добра.

Кто-нибудь знает о подобном способе создания html для этого отчета без жесткого кодирования html?

ответ

10

Сделайте свое приложение для создания XML-файла с необработанными данными. Затем примените к нему внешний XSLT, который будет содержать HTML.

Подробнее: http://msdn.microsoft.com/en-us/library/14689742.aspx

+0

Я попробую и посмотрю, как я пойду. Никогда не работал с XSLT раньше, так что мне потребуется немного времени, чтобы ускориться с ним ... Кроме того, я не буду выбирать ответ, пока не увижу его в действии ... – mezoid

2

Ну, вы можете использовать одну из рамок отчета (Crystal, MS RDL и т. Д.) И export как html - однако я подозреваю, что для простых данных ваш текущий подход меньше накладных расходов. Я мог бы использовать-к-XML LINQ XmlWriter или (вместо string.Format, который не будет обрабатывать побег) ...

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

и т.д. Экранирование особенно важно для текстовых значений (название, описание и т.д.).

4

Вы можете использовать двигатель шаблона, как NVelocity отделить представление отчета и код. Есть, вероятно, другие подходящие шаблонные двигатели ...

+0

NVelocity - это хороший ... совместимый с другими машинами шаблонов тоже – jle

+0

Также рассмотрим StringTemplate, который использует генератор парсера/компилятора ANTLR. Я использовал его для подобных проблем, и это было здорово. http://stringtemplate.org/ –

1

Возможно, вы можете использовать простой механизм шаблонов, такой как http://www.stefansarstedt.com/templatemaschine.html и отделить свой шаблон от контента.

Это довольно практично, позволяет изменять шаблон без перекомпиляции, и у вас все еще есть сила C# в ваших шаблонах.

0

Службы Microsoft SQL Reporting Services делают это достаточно хорошо и могут выполнять несколько форматов.

Моя компания использует его для создания отчетов в формате PDF, и поскольку у нас есть требования к HIPAA, мы автоматически вводим пароль к нему через сторонний контроль PDF ...

3

meziod - Еще один способ изучить методы расширения объекта HtmlTextWriter. Я нашел блестящий удар только на этом сайте.

HtmlTextWriter extension

Я уверен, что вы могли бы использовать большой потенциал от этого ...

приветы - Coola

+0

+1 для упоминания HtmlTextWriter и добавления ссылки на метод-post. Я знаю, что это старый вопрос, но я хотел бы добавить, что методы расширения чрезвычайно полезны! – Sprezlaus

0

Как coolashaka уже упоминалось, используя HtmlTextWriter хороший вариант, конечно, если добавить некоторые полезные методы расширения, например:

Простой пример:

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(); 

    } 

Я знаю, что это старый вопрос, но Google будет продолжать руководить людьми здесь на долгие годы.