Как мне создать отчет 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. Я нашел блестящий удар именно на этом сайте.
Я уверен, что вы могли бы использовать большой потенциал от этого...
привет - кула
Что ж, вы могли бы использовать одну из структур отчетов (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...