利用XML做自定义报表(2)---数据与结构处理

1、将报表数据与报表格式结合生成报表XML

如果想转换为HTML代码,可以通过上面的XSLT来转换

using System;
using System.Xml;
using System.Data;
using System.Collections;
using System.IO;
using System.Web;
using System.Xml.Xsl;
using System.Text;

namespace HKH.XMLReport
{
 /// <summary>
 /// 处理XML报表
 /// </summary>
 /// <remarks>
 /// Create By Liwt
 /// </remarks>
 public class clsXml
 {

  #region 生成XML字符串

  /// <summary>
  /// 根据数据集和格式文件转换成XML报表文件
  /// </summary>
  /// <param name="dsReport">报表数据DataSet</param>
  /// <param name="xmlFormatPath">报表格式文件的路径</param>
  /// <returns></returns>
  public static string CreateXML(DataSet dsReport,string xmlFormatPath)
  {
   #region 变量声明

   #region
   string strXMLReport="";       //XML字符串

   StringBuilder strTitle=new StringBuilder();
   StringBuilder strSubTitle=new StringBuilder();
   StringBuilder strNormal=new StringBuilder();
   StringBuilder strCount=new StringBuilder();
   StringBuilder strTotalCount=new StringBuilder();
   #endregion

   #region
   bool hasTitle=false;        //是否有标题
   bool hasSubTitle=false;
   bool hasNormal=false;                            //数据行为必须
   bool hasCount=false;
   bool hasTotalCount=false;
   #endregion

   #region
   StringBuilder strTableFormat=new StringBuilder();      //表格式

   StringBuilder strTitleRowFormat=new StringBuilder();     //标题行格式
   StringBuilder strSubTitleRowFormat=new StringBuilder();     
   StringBuilder strNormalRowFormat=new StringBuilder();
   StringBuilder strCountRowFormat=new StringBuilder();
   StringBuilder strTotalCountRowFormat=new StringBuilder();
   #endregion

   #region
   ArrayList alColumnName=new ArrayList();      //列名(按显示顺序排列)
   ArrayList alCountColumn=new ArrayList();

   SortedList slTitleColumnFormat=new SortedList();    //标题列格式
   SortedList slSubTitleColumnFormat=new SortedList();
   SortedList slNormalColumnFormat=new SortedList();
   SortedList slCountColumnFormat=new SortedList();
   SortedList slTotalCountColumnFormat=new SortedList();
   #endregion

   //以下相当于常量
   #region
   string strXMLHead="<?xml version=/"1.0/" encoding=/"gb2312/"?>";
   string strXMLStart="<RecordSet>";    //开始标记
   string strXMLEnd="</RecordSet>";    //结束标记
   
   string strTableStart="<Table";
   string strTableEnd="</Table>";

   string strRowStart="<DataRow";
   string strRowEnd="</DataRow>";

   string strColumnStart="<Column";
   string strColumnEnd="</Column>";

   string strValueStart="<Value>";     //无样式,直接加 '>'
   string strValueEnd="</Value>";
   #endregion

   DataSet dsFormat=new DataSet();     //格式文件读取DataSet

   #endregion

   try
   {
    #region 数据验证

    if(xmlFormatPath == null || xmlFormatPath == "")
    {
     throw new Exception("xmlFormatPath IS NULL or Empty!");
    }

    if(dsReport == null)
    {
     return null;
    }
    #endregion

    dsFormat.ReadXml(xmlFormatPath);

    #region 加载样式

    #region 加载列名

    DataRow[] drs=dsFormat.Tables["DataRow"].Select("Type='Normal'");  //数据行肯定有
    string titleFlag=drs[0]["DataRow_Id"].ToString();

    DataView dvColumn=dsFormat.Tables["Column"].DefaultView;
    dvColumn.RowFilter="DataRow_Id="+titleFlag.ToString();
    dvColumn.Sort="DIndex Asc";           //按索引排序

    IEnumerator enuRowView=dvColumn.GetEnumerator();
    while(enuRowView.MoveNext())
    {
     DataRowView drv=(DataRowView)enuRowView.Current;
     alColumnName.Add(drv.Row["name"].ToString());

     if(Convert.ToBoolean(drv.Row["IsCount"]) == true)
     {
      alCountColumn.Add(drv.Row["name"].ToString());
     }
    }

    #endregion

    DataRelation Relation_T_R=dsFormat.Tables["Table"].ChildRelations[0];
    DataRelation Relation_R_C=dsFormat.Tables["DataRow"].ChildRelations[0];

    for(int iTable=0;iTable<dsFormat.Tables["Table"].Rows.Count;iTable++)//目前只有一条记录,如有多条,则上面取列名将可能有问题
    {
     #region 表格式

     for (int jTable=0;jTable<dsFormat.Tables["Table"].Columns.Count;jTable++)
     {
      string colName=dsFormat.Tables["Table"].Columns[jTable].ColumnName;
      if(colName !="Table_Id")
      {
       strTableFormat.Append(" "+colName+"=/""+dsFormat.Tables["Table"].Rows[iTable][colName].ToString().Trim()+"/"");
      }
     }

     #endregion

     DataRow[] drsRow=dsFormat.Tables["Table"].Rows[iTable].GetChildRows(Relation_T_R);
     for(int iRow=0;iRow<drsRow.Length;iRow++)
     {
      string RowType=drsRow[iRow]["Type"].ToString();

      DataRow[] drsColumn=drsRow[iRow].GetChildRows(Relation_R_C);

      switch (RowType)
      {
       case "Title"://标题行
       {
        hasTitle=true;

        #region
        for(int jRow=0; jRow<dsFormat.Tables["DataRow"].Columns.Count;jRow++)
        {
         string colName=dsFormat.Tables["DataRow"].Columns[jRow].ColumnName;
         if(colName !="Table_Id" && colName != "DataRow_Id")
         {
          strTitleRowFormat.Append(" "+colName+"=/""+drsRow[iRow][colName].ToString().Trim()+"/"");
         }
        }

        #region 标题列,列设置

        for(int iColumn=0;iColumn<drsColumn.Length;iColumn++)
        {
         string strName="";
         string strValue="";
         StringBuilder strTitleColumnFormat=new StringBuilder();

         for(int jColumn=0;jColumn<dsFormat.Tables["Column"].Columns.Count;jColumn++)
         {
          string colName=dsFormat.Tables["Column"].Columns[jColumn].ColumnName;

          switch (colName)
          {
           case "Table_Id":
           case "DataRow_Id":
           {
            break;
           }
           case "Name":
           {
            strName=drsColumn[iColumn][colName].ToString().Trim();
            break;
           }
           case "Value":
           {
            strValue=strValueStart+drsColumn[iColumn][colName].ToString().Trim()+strValueEnd;
            break;
           }
           default:
           {
            strTitleColumnFormat.Append(" "+colName+"=/""+drsColumn[iColumn][colName].ToString().Trim()+"/"");
            break;
           }
          }
         }

         slTitleColumnFormat.Add(strName,strColumnStart+strTitleColumnFormat.ToString()+">"+strValue+strColumnEnd);
        }
        #endregion

        break;
        #endregion
       }

       case "SubTitle"://子标题行
       {
        hasSubTitle=true;

        #region
        for(int jRow=0; jRow<dsFormat.Tables["DataRow"].Columns.Count;jRow++)
        {
         string colName=dsFormat.Tables["DataRow"].Columns[jRow].ColumnName;
         if(colName !="Table_Id" && colName != "DataRow_Id")
         {
          strSubTitleRowFormat.Append(" "+colName+"=/""+drsRow[iRow][colName].ToString().Trim()+"/"");
         }
        }

        #region 子标题列

        for(int iColumn=0;iColumn<drsColumn.Length;iColumn++)
        {
         string strName="";
         string strValue="";
         StringBuilder strSubTitleColumnFormat=new StringBuilder();
         
         for(int jColumn=0;jColumn<dsFormat.Tables["Column"].Columns.Count;jColumn++)
         {
          string colName=dsFormat.Tables["Column"].Columns[jColumn].ColumnName;

          switch (colName)
          {
           case "Table_Id":
           case "DataRow_Id":
           {
            break;
           }
           case "Name":
           {
            strName=drsColumn[iColumn][colName].ToString().Trim();
            break;
           }
           case "Value":
           {
            strValue=strValueStart+drsColumn[iColumn][colName].ToString().Trim()+strValueEnd;
            break;
           }
           default:
           {
            strSubTitleColumnFormat.Append(" "+colName+"=/""+drsColumn[iColumn][colName].ToString().Trim()+"/"");
            break;
           }
          }
         }
    
         slSubTitleColumnFormat.Add(strName,strColumnStart+strSubTitleColumnFormat.ToString()+">"+strValue+strColumnEnd);
        }

        #endregion
        break;
        #endregion
       }
       case "Normal"://数据行
       {
        hasNormal=true;

        #region
        for(int jRow=0; jRow<dsFormat.Tables["DataRow"].Columns.Count;jRow++)
        {
         string colName=dsFormat.Tables["DataRow"].Columns[jRow].ColumnName;
         if(colName !="Table_Id" && colName != "DataRow_Id")
         {
          strNormalRowFormat.Append(" "+colName+"=/""+drsRow[iRow][colName].ToString().Trim()+"/"");
         }
        }

        #region 数据列

        for(int iColumn=0;iColumn<drsColumn.Length;iColumn++)
        {
         string strName="";
         StringBuilder strNormalColumnFormat=new StringBuilder();

         for(int jColumn=0;jColumn<dsFormat.Tables["Column"].Columns.Count;jColumn++)
         {
          string colName=dsFormat.Tables["Column"].Columns[jColumn].ColumnName;

          switch (colName)
          {
           case "Table_Id":
           case "DataRow_Id":
           case "Value":
           {
            break;
           }
           case "Name":
           {
            strName=drsColumn[iColumn][colName].ToString().Trim();
            break;
           }
           default:
           {
            strNormalColumnFormat.Append(" "+colName+"=/""+drsColumn[iColumn][colName].ToString().Trim()+"/"");
            break;
           }
          }
         }
        
         slNormalColumnFormat.Add(strName,strNormalColumnFormat.ToString());
        }

        #endregion

        break;
        #endregion
       }
       case "Count"://合计行
       {
        hasCount=true;

        #region
        for(int jRow=0; jRow<dsFormat.Tables["DataRow"].Columns.Count;jRow++)
        {
         string colName=dsFormat.Tables["DataRow"].Columns[jRow].ColumnName;
         if(colName !="Table_Id" && colName != "DataRow_Id")
         {
          strCountRowFormat.Append(" "+colName+"=/""+drsRow[iRow][colName].ToString().Trim()+"/"");
         }
        }

        #region 合计列

        for(int iColumn=0;iColumn<drsColumn.Length;iColumn++)
        {
         string strName="";
         StringBuilder strCountColumnFormat=new StringBuilder();

         for(int jColumn=0;jColumn<dsFormat.Tables["Column"].Columns.Count;jColumn++)
         {
          string colName=dsFormat.Tables["Column"].Columns[jColumn].ColumnName;

          switch (colName)
          {
           case "Table_Id":
           case "DataRow_Id":
           case "Value":
           {
            break;
           }
           case "Name":
           {
            strName=drsColumn[iColumn][colName].ToString().Trim();
            break;
           }
           
           default:
           {
            strCountColumnFormat.Append(" "+colName+"=/""+drsColumn[iColumn][colName].ToString().Trim()+"/"");
            break;
           }
          }
         }
       
         slCountColumnFormat.Add(strName,strCountColumnFormat.ToString());
        }
        #endregion

        break;
        #endregion
       }
       case "TotalCount"://总计行
       {
        hasTotalCount=true;

        #region
        for(int jRow=0; jRow<dsFormat.Tables["DataRow"].Columns.Count;jRow++)
        {
         string colName=dsFormat.Tables["DataRow"].Columns[jRow].ColumnName;
         if(colName !="Table_Id" && colName != "DataRow_Id")
         {
          strTotalCountRowFormat.Append(" "+colName+"=/""+drsRow[iRow][colName].ToString().Trim()+"/"");
         }
        }

        #region 总计列

        for(int iColumn=0;iColumn<drsColumn.Length;iColumn++)
        {
         string strName="";
         StringBuilder strTotalCountColumnFormat=new StringBuilder();

         for(int jColumn=0;jColumn<dsFormat.Tables["Column"].Columns.Count;jColumn++)
         {
          string colName=dsFormat.Tables["Column"].Columns[jColumn].ColumnName;

          switch (colName)
          {
           case "Table_Id":
           case "DataRow_Id":
           case "Value":
           {
            break;
           }
           case "Name":
           {
            strName=drsColumn[iColumn][colName].ToString().Trim();
            break;
           }
           default:
           {
            strTotalCountColumnFormat.Append(" "+colName+"=/""+drsColumn[iColumn][colName].ToString().Trim()+"/"");
            break;
           }
          }
         }

         slTotalCountColumnFormat.Add(strName,strTotalCountColumnFormat.ToString());
        }
        #endregion

        break;
        #endregion
       }
       default:
       {
        break;
       }
      }
     }
    }
    #endregion

    #region 加载数据

    decimal[] colCount=new decimal[alCountColumn.Count];  //保存合计,使用时保持索引一致

    #region 标题/子标题

    //标题行
    if(hasTitle)
    {
     strTitle.Append(strRowStart);
     strTitle.Append(strTitleRowFormat.ToString()+">");

     for(int i=0;i<alColumnName.Count;i++)
     {
      int keyIndex=slTitleColumnFormat.IndexOfKey(alColumnName[i]);
      if(keyIndex != -1)
      {
       strTitle.Append(slTitleColumnFormat.GetByIndex(keyIndex).ToString());
      }
     }
//     strTitle.Append(">");

     strTitle.Append(strRowEnd);
    }

    //子标题
    if(hasSubTitle)
    {
     strSubTitle.Append(strRowStart);
     strSubTitle.Append(strSubTitleRowFormat.ToString()+">");

     for(int i=0;i<alColumnName.Count;i++)
     {
      int keyIndex=slSubTitleColumnFormat.IndexOfKey(alColumnName[i]);
      if(keyIndex != -1)
      {
       strSubTitle.Append(slSubTitleColumnFormat.GetByIndex(keyIndex).ToString());
      }
     }
//     strSubTitle.Append(">");

     strSubTitle.Append(strRowEnd);
    }
    #endregion

    #region 数据行
    if(hasNormal)
    {
     for(int iRow=0;iRow<dsReport.Tables[0].Rows.Count;iRow++)
     {
      #region 拼XML串
      strNormal.Append(strRowStart);
      strNormal.Append(strNormalRowFormat.ToString()+">");

      for(int iColumn=0;iColumn<alColumnName.Count;iColumn++)
      {
       string colName=alColumnName[iColumn].ToString().Trim();
       string colValue=dsReport.Tables[0].Rows[iRow][colName].ToString().Trim();

       strNormal.Append(strColumnStart);
     
       int keyIndex=slNormalColumnFormat.IndexOfKey(colName);
       if(keyIndex != -1)
       {
        strNormal.Append(slNormalColumnFormat.GetByIndex(keyIndex).ToString());
       }
       strNormal.Append(">");

       strNormal.Append(strValueStart);

       strNormal.Append(colValue);

       strNormal.Append(strValueEnd);

       strNormal.Append(strColumnEnd);

       #region 合计累加
       if(alCountColumn.Contains(colName))
       {
        System.Text.RegularExpressions.Regex regex=new System.Text.RegularExpressions.Regex(@"^[-]?/d+[.]?/d*$");
        if(regex.IsMatch(colValue))
        {
         colCount[alCountColumn.IndexOf(colName)]+=Convert.ToDecimal(colValue);
        }
       }
       #endregion     
      }

      strNormal.Append(strRowEnd);

      #endregion
     }
    }
    #endregion

    #region 合计行/总计行

    //合计行
    if(hasCount)
    {
     strCount.Append(strRowStart);
     strCount.Append(strCountRowFormat.ToString()+">");

     for(int iColumn=0;iColumn<alColumnName.Count;iColumn++)
     {
      string colName=alColumnName[iColumn].ToString().Trim();

      strCount.Append(strColumnStart);
     
      int keyIndex=slCountColumnFormat.IndexOfKey(colName);
      if(keyIndex != -1)
      {
       strCount.Append(slCountColumnFormat.GetByIndex(keyIndex).ToString());
      }
      strCount.Append(">");

      strCount.Append(strValueStart);

      //第一列加 “合计” 标识
      if(iColumn == 0)
      {
       strCount.Append("合计");
      }
      else if(alCountColumn.Contains(colName))
      {
       strCount.Append(colCount[alCountColumn.IndexOf(colName)].ToString("0.0000"));
      }

      strCount.Append(strValueEnd);

      strCount.Append(strColumnEnd);
     }

     strCount.Append(strRowEnd);
    }

    //总计行
    if(hasTotalCount)
    {
     strTotalCount.Append(strRowStart);
     strTotalCount.Append(strTotalCountRowFormat.ToString()+">");

     for(int iColumn=0;iColumn<alColumnName.Count;iColumn++)
     {
      string colName=alColumnName[iColumn].ToString().Trim();

      strTotalCount.Append(strColumnStart);
     
      int keyIndex=slTotalCountColumnFormat.IndexOfKey(colName);
      if(keyIndex != -1)
      {
       strTotalCount.Append(slTotalCountColumnFormat.GetByIndex(keyIndex).ToString());
      }
      strTotalCount.Append(">");

      strTotalCount.Append(strValueStart);

      //第一列加 “总计” 标识
      if(iColumn == 0)
      {
       strTotalCount.Append("总计");
      }
      else if(alCountColumn.Contains(colName))
      {
       strTotalCount.Append(colCount[alCountColumn.IndexOf(colName)].ToString("0.0000"));
      }

      strTotalCount.Append(strValueEnd);

      strTotalCount.Append(strColumnEnd);
     }

     strTotalCount.Append(strRowEnd);
    }
    #endregion
    #endregion

    //联接生成XML
    strXMLReport=strXMLHead+strXMLStart+strTableStart+strTableFormat.ToString()+">"+strTitle.ToString()+strSubTitle.ToString()+strNormal.ToString()+strCount.ToString()+strTotalCount.ToString()+strTableEnd+strXMLEnd;

    return strXMLReport;
   }
   catch(Exception Ex)
   {
    throw Ex;
   }
  }
  #endregion 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

honkerhero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值