程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> .NET中動態生成rdlc報表

.NET中動態生成rdlc報表

編輯:關於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你需要改的格式是哪個地方

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved