一种常见(粒度,统计值)报表的实现方案
2008-01-04 17:10
323 查看
语言:C#
开发环境:Vs2008
1。实现目标
很多时候,我经常要做如下这样的一张报表:
纵向为统计粒度,横向为指标值,本例中合计是没有意义的,只是为了演示
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
written by Guozhijian
2008/01/04
-->
<xsl:output method="html"/>
<xsl:template match="/">
<style type="text/css">
</style>
<table class="lborder3" cellpadding="3" cellspacing="1" align="center">
<xsl:call-template name="tplH"/>
<xsl:call-template name="tplV"/>
<xsl:call-template name="tplLastLine"/>
</table>
</xsl:template>
<!--横向表头模版-->
<xsl:template name="tplH">
<tr>
<td class="mbodyMain"></td>
<xsl:for-each select="NewDataSet/HTable">
<td class="mbodyMain">
<xsl:value-of select="HName"/>
</td>
</xsl:for-each>
<td class="mbodyMain">合计</td>
</tr>
</xsl:template>
<!--纵向表头模版-->
<xsl:template name="tplV">
<xsl:for-each select="NewDataSet/VTable">
<tr>
<td class="mbodyMain"><xsl:value-of select="VName"/></td>
<xsl:variable name="vname" select="VName"/>
<xsl:for-each select="/NewDataSet/HTable">
<td class="mbodyMain">
<xsl:call-template name="tplCellValue">
<xsl:with-param name="vName" select="$vname"/>
<xsl:with-param name="hName" select="HName"/>
</xsl:call-template>
</td>
</xsl:for-each>
<td class="mbodyMain">
<xsl:call-template name="tplHSum">
<xsl:with-param name="vName" select="$vname"/>
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<!--数据单元格模版-->
<xsl:template name="tplCellValue">
<xsl:param name="vName"/>
<xsl:param name="hName"/>
<xsl:choose>
<xsl:when test="count(/NewDataSet/CellTable[VName=$vName and HName=$hName]) > 0">
<xsl:value-of select="/NewDataSet/CellTable[VName=$vName and HName=$hName]/CellValue"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--横向统计值模版-->
<xsl:template name="tplHSum">
<xsl:param name="vName"/>
<xsl:value-of select="sum(/NewDataSet/CellTable[VName=$vName]/CellValue)"/>
</xsl:template>
<!--纵向统计值模版-->
<xsl:template name="tplVSum">
<xsl:param name="hName"/>
<xsl:value-of select="sum(/NewDataSet/CellTable[HName=$hName]/CellValue)"/>
</xsl:template>
<!--尾行统计值模版-->
<xsl:template name="tplLastLine">
<tr>
<td class="mbodyMain">合计</td>
<xsl:for-each select="NewDataSet/HTable">
<td class="mbodyMain">
<xsl:call-template name="tplVSum">
<xsl:with-param name="hName" select="HName"/>
</xsl:call-template>
</td>
</xsl:for-each>
<td class="mbodyMain">
<xsl:value-of select="sum(NewDataSet/CellTable/CellValue)"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
在XSLT中计算了合计值
通过Asp:Xml控件(x1)展现:
private void ShowData() {
DataSet ds = this.GetDataSet();
string xml = ds.GetXml();
x1.DocumentContent = xml;
x1.TransformSource = "HVReport.xslt";
}
搞定!
这样,当需要做这样的报表的时候,只需要写3条非常简单的sql语句就完成了。
^_^
开发环境:Vs2008
1。实现目标
很多时候,我经常要做如下这样的一张报表:
纵向为统计粒度,横向为指标值,本例中合计是没有意义的,只是为了演示
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
written by Guozhijian
2008/01/04
-->
<xsl:output method="html"/>
<xsl:template match="/">
<style type="text/css">
</style>
<table class="lborder3" cellpadding="3" cellspacing="1" align="center">
<xsl:call-template name="tplH"/>
<xsl:call-template name="tplV"/>
<xsl:call-template name="tplLastLine"/>
</table>
</xsl:template>
<!--横向表头模版-->
<xsl:template name="tplH">
<tr>
<td class="mbodyMain"></td>
<xsl:for-each select="NewDataSet/HTable">
<td class="mbodyMain">
<xsl:value-of select="HName"/>
</td>
</xsl:for-each>
<td class="mbodyMain">合计</td>
</tr>
</xsl:template>
<!--纵向表头模版-->
<xsl:template name="tplV">
<xsl:for-each select="NewDataSet/VTable">
<tr>
<td class="mbodyMain"><xsl:value-of select="VName"/></td>
<xsl:variable name="vname" select="VName"/>
<xsl:for-each select="/NewDataSet/HTable">
<td class="mbodyMain">
<xsl:call-template name="tplCellValue">
<xsl:with-param name="vName" select="$vname"/>
<xsl:with-param name="hName" select="HName"/>
</xsl:call-template>
</td>
</xsl:for-each>
<td class="mbodyMain">
<xsl:call-template name="tplHSum">
<xsl:with-param name="vName" select="$vname"/>
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<!--数据单元格模版-->
<xsl:template name="tplCellValue">
<xsl:param name="vName"/>
<xsl:param name="hName"/>
<xsl:choose>
<xsl:when test="count(/NewDataSet/CellTable[VName=$vName and HName=$hName]) > 0">
<xsl:value-of select="/NewDataSet/CellTable[VName=$vName and HName=$hName]/CellValue"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--横向统计值模版-->
<xsl:template name="tplHSum">
<xsl:param name="vName"/>
<xsl:value-of select="sum(/NewDataSet/CellTable[VName=$vName]/CellValue)"/>
</xsl:template>
<!--纵向统计值模版-->
<xsl:template name="tplVSum">
<xsl:param name="hName"/>
<xsl:value-of select="sum(/NewDataSet/CellTable[HName=$hName]/CellValue)"/>
</xsl:template>
<!--尾行统计值模版-->
<xsl:template name="tplLastLine">
<tr>
<td class="mbodyMain">合计</td>
<xsl:for-each select="NewDataSet/HTable">
<td class="mbodyMain">
<xsl:call-template name="tplVSum">
<xsl:with-param name="hName" select="HName"/>
</xsl:call-template>
</td>
</xsl:for-each>
<td class="mbodyMain">
<xsl:value-of select="sum(NewDataSet/CellTable/CellValue)"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
在XSLT中计算了合计值
通过Asp:Xml控件(x1)展现:
private void ShowData() {
DataSet ds = this.GetDataSet();
string xml = ds.GetXml();
x1.DocumentContent = xml;
x1.TransformSource = "HVReport.xslt";
}
搞定!
这样,当需要做这样的报表的时候,只需要写3条非常简单的sql语句就完成了。
^_^
相关文章推荐
- Oracle常见SQL分页实现方案
- 一种夜间模式简单实现方案
- 一种将0元素前置的实现方案
- 一种实现无缝循环播放音乐方案
- 一种基于delphi巧妙权限控制方案及其实现方法
- PHP中插件机制的一种实现方案
- 一种简单粗暴的数据层网络缓存(二)实现方案
- 一种基于主板BIOS的身份认证方案及实现
- ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案
- 使用Acegi实现多种用户登录的一种方案
- Android网络电台的一种实现方案(歌醉原创)
- dwz框架实现关闭navTab刷新指定navTab的一种方案
- 一种简单的小型企业报表实现方式
- Unity3D在2D游戏中利用UGUI实现分辨率自适应的一种可行实践方案
- VB6.0里实现"ShellWait"的一种简单方案(VB6.0代码)
- 报表性能优化方案之多数据集实现层式报表
- 常见数据库的分页实现方案
- 常见数据库的分页实现方案
- 基于spark排序的一种更廉价的实现方案-附基于spark的性能测试
- 基于spark排序的一种更廉价的实现方案-附基于spark的性能测试