语言:C#
开发环境:Vs2008

1。实现目标
很多时候,我经常要做如下这样的一张报表:
纵向为统计粒度,横向为指标值,本例中合计是没有意义的,只是为了演示

2。具体实现
从数据库中取出三张表(DataTable):
表1,命名为:VTable,作用:保存纵向统计力度的名称列表
表2,命名为:HTable,作用:保存横向指标的名称列表
表3,命名为:CellTable,作用:保存指标值

然后将三张表合在一个DataSet里,通过DataSet的GetXml()方法取得一个XML字符串,
这样,有了这个Xml字符串,配上通用的Xslt,就可以使用Asp:Xml控件进行展现

以下开始演示:
我建了三张表:StudentInfo, SubjectInfo, ScoreInfo
结合上图,很容易知道三张表各自的用途

看下面取DataSet数据源的代码:

private DataSet GetDataSet() {
            string sql1 = "select StudentName VName from StudentInfo";
            string sql2 = "select SubjectName HName from SubjectInfo";
            string sql3 = @"select StudentName VName,SubjectName HName,Score CellValue
                            from ScoreInfo s, StudentInfo std,SubjectInfo subj
                            where s.StudentId=std.StudentId and s.SubjectId=subj.SubjectId";
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConnString"].ConnectionString)) {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(sql1, conn);
                da.Fill(ds, "VTable");
                da = new SqlDataAdapter(sql2, conn);
                da.Fill(ds, "HTable");
                da = new SqlDataAdapter(sql3, conn);
                da.Fill(ds, "CellTable");
                return ds;
            }
        }

有几个约定:表名(VTable,HTable,CellTable),列名(VName,HName,CellValue)

再看下面的XSLT:

<?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">
      .lborder3 {border:1px solid #000000;font-family:Tahoma;font-size:12px;}
      .mbodymain {text-align:center;background-color:#ffffff;}
    </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]) &gt; 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语句就完成了。
^_^

转载于:https://www.cnblogs.com/guozhijian/archive/2008/01/04/1026194.html

一种常见(粒度,统计值)报表的实现方案相关推荐

  1. 计算机辅助设计与图像学学报 改后发表,几种常见图像二值化方法的结果对比与分析...

    曾洁 摘 要:在图像处理中,图像二值化可以说是非常关键的一步.图像二值化能够帮助我们滤除掉原始图像中由于光照不均等因素造成的影响,此外,还能够是图像的数据量变小,有利于我们的后续操作.目前,图像二值化 ...

  2. Java 中日期的几种常见操作 —— 取值、转换、加减、比较

    Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提 ...

  3. 四种常见的 POST 提交数据方式对应的content-type取值

    做前后端分离一般都有第3中 , 第一种 基本上jquery那年代用的了 第2种在需要传文件时用的 https://www.cnblogs.com/wushifeng/p/6707248.html 四种 ...

  4. vlookup匹配值不唯一_数据对比、数据查询匹配Vlookup函数3种常见错误及解决方案...

    Excel中的Vlookup函数,在大家日常数据处理计算中应用的机会非常多,因为它可以帮助我们完成数据查询匹配.数据对比.但是这个函数在使用的过程中也经常会遇到查询错误的问题.根据实践经验总结,发现主 ...

  5. 【特征提取+分类模型】4种常见的NLP实践思路

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈琰钰,清华大学,Datawhale成员 越来越多的人选择参加算法 ...

  6. 分库分表的几种常见形式以及可能遇到的难题--转

    原文地址:http://chuansong.me/n/720045751960 在谈论数据库架构和数据库优化的时候,我们经常会听到"分库分表"."分片".&qu ...

  7. 分库分表的几种常见形式以及可能遇到的难

    在谈论数据库架构和数据库优化的时候,我们经常会听到"分库分表"."分片"."Sharding"-这样的关键词.让人感到高兴的是,这些朋友所服 ...

  8. 分库分表的几种常见形式以及可能遇到的难题

    前言 在谈论数据库架构和数据库优化的时候,我们经常会听到"分库分表"."分片"."Sharding"-这样的关键词.让人感到高兴的是,这些朋 ...

  9. fasttext 文本分类_4种常见的NLP实践思路【特征提取+分类模型】

    越来越多的人选择参加算法赛事,为了提升项目实践能力,同时也希望能拿到好的成绩增加履历的丰富度.期望如此美好,现实却是:看完赛题,一点思路都木有.那么,当我们拿到一个算法赛题后,如何破题,如何找到可能的 ...

  10. 8种常见机器学习算法比较

    8种常见机器学习算法比较 2016-08-04 17:46 转载 陈圳 0条评论 雷锋网(搜索"雷锋网"公众号关注)按:本文转自刘志伟责编,在机器学习中选择一个恰当的算法十分重要, ...

最新文章

  1. 计算机视觉开源库OpenCV之边缘检测cv2.canny()函数
  2. springboot 使用webflux响应式开发教程(一)
  3. java中垃圾收集_Java中的垃圾收集器是什么?
  4. 福州java培训哪里好_南通java培训哪家好
  5. 秦九韶算法matlab实验报告,数值分析上机实验报告.doc
  6. mysql 设置默认值_为什么 Flink 无法实时写入 MySQL?
  7. 什么是SQL Server日志传送?
  8. oracle shutdown 默认,oracle shutdown 没有反应
  9. Android导入第三方类库
  10. Discuz多配色纯论坛c22 utf8电脑版模板
  11. 黑盒测试设计专题:正交试验
  12. https学习笔记三----OpenSSL生成root CA及签发证书
  13. 使用Java+Puppeteer+OpenCV 过腾讯防水墙滑动验证码
  14. 华为android贡献度,米粉别不信,华为对安卓系统的贡献比小米更多
  15. 聚类分析的基本概念和方法
  16. Android:圆形头像
  17. cygwin 使用 zsh
  18. 在交通监控中使用基于计算机视觉的事故检测方案
  19. Premiere导出视频音画不同步的解决方案
  20. 面向对象的特点?对象模型、动态模型和功能模型3种模型之间的关系?

热门文章

  1. eclipse缺少org.apache.http.legacy的解决办法
  2. html用于信息展示的表格源码,Html表格
  3. python函数缺省参数实例_Python中函数及默认参数的定义与调用操作实例分析
  4. 计算机应用水平excel考什么,全国专业技术人员计算机应用能力考试EXCEL2003中文字处理全真模拟试卷(三)...
  5. linux查找当前目录下所有子目录特定文件类型
  6. linux mysql 编译后的版本_LINUX下编译安装最新版本mysql_MySQL
  7. java update needed_JAVA update()方法 求详解
  8. c++ 如何获取移动硬盘_M.2 NVMe固态移动硬盘如此DIY,零难度+低成本+速度快
  9. alsa的动态库安装在哪里_源码编译安装MySQL8.0.20
  10. pulse 去马赛克软件_Github高赞:打马赛克=形同虚设,AI看透你一切小心思