以C#编程方式生成HTML,定位打印报告

时间:2010-06-05 07:16:41

标签: c# html reporting

我接管了一个能够打印信息的C#(2.0)代码库。执行此操作的代码非常繁琐。元素被绘制到每个页面上,魔术常量代表定位。我想程序员坐着一把尺子,通过测量和输入位置来设计每一页。是的,人们当然可以提出一些很好的抽象来使这种方法合理化。但我正在寻找一种不同的方法。

我的想法是,我将使用生成静态HTML页面的代码替换当前打印的代码,将它们保存到文件中,然后在该文件上启动Web浏览器。最明显的好处是我不需要处理格式化 - 我可以让网页浏览器为我做标记和CSS。

所以我正在寻找的是一组非常轻量级的类,我可以使用它来帮助生成HTML。我不需要像HTMLTextWriter那样重量级的东西。我正在寻找的是避免像这样的碎片:

String.Format("<tr><td>{0}</td><td>{1}</td></tr>", foo, bar);

而是采取这种感觉:

...
table().
    tr().
        td(foo).
        td(bar)

或类似的东西。我见过其他语言的轻量级类,但找不到C#的等价(或更好)。我当然可以自己写,但我坚信不要重新发明轮子。

知道这样的事吗?知道什么更好比这个?

2 个答案:

答案 0 :(得分:1)

就像一个想法:为什么要在应用程序代码中组装HTML?对我来说听起来有点乏味。您可以聚合报告所需的数据,并将其传递给C#现有的模板引擎(通常用于Web应用程序)。然后将模板引擎的结果保存到html文件中。

我用这种方法看到的主要好处是:

  • 将视图与业务逻辑分开
  • html模板可以由非C#开发人员编辑,html / css知识就足够了
  • 如果html更改
  • ,则无需重新编译应用程序

我还没有使用它,但我听说Spark View引擎没问题:http://sparkviewengine.com/(不确定它是否适用于C#2.0)

前段时间我用Gagawa(http://code.google.com/p/gagawa/)试验(用PHP),你可以在那里做以下事情:

$div = new Div();
$div->setId("mydiv")->setCSSClass("myclass");

$link = new A();
$link->setHref("http://www.example.com")->setTarget("_blank");

$div->appendChild( $link );

但很快就采用了这种方法来支持模板引擎。

答案 1 :(得分:0)

另一种方法是将数据转换为XML并应用XSL样式表。要更改HTML格式,您只需要替换样式表。