动态生成rdlc 报表(原创)

因为公司需求 研究微软的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你需要改的格式是哪个地方

posted @ 2009-03-18 10:19 思然 阅读(...) 评论(...) 编辑 收藏