.NET中动态生成rdlc报表2011-10-04 博客园 思然因为公司需求 研究微软的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你需要改的格式是哪个地方