服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - ASP.NET教程 - asp.net 动态生成rdlc报表(原创)

asp.net 动态生成rdlc报表(原创)

2019-09-27 09:32asp.net技术网 ASP.NET教程

因为公司需求 研究微软的Reportviewer 因为有许多特别要求所以动态调用 比较灵活 我的需求是 根据数据不同的合并表头 (参考了随心所欲的博客文档 再次表示感谢)

代码如下:


string cCount = ""; 
string dCount = ""; 
string jCount = ""; 
protected void Page_Load(object sender, EventArgs e) 

if (!IsPostBack) 

string id = Request.QueryString["OrderID"] == null ? "1" : Request.QueryString["OrderID"].ToString(); 
SqlConnection con = new SqlConnection("server=CHENZQ;uid=sa;pwd=luca623;database=luca"); 
SqlDataAdapter sda = new SqlDataAdapter("select * from view_Order where C_orderID='" + id + "'", con); 
DataSet ds = new DataSet(); 
sda.Fill(ds); 
cCount = ds.Tables[0].Rows[0]["C_CTime"].ToString(); 
dCount = ds.Tables[0].Rows[0]["C_TTime"].ToString(); 
jCount = ds.Tables[0].Rows[0]["C_DTime"].ToString(); 
//这段代码是最重要 
ReportViewer1.Reset(); 
this.ReportViewer1.LocalReport.LoadReportDefinition(GenerateRdlc()); 
ReportViewer1.LocalReport.DataSources.Clear(); 
//Orders_DataTable1 数据源名字必须和此报表原绑定的数据源名相同 
this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Orders_DataTable1", ds.Tables[0])); 
this.ReportViewer1.LocalReport.Refresh(); 


//这个方法就是自定义报表的样式 
public MemoryStream GenerateRdlc() 

XmlDocument sourceDoc = new XmlDocument(); 
string path = AppDomain.CurrentDomain.BaseDirectory + "Orders.rdlc"; 
//c_CTime = ds.Tables[0].Rows[0]["C_CTime"].ToString(); 
sourceDoc.Load(path); 
//下面就是xml操作了 没必要看我的 根据自己的需求而做 
XmlNode xHeader = sourceDoc.ChildNodes.Item(1).ChildNodes.Item(13).ChildNodes.Item(1).ChildNodes.Item(0).ChildNodes.Item(4); 
XmlNode xCells = xHeader.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0); 
//建设期 
XmlNode xmlCell = xCells.ChildNodes.Item(1); 
XmlElement xeCol = sourceDoc.CreateElement("ColSpan"); 
xeCol.InnerText = cCount; 
xeCol.InnerXml = cCount; 
xmlCell.InnerXml += xeCol.OuterXml; 
XmlNode xmlCellValue = xmlCell.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(4); 
xmlCellValue.InnerXml = "建设期"; 
xmlCellValue.InnerText = "建设期"; 
XmlNode xnRemove; 
for (int i = 0; i <int.Parse(cCount) - 1; i++) 

xnRemove = xCells.ChildNodes.Item(2); 
xCells.RemoveChild(xnRemove); 

//投产期 
XmlNode xmlCellT = xCells.ChildNodes.Item(2); 
XmlElement xeColT = sourceDoc.CreateElement("ColSpan"); 
xeColT.InnerText = dCount; 
xeColT.InnerXml = dCount; 
xmlCellT.InnerXml += xeColT.OuterXml; 
XmlNode xmlCellValueT = xmlCellT.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(4); 
xmlCellValueT.InnerXml = "投产期"; 
xmlCellValueT.InnerText = "投产期"; 
for (int j = 0; j < int.Parse(dCount) - 1; j++) 

xnRemove = xCells.ChildNodes.Item(3); 
xCells.RemoveChild(xnRemove); 

//生产期 
XmlNode xmlCellC = xCells.ChildNodes.Item(3); 
XmlElement xeColC = sourceDoc.CreateElement("ColSpan"); 
xeColC.InnerText = jCount.ToString(); 
xeColC.InnerXml = jCount.ToString(); 
xmlCellC.InnerXml += xeColC.OuterXml; 
XmlNode xmlCellValueC = xmlCellC.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(4); 
xmlCellValueC.InnerXml = "生产期"; 
xmlCellValueC.InnerText = "生产期"; 
for (int j = 0; j < int.Parse(jCount) - 1; j++) 

xnRemove = xCells.ChildNodes.Item(4); 
xCells.RemoveChild(xnRemove); 

MemoryStream ms = new MemoryStream(); 
XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument)); 
serializer.Serialize(ms, sourceDoc); 
ms.Position = 0; 
return ms; 


技巧 可以先在报表里自己设计好需要的格式 用 
XmlDocument sourceDoc = new XmlDocument(); 
string path = AppDomain.CurrentDomain.BaseDirectory + "Orders.rdlc"; 
然后用sourceDoc .save()保存生成xml 
可以看到此xml你需要改的格式是哪个地方

延伸 · 阅读

精彩推荐