7

我目前正在重构一个控制台应用程序,其主要职责是根据存储在数据库中的值生成报告。

到目前为止,我创建报告的方式如下:

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 的类似方法?

4

7 回答 7

10

使您的应用程序生成包含原始数据的 XML 文件。然后对其应用一个包含 HTML 的外部 XSLT。

更多信息:http: //msdn.microsoft.com/en-us/library/14689742.aspx

于 2009-03-29T23:59:11.893 回答
4

您可以使用NVelocity 之类的模板引擎来分离您的报告视图和代码。那里可能还有其他不错的模板引擎...

于 2009-03-30T00:13:24.263 回答
3

meziod - 另一个细读的途径是 HtmlTextWriter 对象的扩展方法。我在这个网站上发现了一个绝妙的技巧。

HtmlTextWriter 扩展

我敢肯定,您可以从中发挥巨大的潜力...

问候 - 酷拉

于 2009-03-30T12:40:39.443 回答
2

好吧,您可以使用其中一种报告框架(Crystal、MS RDL 等)并导出为 html - 但是,我怀疑对于简单数据,您当前的方法开销较小。我可能会使用XmlWriteror LINQ-to-XML (而不是string.Format,它不会处理转义)...

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

等。转义对于文本值(名称、描述等)尤其重要。

于 2009-03-29T23:54:42.577 回答
1

您可以考虑使用简单的模板引擎,例如http://www.stefansarstedt.com/templatemaschine.html并将您的模板与内容分开。

这非常实用,允许在不重新编译的情况下修改模板,并且您的模板仍然具有 C# 功能。

于 2009-03-30T00:13:24.763 回答
0

Microsoft SQL Reporting Services 在这方面做得很好,并且可以处理多种格式。

我的公司使用它来创建 PDF 报告,由于我们有 HIPAA 要求,我们通过第三方 PDF 控件自动为其输入密码......

于 2009-03-30T01:36:44.547 回答
0

正如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();

    }

我知道这是一个老问题,但谷歌将在未来几年继续指导人们。

于 2017-04-28T09:57:49.913 回答