Как создать 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),

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


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

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


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

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


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