Как мне создать отчет HTML без жесткого кодирования 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?

7 ответов

Решение

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

Дополнительная информация: http://msdn.microsoft.com/en-us/library/14689742.aspx

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

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

Расширение HtmlTextWriter

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

привет - кула

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

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

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

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

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

Как уже упоминалось, 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 будет направлять людей сюда на долгие годы.

Microsoft SQL Reporting Services делает это довольно хорошо и может работать в нескольких форматах.

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

Другие вопросы по тегам