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 } }