Rdlc 動態(tài)加載xml 實(shí)現(xiàn)圖表寬度(高度)自適應(yīng)
2011-07-23 10:28 by mr.張, 442 visits, 收藏, 編輯微軟提供的Rdlc 報(bào)表為我們提供的很大的便利,功能強(qiáng)大,使用簡單。但在使用過程中總是有那么點(diǎn)美中不足:圖表大小是固定的,不能根據(jù)內(nèi)容自適應(yīng)大小。這就造成了如下情況,看圖說話:
數(shù)據(jù)少時(shí)圖表比較稀疏
數(shù)據(jù)多時(shí)圖表很擠
這對于我們追求完美的程序員來說是不能接收的,堅(jiān)決要改造。
思路:
Rdlc 是基于xml的,我們可以通過動態(tài)修改rdlc的xml數(shù)據(jù),來更改rdlc 定義的圖表大小。
寬度的計(jì)算:類別總數(shù)*序列數(shù)*(條形單位寬度+類別間隔)
寬度計(jì)算根據(jù)圖表的類型不同計(jì)算公式也不同,上述公式只適合 "簡單柱形圖""簡單條形圖",其它類型的圖表以后解決。
Rdlc報(bào)表xml解析:
這里我們只需要動態(tài)改變 圖表的寬度和高度,需要知道如下幾個(gè)節(jié)點(diǎn):
<Chart Name="chart1"> 中間數(shù)據(jù)省略 </Chart> xpath 路徑為: Report/Body/ ReportItems/ Chart
Chart的類型Type節(jié)點(diǎn): <Chart> <Type>Column</Type> </Chart> 其中 Type為Column 代表 簡單柱形圖 ,Type 為 Bar 代表 簡單條形圖
Chart的寬度 Width 節(jié)點(diǎn): <Chart> <Width>23cm</Width> </Chart>
Chart的 高度Height 節(jié)點(diǎn): <Chart> <Height>11.5cm</Height> </Chart>
部分代碼:
public class RdlcReportHelper
{
private XmlDocument _rdlcDoc;
private XmlNode _root;
private string _chartName;
private double _perWidth = 0.15; //厘米
private XPathDocument xpathdoc;
private XPathNavigator xnv;
private XmlNamespaceManager xnm;
private string[] _chartType = new string[] { "Bar", "Column" };
public RdlcReportHelper(string path)
{
//加載xml
_rdlcDoc = new XmlDocument();
_rdlcDoc.Load(path);
_root = _rdlcDoc.LastChild;
xnm = new XmlNamespaceManager(_rdlcDoc.NameTable);
xnm.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
xnm.AddNamespace("default", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
xnm.PushScope();
xpathdoc = new XPathDocument(path);
xnv = xpathdoc.CreateNavigator();
}
/// <summary>
/// 轉(zhuǎn)換xml
/// </summary>
/// <returns></returns>
public MemoryStream AutoSizeReport()
{
…………
XmlNode ChartNode = _root.SelectSingleNode("http://default:Body/default:ReportItems/default:Chart[@Name='" + _chartName + "']", xnm); //查找 Chart 節(jié)點(diǎn)
XmlNode ChartTypeNode = ChartNode.SelectSingleNode("default:Type", xnm); //查找圖表類型節(jié)點(diǎn)
if (w != 0)
{
if (ChartTypeNode.InnerText == "Bar")
{
XmlNode heightNode = ChartNode.SelectSingleNode("default:Height", xnm); //設(shè)置 高度
heightNode.InnerText = w + "cm";
}
else if (ChartTypeNode.InnerText == "Column")
{
XmlNode widthNode = ChartNode.SelectSingleNode("default:Width", xnm); //設(shè)置寬度
widthNode.InnerText = w + "cm";
}
}
}
}
如何使用:
使用設(shè)計(jì)器設(shè)計(jì)好報(bào)表,設(shè)置要自動伸展的圖表名稱,類別字段、序列字段、值字段和單位寬度。
RdlcReportHelper reporthelper = new RdlcReportHelper(Server.MapPath("ReportTest.rdlc"));
reporthelper.AutoChartName = "chart1"; //設(shè)置自動伸展圖表名稱
reporthelper.DataSource = dt; //設(shè)置綁數(shù)據(jù)源
reporthelper.TypeField = "Year"; //設(shè)置類別字段
reporthelper.SeriesField = "TypeName"; //設(shè)置序列字段
reporthelper.ValueField = "Money"; //設(shè)置值字段
reporthelper.PerWidth = 0.15; //第個(gè)條形的最小寬度 默認(rèn)0.15
this.ReportViewer1.LocalReport.LoadReportDefinition(reporthelper.AutoSizeReport());
//this.ReportViewer1.LocalReport.ReportPath = Server.MapPath("ReportTest.rdlc");
this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1_DataTable1", dt));
this.ReportViewer1.LocalReport.Refresh();
最終效果如下:
再多的數(shù)據(jù)也能自動伸展
文筆有限,描述不清,大家下載代碼看吧。