ASP.NET中应用XML技术实现Web报表打印

来源:互联网 发布:java开发必读书籍 编辑:程序博客网 时间:2024/05/18 02:21

  笔者为了能够快速实现简单的报表打印,设计了下面的方案。编写一个通用打印页面,要打印报表将参数写入一个XML文档,调用页面XMLReport.aspx?report=报表名,即可完成报表的制作

  3.1 创建自定义的XML报表文件

  XML主要用来描述打印报表的名称,数据来源,格式,分页打印等信息,具体标签可自己定义,下面是笔者针对会员管理系统报表打印所制定的XML文档:

MemberList.xml

<?xml version="1.0" encoding="utf-8" ?>

<XmlReport>

     <Page>

         <Title>Member Information</Title>

         <ApplyXSLT></ApplyXSLT>

     </Page>

     <Report>

         <Title>Member List</Title>

         <TableName>MemberList</TableName>

         <SQLdataConnection>Data Source=localhost;User ID=sa;password=;Initial Catalog=XMLReport;</SQLdataConnection>

         <OleDbConnection></OleDbConnection>

         <Sql>Select MemberID, prefix '. '  firstname ' '  surname AS [Member Name],CityOrTown,State,PostCode, '$' convert(varchar(12),FeesPaid) As Fees From Members;</Sql>

         <PageSize>10</PageSize>

     </Report>

     <Report>

         <Title>Member Summary</Title>

         <TableName>MemberSummary</TableName>

         <SQLdataConnection>Data Source=localhost;User ID=sa;password=;Initial Catalog=XMLReport;</SQLdataConnection>

         <OleDbConnection></OleDbConnection>

         <Sql>Select Count(MemberID) As [Member Count], '$' convert(varchar(12),Sum(FeesPaid)) As [Fees Total] From Members;</Sql>

         <PageSize></PageSize>

     </Report>

</XmlReport>

标签说明:

Page Title:报表标题

ApplyXSLT:应用样式表定制报表

SQLdaraConnection: 数据源连接字串,数据提供者为SQL server

OleDbConnection:数据源连接字串,数据提供者为OleDb

Sql:选取报表数据的sql语句

PageSize:分页打印,每页显示的记录条数

读者还可以自定义一些更精确的标签来控制报表。

  3.2 创建通用打印页面

  page_load时读取要打印的报表名

 

xmlFile = Request.QueryString["report"].ToString()   ".xml";

        

private void BindReports()

{

     DataSet dsXml = new DataSet();

     try

     {

         dsXml.ReadXml(Server.MapPath("Reports//"   xmlFile));

         DataTable dtPage = dsXml.Tables["Page"];

         DataTable dtReport = dsXml.Tables["Report"];

         labelPageTitle.Text = dtPage.Rows[0]["Title"].ToString();

         for(int i = 0;i < dtReport.Rows.Count; i  )

         {

              GetLabel(i).Text = dtReport.Rows[i]["Title"].ToString();

              if(dtReport.Rows[i]["SQLdataConnection"].ToString() != String.Empty || dtReport.Rows[i]["Sql"].ToString() != String.Empty || dtReport.Rows[i]["OleDbConnection"].ToString() != String.Empty)

              {

                   DataGrid dg = GetDataGrid(i);

                   if(dtReport.Rows[i]["PageSize"].ToString() != String.Empty)

                   {

                       //分页打印

                       dg.AllowPaging = true;

                       dg.PagerStyle.Mode = PagerMode.NumericPages;

                       dg.PagerStyle.PageButtonCount = 10;

                       dg.PageSize = Convert.ToInt32(dtReport.Rows[i]["PageSize"].ToString());

                   }

                   DataSet ds = new DataSet();

                   //从Report.xml读取数据源信息

                   if(dtReport.Rows[i]["SQLdataConnection"].ToString() != String.Empty)

                   {

                       //数据提供者为SQL Server

                       SqlConnection Conn = new SqlConnection(dtReport.Rows[i]["SQLdataConnection"].ToString());

                       SqlDataAdapter myDataAdapt = new SqlDataAdapter(dtReport.Rows[i]["Sql"].ToString(),Conn);

                       myDataAdapt.Fill(ds,dtReport.Rows[i]["TableName"].ToString());

                   }

                   else if(dtReport.Rows[i]["OleDbConnection"].ToString() != String.Empty)

                   {

                       //数据提供者为OLE DB

                       OleDbConnection Conn = new OleDbConnection(dtReport.Rows[i]["OleDbConnection"].ToString());

                       OleDbDataAdapter myDataAdapt = new OleDbDataAdapter(dtReport.Rows[i]["Sql"].ToString(),Conn);

                       myDataAdapt.Fill(ds,dtReport.Rows[i]["TableName"].ToString());

                   }

                       //用通用页面显示报表

                       dg.DataSource = ds;

                       dg.DataBind();

              }    

         }

     }

     catch

     {

         labelPageTitle.Text = "The requested report could not be found";

     }

}

  3.3 创建定制打印页面

  需要在XML文档ApplyXSLT标签内添加对应的xslt文件名,并制作相应的样式表放在项目的xslt文件夹下即可。如下代码添加到通用打印程序中。

if(dtPage.Rows[0]["ApplyXSLT"].ToString() != string.Empty )

{

     //用xsl显示报表

     XmlDataDocument xmlDoc = new XmlDataDocument(ds);

     XslTransform xslTran = new XslTransform();

     xslTran.Load(Server.MapPath("xslt//" dtPage.Rows[0]["ApplyXSLT"].ToString()));

     XmlTextWriter writer = new XmlTextWriter(Server.MapPath("XSLTReports.aspx"), System.Text.Encoding.UTF8);

     xslTran.Transform(xmlDoc, null, writer);

     writer.Close();

     Response.Redirect("XSLTReports.aspx");

}

  应用xslt样式表可以制作出专业的报表样式,为方便制作,在此推荐使用XMLSpy带的Stylesheet

 

转自:牛C网   http://www.niuc.net/post/7619/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸上痘痘发炎了怎么办 脸上皮肤红痒怎么办啊 皮肤有一片红痒怎么办 脸过敏期间很干怎么办 怀孕了用了消糜栓怎么办 乳酸杆菌少或无怎么办 怀孕了白带有异味怎么办 怀孕清洁度iv度怎么办 怀孕了下面有异味怎么办 孕妇尿白细胞1是怎么办 药流期间喂奶了怎么办 20多岁卵巢早衰怎么办 3岁儿童肚子胀气怎么办 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办 又吐又拉还发烧怎么办 喝中药恶心想吐怎么办 生完孩子肛门疼怎么办 拉完大便肛门痛怎么办 肚子总是凉凉的怎么办 京东金条风控了怎么办 京东维修没发票怎么办 假牙吞到肚子里怎么办 眼睛一只大一只小怎么办 一个眼睛大一个眼睛小怎么办 电脑上的字模糊怎么办 无忧乐行注销了怎么办 连供墨盒有空气怎么办 30岁突然停经了怎么办 下面很痒怎么办白带多 私处有点痒怎么办洗液 人的下体皮肤痒怎么办 打球手指关节肿了怎么办 婴儿2个月鼻塞怎么办 3个月婴儿鼻塞怎么办 2个月婴儿感冒了怎么办 头发剪短了很丑怎么办 头发剪了后悔了怎么办