ASP.NET中應用XML技術實現Web報表打印 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- ASP.NET中應用XML技術實現Web報表打印 (http://www.webasp.net/article/18/17237.htm) |
| -- 作者:未知 -- 發佈日期: 2005-03-29 |
| 應用XML技術實現報表打印方案的設計與實現
筆者為了能夠快速實現簡單的報表打印,設計了下面的方案。編寫一個通用打印頁面,要打印報表將參數寫入一個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。 |
| webasp.net |