Как создать отчет 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# в ваших шаблонах.
Microsoft SQL Reporting Services делает это довольно хорошо и может использовать несколько форматов.
Моя компания использует его для создания отчетов PDF, и поскольку у нас есть требования HIPAA, мы автоматически вводим пароль к нему через сторонний PDF-контроль...
Как кулашака уже упоминал, использование HtmlTextWriter является хорошим вариантом, конечно, если вы добавляете некоторые полезные методы расширения, например:
Простой пример:
Я знаю, что это старый вопрос,но Google будет продолжать направлять людей сюда в течение многих лет.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(); }
Comments