利用XML实现通用WEB报表输入和输出
2006-04-11 14:41
369 查看
利用XML实现通用WEB报表输入和输出
开发B/S结构的应用程序最头疼的问题可能就是报表打印了,而很多B/S结构的应用程序常常需要完成非常复杂的报表打印任务。更加郁闷的是,很多报表在使用的的时候还要求将数据输入到数据库中。
方案原理
其实原理很简单,通过XML强大的自定义功能,进行格式解析,我们便能方便的自定义出我们所有需要的格式控制标签,在服务器端进行动态编码后通过WEB服务器传到客户端,然后在客户端打印出我们需要的报表。
感谢卢彦的利用XML实现通用WEB报表打印(http://www.yesky.com/20030214/1652186.shtml),所以遵循他的精神,不敢独享
工作流程
服务器的工作流程为:
1. 根据报表类型读取xml模板。
2. 根据报表id读取数据库(如果采用orm的话,也可以是持久对象)的数据。
3. 对xml模板进行数据解析。
4. 构造html标签,并赋值 。
5.用户在客户端进行数据输入或者选择打印
6用户提交后,根据xml模板,对返回值进行解析,将数据保存。
安全性
由于采用的是普通WEB服务器传送数据,因此可以直接采用SSL安全套接字等已经成熟的WEB加密技术,保证了传输的安全性。
由于采用的是80端口,不需要再另外新增加专用端口,减少了安全漏洞的可能性,同时还能方便的穿过双方的的网络防火墙等保护设备。
格式定义
为了能自己控制打印的格式,我们定义了下列的格式标签
标签应用示例:
<?xmlversion="1.0"encoding="utf-8"?>
<doc>
<pagesetting>
<paperwidth>800</paperwidth>
<paperheight>600</paperheight>
<pageleft>0</pageleft>
<pageright>0</pageright>
<pagetop>0</pagetop>
<pagebottom>0</pagebottom>
</pagesetting>
<data>
<DataClass>XReport.ReportDocument, XReport</DataClass>
<get>GetData</get>
<set>SetData</set>
</data>
<report>
<reporthead>
<rowheight="20"></row>
<rowheight="40">
<textalign="center"fontsize="12pt">通用报表</text>
</row>
<rowheight="20">
<textalign="center"fontsize="10pt">([$Eval(get(year),set(year)),Format(align(center),size(50))$]年[$Eval(get(month),set(month))$]月)</text>
</row>
<rowheight="16">
<textalign="set"x="0"y="0"fontsize="9pt">填报单位: [$Eval(get(dw),set(dw)),Format(align(center),size(50))$]</text>
<textalign="set"x="325"y="0"fontsize="9pt">文 号: 报字[1999]7号</text>
</row>
<rowheight="18"></row>
</reporthead>
<reporttablepagesize="20">
<columnscolumnsize="11">
<columnkey="c1"align="center">[$Eval(get(DataItem.#c1)),Format(align(center),size(100%))$]</column>
<columnkey="c2"align="right">[$Eval(get(DataItem.#c2),set(DataItem.#c2)),Format(align(right),size(100%))$]</column>
<columnkey="c3"align="right">[$Eval(get(DataItem.#c3),set(DataItem.#c3)),Format(align(right),size(100%))$]</column>
<columnkey="c4"align="right">[$Eval(get(DataItem.#c4),set(DataItem.#c4)),Format(align(right),size(100%))$]</column>
<columnkey="c5"align="right">[$Eval(get(DataItem.#c5),set(DataItem.#c5)),Format(align(right),size(100%))$]</column>
<columnkey="c6"align="right">[$Eval(get(DataItem.#c6),set(DataItem.#c6)),Format(align(right),size(100%))$]</column>
<columnkey="c7"align="right">[$Eval(get(DataItem.#c7),set(DataItem.#c7)),Format(align(right),size(100%))$]</column>
<columnkey="c8"align="right">[$Eval(get(DataItem.#c8),set(DataItem.#c8)),Format(align(right),size(100%))$]</column>
<columnkey="c9"align="right">[$Eval(get(DataItem.#c9),set(DataItem.#c9)),Format(align(right),size(100%))$]</column>
<columnkey="c10"align="right">[$Eval(get(DataItem.#c10),set(DataItem.#c10)),Format(align(right),size(100%))$]</column>
<columnkey="c11"align="right">[$Eval(get(DataItem.#c11),set(DataItem.#c11)),Format(align(right),size(100%))$]</column>
</columns>
<rows>
<rowkey="r1"fontsize="9pt"align="center">
<cellrowspan="2"colspan="1">项目</cell>
<cellrowspan="1"colspan="2">项目</cell>
<cellrowspan="2"colspan="1">项目</cell>
<cellrowspan="2"colspan="1">项目\n(个)</cell>
<cellrowspan="2"colspan="1">项目</cell>
<cellrowspan="1"colspan="4">项目</cell>
<cellrowspan="2"colspan="1">项目\n(元)</cell>
</row>
<rowkey="r2"fontsize="9pt"align="center">
<cellrowspan="1"colspan="1">县\n(市)(个)</cell>
<cellrowspan="1"colspan="1">乡\n(镇)(个)</cell>
<cellrowspan="1"colspan="1">总计\n(人)</cell>
<cellrowspan="1"colspan="1">项目\n(人)</cell>
<cellrowspan="1"colspan="1">项目\n(人)</cell>
<cellrowspan="1"colspan="1">项目\n(人)</cell>
</row>
<rowkey="r3"fontsize="9pt"align="center">
<cellrowspan="1"colspan="1">1</cell>
<cellrowspan="1"colspan="1">2</cell>
<cellrowspan="1"colspan="1">3</cell>
<cellrowspan="1"colspan="1">4</cell>
<cellrowspan="1"colspan="1">5</cell>
<cellrowspan="1"colspan="1">6</cell>
<cellrowspan="1"colspan="1">7</cell>
<cellrowspan="1"colspan="1">8</cell>
<cellrowspan="1"colspan="1">9</cell>
<cellrowspan="1"colspan="1">10</cell>
<cellrowspan="1"colspan="1">11</cell>
</row>
</rows>
</reporttable>
<reportfoot>
<rowheight="20">
<textalign="set"x="0"y="0"fontsize="9pt">单位负责人:[$Eval(get(fzr),set(fzr)),Format(align(center),size(50))$]</text>
<textalign="set"x="80"y="0"fontsize="9pt">统计负责人:[$Eval(get(tjr),set(tjr)),Format(align(center),size(50))$]</text>
<textalign="set"x="140"y="0"fontsize="9pt">填报人:[$Eval(get(tbr),set(tbr)),Format(align(center),size(50))$]</text>
<textalign="set"x="200"y="0"fontsize="9pt">报出日期:[$Eval(get(tbyear),set(tbyear)),Format(align(center),size(50))$]年</text>
</row>
</reportfoot>
<calcus>
<calcu>[% #r20c2$ = parseValue(#r4c2$,1) * parseValue(#r5c2$,1) + parseValue(#r6c2$,0) + parseValue(#r7c2$,0) %]</calcu>
<calcu>[% #r20c3$ = parseValue(#r4c3$,0) + parseValue(#r5c3$,0) + parseValue(#r6c3$,0) + parseValue(#r7c3$,0) %]</calcu>
<calcu>[% #r20c4$ = parseValue(#r4c4$,0) + parseValue(#r5c4$,0) + parseValue(#r6c4$,0) + parseValue(#r7c4$,0) %]</calcu>
</calcus>
</report>
</doc>
注意事项:
a) 字符编码应该为UTF-8,否则会出现编码错误问题。
b) 应该严格按照XML规定的格式来生成文件,否则XML解析器将不会予以解析。
2. 客户端
效果示例图
打印预览
.Net Web控件方案的实现和扩充
软件原理:
该软件的原理其实很简单,就是要方便的解析出定义好的XML格式标记,解读出文件中标记的参数定义,构造出html标签。
针对大多数报表的功能需要,我只定义了两种格式标签:文本(text)和表格(table),它们的具体属性定义和另外一些设置性的标签定义请参考前文,这里再补充一幅结构图帮助读者理解。如下所示:
此主题相关图片如下:
结构设计:
为了描述所有的样式标记,我先定义了一个抽象基类ReportElement,它拥有一个虚拟方法Draw,然后对应表格和文本,从ReportElement派生出三个子类,分别是ReportTable和ReportText,ReportRow,我还创建了一个ReportParser类用来解析不同的样式标记.
代码实现:
然后为项目添加一个PrintElement的新类,代码如下:
namespace XReport
using System.Xml;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Collections;
namespace XReport
using System;
using System.Xml;
using System.Collections;
using System.Text.RegularExpressions;
namespace XReport
using System;
using System.Xml;
using System.Reflection;
using System.Collections;
namespace XReport
using System;
using System.Xml;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Collections;
using System.Web.UI.HtmlControls;
namespace XReport
ReportDocument r = new ReportDocument(Server.MapPath("pp.xml"));
System.Web.UI.Control c = r.WriteReport();
Label1.Controls.Add(c);
将数据保存到数据库则调用
ReportDocument r = new ReportDocument(Server.MapPath("pp.xml"));
r.SaveReport();
开发B/S结构的应用程序最头疼的问题可能就是报表打印了,而很多B/S结构的应用程序常常需要完成非常复杂的报表打印任务。更加郁闷的是,很多报表在使用的的时候还要求将数据输入到数据库中。
方案原理
其实原理很简单,通过XML强大的自定义功能,进行格式解析,我们便能方便的自定义出我们所有需要的格式控制标签,在服务器端进行动态编码后通过WEB服务器传到客户端,然后在客户端打印出我们需要的报表。
感谢卢彦的利用XML实现通用WEB报表打印(http://www.yesky.com/20030214/1652186.shtml),所以遵循他的精神,不敢独享
工作流程
服务器的工作流程为:
1. 根据报表类型读取xml模板。
2. 根据报表id读取数据库(如果采用orm的话,也可以是持久对象)的数据。
3. 对xml模板进行数据解析。
4. 构造html标签,并赋值 。
5.用户在客户端进行数据输入或者选择打印
6用户提交后,根据xml模板,对返回值进行解析,将数据保存。
安全性
由于采用的是普通WEB服务器传送数据,因此可以直接采用SSL安全套接字等已经成熟的WEB加密技术,保证了传输的安全性。
由于采用的是80端口,不需要再另外新增加专用端口,减少了安全漏洞的可能性,同时还能方便的穿过双方的的网络防火墙等保护设备。
格式定义
为了能自己控制打印的格式,我们定义了下列的格式标签
标签应用示例:
<?xmlversion="1.0"encoding="utf-8"?>
<doc>
<pagesetting>
<paperwidth>800</paperwidth>
<paperheight>600</paperheight>
<pageleft>0</pageleft>
<pageright>0</pageright>
<pagetop>0</pagetop>
<pagebottom>0</pagebottom>
</pagesetting>
<data>
<DataClass>XReport.ReportDocument, XReport</DataClass>
<get>GetData</get>
<set>SetData</set>
</data>
<report>
<reporthead>
<rowheight="20"></row>
<rowheight="40">
<textalign="center"fontsize="12pt">通用报表</text>
</row>
<rowheight="20">
<textalign="center"fontsize="10pt">([$Eval(get(year),set(year)),Format(align(center),size(50))$]年[$Eval(get(month),set(month))$]月)</text>
</row>
<rowheight="16">
<textalign="set"x="0"y="0"fontsize="9pt">填报单位: [$Eval(get(dw),set(dw)),Format(align(center),size(50))$]</text>
<textalign="set"x="325"y="0"fontsize="9pt">文 号: 报字[1999]7号</text>
</row>
<rowheight="18"></row>
</reporthead>
<reporttablepagesize="20">
<columnscolumnsize="11">
<columnkey="c1"align="center">[$Eval(get(DataItem.#c1)),Format(align(center),size(100%))$]</column>
<columnkey="c2"align="right">[$Eval(get(DataItem.#c2),set(DataItem.#c2)),Format(align(right),size(100%))$]</column>
<columnkey="c3"align="right">[$Eval(get(DataItem.#c3),set(DataItem.#c3)),Format(align(right),size(100%))$]</column>
<columnkey="c4"align="right">[$Eval(get(DataItem.#c4),set(DataItem.#c4)),Format(align(right),size(100%))$]</column>
<columnkey="c5"align="right">[$Eval(get(DataItem.#c5),set(DataItem.#c5)),Format(align(right),size(100%))$]</column>
<columnkey="c6"align="right">[$Eval(get(DataItem.#c6),set(DataItem.#c6)),Format(align(right),size(100%))$]</column>
<columnkey="c7"align="right">[$Eval(get(DataItem.#c7),set(DataItem.#c7)),Format(align(right),size(100%))$]</column>
<columnkey="c8"align="right">[$Eval(get(DataItem.#c8),set(DataItem.#c8)),Format(align(right),size(100%))$]</column>
<columnkey="c9"align="right">[$Eval(get(DataItem.#c9),set(DataItem.#c9)),Format(align(right),size(100%))$]</column>
<columnkey="c10"align="right">[$Eval(get(DataItem.#c10),set(DataItem.#c10)),Format(align(right),size(100%))$]</column>
<columnkey="c11"align="right">[$Eval(get(DataItem.#c11),set(DataItem.#c11)),Format(align(right),size(100%))$]</column>
</columns>
<rows>
<rowkey="r1"fontsize="9pt"align="center">
<cellrowspan="2"colspan="1">项目</cell>
<cellrowspan="1"colspan="2">项目</cell>
<cellrowspan="2"colspan="1">项目</cell>
<cellrowspan="2"colspan="1">项目\n(个)</cell>
<cellrowspan="2"colspan="1">项目</cell>
<cellrowspan="1"colspan="4">项目</cell>
<cellrowspan="2"colspan="1">项目\n(元)</cell>
</row>
<rowkey="r2"fontsize="9pt"align="center">
<cellrowspan="1"colspan="1">县\n(市)(个)</cell>
<cellrowspan="1"colspan="1">乡\n(镇)(个)</cell>
<cellrowspan="1"colspan="1">总计\n(人)</cell>
<cellrowspan="1"colspan="1">项目\n(人)</cell>
<cellrowspan="1"colspan="1">项目\n(人)</cell>
<cellrowspan="1"colspan="1">项目\n(人)</cell>
</row>
<rowkey="r3"fontsize="9pt"align="center">
<cellrowspan="1"colspan="1">1</cell>
<cellrowspan="1"colspan="1">2</cell>
<cellrowspan="1"colspan="1">3</cell>
<cellrowspan="1"colspan="1">4</cell>
<cellrowspan="1"colspan="1">5</cell>
<cellrowspan="1"colspan="1">6</cell>
<cellrowspan="1"colspan="1">7</cell>
<cellrowspan="1"colspan="1">8</cell>
<cellrowspan="1"colspan="1">9</cell>
<cellrowspan="1"colspan="1">10</cell>
<cellrowspan="1"colspan="1">11</cell>
</row>
</rows>
</reporttable>
<reportfoot>
<rowheight="20">
<textalign="set"x="0"y="0"fontsize="9pt">单位负责人:[$Eval(get(fzr),set(fzr)),Format(align(center),size(50))$]</text>
<textalign="set"x="80"y="0"fontsize="9pt">统计负责人:[$Eval(get(tjr),set(tjr)),Format(align(center),size(50))$]</text>
<textalign="set"x="140"y="0"fontsize="9pt">填报人:[$Eval(get(tbr),set(tbr)),Format(align(center),size(50))$]</text>
<textalign="set"x="200"y="0"fontsize="9pt">报出日期:[$Eval(get(tbyear),set(tbyear)),Format(align(center),size(50))$]年</text>
</row>
</reportfoot>
<calcus>
<calcu>[% #r20c2$ = parseValue(#r4c2$,1) * parseValue(#r5c2$,1) + parseValue(#r6c2$,0) + parseValue(#r7c2$,0) %]</calcu>
<calcu>[% #r20c3$ = parseValue(#r4c3$,0) + parseValue(#r5c3$,0) + parseValue(#r6c3$,0) + parseValue(#r7c3$,0) %]</calcu>
<calcu>[% #r20c4$ = parseValue(#r4c4$,0) + parseValue(#r5c4$,0) + parseValue(#r6c4$,0) + parseValue(#r7c4$,0) %]</calcu>
</calcus>
</report>
</doc>
注意事项:
a) 字符编码应该为UTF-8,否则会出现编码错误问题。
b) 应该严格按照XML规定的格式来生成文件,否则XML解析器将不会予以解析。
2. 客户端
效果示例图
打印预览
.Net Web控件方案的实现和扩充
软件原理:
该软件的原理其实很简单,就是要方便的解析出定义好的XML格式标记,解读出文件中标记的参数定义,构造出html标签。
针对大多数报表的功能需要,我只定义了两种格式标签:文本(text)和表格(table),它们的具体属性定义和另外一些设置性的标签定义请参考前文,这里再补充一幅结构图帮助读者理解。如下所示:
此主题相关图片如下:
<doc>根节点 |
<pagesetting> 页面设置 |
<data> 报表数据 |
<report> 报表格式 |
<row> 行 |
<text> 文本 |
<reportfoot> 页脚 |
<reporthead> 表头 |
< calcus> 报表计算 计算 |
<columns> 列 |
<rows> 行 |
<reporttable> 表格 |
为了描述所有的样式标记,我先定义了一个抽象基类ReportElement,它拥有一个虚拟方法Draw,然后对应表格和文本,从ReportElement派生出三个子类,分别是ReportTable和ReportText,ReportRow,我还创建了一个ReportParser类用来解析不同的样式标记.
代码实现:
然后为项目添加一个PrintElement的新类,代码如下:
namespace XReport
using System.Xml;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Collections;
namespace XReport
using System;
using System.Xml;
using System.Collections;
using System.Text.RegularExpressions;
namespace XReport
using System;
using System.Xml;
using System.Reflection;
using System.Collections;
namespace XReport
using System;
using System.Xml;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Collections;
using System.Web.UI.HtmlControls;
namespace XReport
ReportDocument r = new ReportDocument(Server.MapPath("pp.xml"));
System.Web.UI.Control c = r.WriteReport();
Label1.Controls.Add(c);
将数据保存到数据库则调用
ReportDocument r = new ReportDocument(Server.MapPath("pp.xml"));
r.SaveReport();
相关文章推荐
- 利用XML实现通用WEB报表输入和输出
- 利用XML实现通用WEB报表输入和输出
- 利用XML实现通用WEB报表打印(4)
- 续:利用XML实现通用WEB报表打印(实现篇)
- 利用XML实现通用WEB报表打印(实现篇)
- 利用XML实现通用WEB报表打印(3)
- 转:利用XML实现通用WEB报表打印 卢彦
- 利用XML实现通用WEB报表打印
- 利用XML实现通用WEB报表打印(参考)
- 利用XML实现通用WEB报表打印(2)
- 利用XML实现通用WEB报表打印(转载)
- 卢彦的利用xml实现通用web报表打印
- 续:利用XML实现通用WEB报表打印(实现篇)
- 利用XML实现通用WEB报表打印(1) 卢彦
- 利用XML实现通用WEB报表打印
- 利用XML实现通用WEB报表打印(1)
- 续:利用XML实现通用WEB报表打印(实现篇)
- 利用XML实现通用WEB报表打印
- 利用XML实现通用WEB报表打印(zt微软技术社区)
- 利用XML实现通用WEB报表打印(实现篇) 卢彦