Rdlc 动态加载xml 实现图表宽度(高度)自适应

微软提供的Rdlc 报表为我们提供的很大的便利,功能强大,使用简单。但在使用过程中总是有那么点美中不足:图表大小是固定的,不能根据内容自适应大小。这就造成了如下情况,看图说话:

数据少时图表比较稀疏

数据多时图表很挤

    这对于我们追求完美的程序员来说是不能接收的,坚决要改造。

思路:    

Rdlc 是基于xml的,我们可以通过动态修改rdlc的xml数据,来更改rdlc 定义的图表大小。

宽度的计算:类别总数*序列数*(条形单位宽度+类别间隔)

宽度计算根据图表的类型不同计算公式也不同,上述公式只适合 "简单柱形图""简单条形图",其它类型的图表以后解决。

Rdlc报表xml解析:

    这里我们只需要动态改变 图表的宽度和高度,需要知道如下几个节点:

<Chart Name="chart1"> 中间数据省略 </Chart> xpath 路径为: Report/Body/ ReportItems/ Chart

    Chart的类型Type节点: <Chart> <Type>Column</Type> </Chart> 其中 Type为Column 代表 简单柱形图 ,Type 为 Bar 代表 简单条形图

Chart的宽度 Width 节点: <Chart> <Width>23cm</Width> </Chart>

Chart的 高度Height 节点: <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>

/// 转换xml

/// </summary>

/// <returns></returns>

public MemoryStream AutoSizeReport()

{

        …………
        XmlNode ChartNode = _root.SelectSingleNode("//default:Body/default:ReportItems/default:Chart[@Name='" + _chartName + "']", xnm); //查找
 Chart 节点

        XmlNode ChartTypeNode = ChartNode.SelectSingleNode("default:Type", xnm); //查找图表类型节点

if (w != 0)

{

if (ChartTypeNode.InnerText == "Bar")

{

XmlNode heightNode = ChartNode.SelectSingleNode("default:Height", xnm); //设置 高度

heightNode.InnerText = w + "cm";

}

else if (ChartTypeNode.InnerText == "Column")

{

XmlNode widthNode = ChartNode.SelectSingleNode("default:Width", xnm); //设置宽度

widthNode.InnerText = w + "cm";

}

}

}

 

如何使用:

使用设计器设计好报表,设置要自动伸展的图表名称,类别字段、序列字段、值字段和单位宽度。

RdlcReportHelper reporthelper = new RdlcReportHelper(Server.MapPath("ReportTest.rdlc"));

reporthelper.AutoChartName = "chart1"; //设置自动伸展图表名称

reporthelper.DataSource = dt; //设置绑数据源

reporthelper.TypeField = "Year"; //设置类别字段

reporthelper.SeriesField = "TypeName"; //设置序列字段

reporthelper.ValueField = "Money"; //设置值字段

reporthelper.PerWidth = 0.15; //第个条形的最小宽度 默认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();

最终效果如下:

再多的数据也能自动伸展

文笔有限,描述不清,大家下载代码看吧。

posted @ 2011-07-23 10:28  在路在的张  阅读(4841)  评论(2编辑  收藏