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