using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.Collections;
using System.Reflection;
using Newtonsoft.Json;
namespace EShang.Common
{
public class DataTableHelper
{
///
/// 复制单元格内容
///
/// 原单元格
/// 新单元格
/// 字段集合
///
private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
foreach (string field in fieldNames)
{
newRow[field] = sourceRow[field];
}
return newRow;
}
///
/// DataTable转Hashtable【传入DataRow】
///
///
///
public static Hashtable DataRowToHashTable(DataRow dr)
{
Hashtable htReturn = new Hashtable(dr.ItemArray.Length);
foreach (DataColumn dc in dr.Table.Columns)
{
htReturn.Add(dc.ColumnName, dr[dc.ColumnName]);
}
return htReturn;
}
///
/// DataTable转Hashtable【传入DataTable】
///
///
///
public static Hashtable DataTableToHashtable(DataTable dt)
{
Hashtable ht = new Hashtable();
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
string key = dt.Columns[i].ColumnName;
ht[key.ToUpper()] = dr[key];
}
}
return ht;
}
///
/// DataTable转IList(Hashtable)
///
///
///
public static IList DataTableToArrayList(DataTable dt)
{
if (dt == null)
{
return new List();
}
IList datas = new List();
foreach (DataRow dr in dt.Rows)
{
Hashtable ht = DataRowToHashTable(dr);
datas.Add(ht);
}
return datas;
}
///
/// DataTable转Hashtable【键值对】
///
///
///
///
///
public static Hashtable DataTableToHashtableByKeyValue(DataTable dt, string keyField, string valFiled)
{
Hashtable ht = new Hashtable();
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
string key = dr[keyField].ToString();
ht[key] = dr[valFiled];
}
}
return ht;
}
///
/// 数据行对象转化成泛型IList
///
///
///
///
public static IList DataTableToIList(DataTable dt)
{
IList list = new List();
string tempName = "";
foreach (DataRow dr in dt.Rows)
{
T obj = Activator.CreateInstance();
PropertyInfo[] propertys = obj.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (dt.Columns.Contains(tempName) && pi.CanWrite)
{
object value = dr[tempName];
if (value != DBNull.Value)
{
pi.SetValue(obj, value, null);
}
}
}
list.Add(obj);
}
return list;
}
///
/// 数据行对象转化成泛型List
///
///
///
///
public static List DataTableToList(DataTable dt)
{
List list = new List();
DateTime date= Convert.ToDateTime("1900-01-01");
foreach (DataRow dr in dt.Rows)
{
T obj = Activator.CreateInstance();
PropertyInfo[] propertys = obj.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
string tempName = pi.Name;
if (dt.Columns.Contains(tempName) && pi.CanWrite)
{
object value = dr[tempName];
if (value != DBNull.Value)
{
try
{
if (pi.PropertyType.FullName.Contains("System.String"))
{
pi.SetValue(obj, value, null);
}
else if (pi.PropertyType.FullName.Contains("System.Int32"))
{
int ivalue = 0;
int.TryParse(value.ToString(), out ivalue);
pi.SetValue(obj, ivalue, null);
}
else if (pi.PropertyType.FullName.Contains("System.Int16"))
{
short ivalue = 0;
short.TryParse(value.ToString(), out ivalue);
pi.SetValue(obj, ivalue, null);
}
else if (pi.PropertyType.FullName.Contains("System.Decimal"))
{
decimal ivalue = 0;
decimal.TryParse(value.ToString(), out ivalue);
pi.SetValue(obj, ivalue, null);
}
else if (pi.PropertyType.FullName.Contains("System.Double"))
{
double ivalue = 0;
double.TryParse(value.ToString(), out ivalue);
pi.SetValue(obj, ivalue, null);
}
else if (pi.PropertyType.FullName.Contains("System.DateTime"))
{
DateTime ivalue = date;
DateTime.TryParse(value.ToString(), out ivalue);
pi.SetValue(obj, ivalue, null);
}
else
{
pi.SetValue(obj, value, null);
}
}
catch{ }
}
}
}
list.Add(obj);
}
return list;
}
///
/// DataTable高效转化成List
///
///
///
/// 时间格式化字段参数类型("属性字段",("原格式","新的格式"))
/// 使用参考:var formatlist = new Dictionary[string,KeyValueModel]();
/// formatlist.Add("字段", new KeyValueModel() { Key = "yyyyMMdd", Value = "yyyy-MM-dd HH:mm" });
///
///
public static List TableToList(DataTable dt,Dictionary formatList=null)
{
List list = new List();
string strJson = JsonHelper.DataTableToJson(dt, formatList);
list = JsonConvert.DeserializeObject>(strJson);
return list;
}
///
/// DataTable 转化成xml
///
///
///
public static string DataTableToXML(DataTable dt)
{
if (dt != null)
{
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
new XmlSerializer(typeof(DataTable)).Serialize(writer, dt);
writer.Close();
return sb.ToString();
}
return string.Empty;
}
///
/// 比较对象是否一致
///
///
///
///
///
private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
{
for (int i = 0; i < fieldNames.Length; i++)
{
if (!((lastValues[i] != null) && lastValues[i].Equals(currentRow[fieldNames[i]])))
{
return false;
}
}
return true;
}
///
/// 克隆DataTable
///
/// DataTable
/// 查询条件
///
public static DataTable GetNewDataTable(DataTable dt, string condition)
{
if (IsExistRows(dt))
{
if (condition.Trim() == "")
{
return dt;
}
DataTable newdt = new DataTable();
newdt = dt.Clone();
DataRow[] dr = dt.Select(condition);
for (int i = 0; i < dr.Length; i++)
{
newdt.ImportRow(dr[i]);
}
return newdt;
}
return null;
}
///
/// DataTable 分页
///
/// DataTable
/// 当前页
/// 页码
///
public static DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
{
return dt;
}
DataTable newdt = dt.Copy();
newdt.Clear();
int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;
if (rowbegin < dt.Rows.Count)
{
if (rowend > dt.Rows.Count)
{
rowend = dt.Rows.Count;
}
for (int i = rowbegin; i <= (rowend - 1); i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
}
}
return newdt;
}
///
/// 判断DataTable是否有数据
///
///
///
public static bool IsExistRows(DataTable dt)
{
return ((dt != null) && (dt.Rows.Count > 0));
}
///
/// DataTable数据去重
///
///
///
///
public static DataTable SelectDistinct(DataTable SourceTable, string[] FieldNames)
{
if ((FieldNames == null) || (FieldNames.Length == 0))
{
throw new ArgumentNullException("FieldNames");
}
object[] lastValues = new object[FieldNames.Length];
DataTable newTable = new DataTable();
foreach (string fieldName in FieldNames)
{
newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);
}
DataRow[] orderedRows = SourceTable.Select("", string.Join(",", FieldNames));
foreach (DataRow row in orderedRows)
{
if (!fieldValuesAreEqual(lastValues, row, FieldNames))
{
newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));
setLastValues(lastValues, row, FieldNames);
}
}
return newTable;
}
///
/// DataTable赋值
///
///
///
///
private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
{
for (int i = 0; i < fieldNames.Length; i++)
{
lastValues[i] = sourceRow[fieldNames[i]];
}
}
///
/// DataTable排序
///
///
///
///
public static DataTable SortedTable(DataTable dt, params string[] sorts)
{
if (dt.Rows.Count > 0)
{
string tmp = "";
for (int i = 0; i < sorts.Length; i++)
{
tmp = tmp + sorts[i] + ",";
}
dt.DefaultView.Sort = tmp.TrimEnd(new char[] { ',' });
}
return dt;
}
///
/// 根据枚举转化对应的DataTable
///
public static void DataTableTanslate(DataTable dataTable, Dictionary> dictionary)
{
if (dictionary == null)
{
return;
}
string str = "_" + Guid.NewGuid().ToString().Substring(0, 10).Replace("-", "_");
foreach (DataRow dataRow in dataTable.Rows)
{
foreach (string current in dictionary.Keys)
{
if (dataTable.Columns.IndexOf(current) >= 0)
{
if (dataTable.Columns.IndexOf(current + str) < 0)
{
dataTable.Columns[current].ColumnName = current + str;
dataTable.Columns.Add(current, typeof(string));
}
string text = "";
if (dictionary[current].TryGetValue(dataRow[current + str].ToString(), out text))
{
dataRow[current] = text;
}
else
{
string[] array = dataRow[current + str].ToString().Split(new char[]
{
','
});
if (array.Length > 1)
{
for (int i = 0; i < array.Length; i++)
{
if (dictionary[current].TryGetValue(array[i].ToString(), out text))
{
array[i] = text;
}
}
}
dataRow[current] = string.Join(",", array);
}
}
}
}
}
///
/// DataRow转DataTable
///
///
///
public static DataTable ToDataTable(DataRow[] rows)
{
if (rows == null || rows.Length == 0) return null;
DataTable tmp = rows[0].Table.Clone(); // 复制DataRow的表结构
foreach (DataRow row in rows)
tmp.Rows.Add(row.ItemArray); // 将DataRow添加到DataTable中
return tmp;
}
#region 方法 -> List转换 DataTable
///
/// List转DataTable
///
///
///
///
public static DataTable ListToDataTable(List items)
{
var tb = new DataTable(typeof(T).Name);
System.Reflection.PropertyInfo[] props = typeof(T).GetProperties(
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach (System.Reflection.PropertyInfo prop in props)
{
Type t = GetCoreType(prop.PropertyType);
tb.Columns.Add(prop.Name, t);
}
foreach (T item in items)
{
var values = new object[props.Length];
for (int i = 0; i < props.Length; i++)
{
try
{
values[i] = props[i].GetValue(item, null);
}
catch (Exception ex)
{
SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex);
}
}
tb.Rows.Add(values);
}
return tb;
}
///
/// 获取数据类型
///
///
///
public static Type GetCoreType(Type t)
{
if (t != null && IsNullable(t))
{
if (!t.IsValueType)
{
return t;
}
else
{
return Nullable.GetUnderlyingType(t);
}
}
else
{
return t;
}
}
///
/// 判断是否为空值
///
///
///
public static bool IsNullable(Type t)
{
return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
}
#endregion
}
}