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

复制代码 代码如下:

  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你需要改的格式是哪个地方