Как мне создать отчет HTML без жесткого кодирования HTML? - PullRequest
7 голосов
/ 30 марта 2009

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

Способ создания отчета до следующего момента:

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 ]

10 голосов
/ 30 марта 2009

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

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

4 голосов
/ 30 марта 2009

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

3 голосов
/ 30 марта 2009

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

Расширение HtmlTextWriter

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

привет - кула

2 голосов
/ 30 марта 2009

Что ж, вы можете использовать одну из структур отчетов (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),

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

1 голос
/ 30 марта 2009

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

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

0 голосов
/ 28 апреля 2017

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

0 голосов
/ 30 марта 2009

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

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

...