public static List<T> GetColumnValues<T>(DataTable dtSource, string filedName) { return (from r in dtSource.AsEnumerable() select r.Field<T>(filedName)).ToList<T>(); }
獲取table某一列的數據轉換成listthis
List<AHPResult> AHPResult = DatableToList<AHPResult>(dResulttable,year.ToString()); public static List<T> DatableToList<T>(DataTable dt,string Time) where T : class, new() { Type type = typeof(T); List<T> oblist = new List<T>(); string tempName = string.Empty; foreach (DataRow row in dt.Rows) { T t = new T(); PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = (pi.GetCustomAttributes(false)[0] as Property).Value; if (dt.Columns.Contains(tempName)) { if (!pi.CanWrite) continue;//該屬性不可寫,直接跳出 object value = row[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } if(tempName=="時間") { pi.SetValue(t, Time+"年", null); } } oblist.Add(t); } return oblist; }
public class AHPResult { // public string AreaCode { get; set; } [Property("時間")] public string Time { get; set; } [Property("評價目標")] public string Area { get; set; } [Property("綜合得分")] public string IndicatorData { get; set; } [Property("排名")] public string Rank { get; set; } } class Property : System.Attribute { public string Value { get; set; } public Property(string Value) { this.Value = Value; } }
將table轉換成統一的List<Model> 列名和屬性名映射。spa
using System.Text; using System.IO; using NPOI.SS.UserModel; //NPOI using NPOI.HSSF.Util; //NPOI using NPOI.HSSF.UserModel; //NPOI using NPOI.XSSF.UserModel; //NPOI using System.Data; namespace LNERI_P2_WebApi.Common { public class ExcelHelper { public static DataTable ExcelSheetImportToDataTable(string filePath) { DataTable dt = new DataTable(); IWorkbook hssfworkbook; if (Path.GetExtension(filePath).ToLower() == ".xls".ToLower()) {//.xls #region .xls文件處理:HSSFWorkbook try { using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { hssfworkbook = new HSSFWorkbook(file); } } catch (Exception e) { LogHelper.Debug(e.InnerException + e.Message + e.Source + e.StackTrace + e.TargetSite); throw e; } ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); HSSFRow headerRow = (HSSFRow)sheet.GetRow(0); //一行最後一個方格的編號 即總的列數 for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) { //SET EVERY COLUMN NAME HSSFCell cell = (HSSFCell)headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } while (rows.MoveNext()) { IRow row = (HSSFRow)rows.Current; DataRow dr = dt.NewRow(); if (row.RowNum == 0) continue;//The firt row is title,no need import if (row == null) { continue; } bool insert = true; for (int i = 0; i < row.LastCellNum; i++) { if (i >= dt.Columns.Count)//cell count>column count,then break //每條記錄的單元格數量不能大於表格欄位數量 20140213 { insert = false; break; } if (row.LastCellNum != 6) { insert = false; break; } ICell cell = row.GetCell(i); if ((i == 0) && (string.IsNullOrEmpty(cell.ToString()) == true))//每行第一個cell爲空,break { insert = false; break; } if (cell == null) { dr[i] = null; } else { if (i == 0 && cell.CellType == CellType.Numeric) { dr[i] = cell.DateCellValue.Date.ToLongDateString(); } else { dr[i] = cell.ToString(); } } } if (insert == true) { dt.Rows.Add(dr); } } #endregion } else {//.xlsx #region .xlsx文件處理:XSSFWorkbook try { using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { hssfworkbook = new XSSFWorkbook(file); } } catch (Exception e) { LogHelper.Debug(e.InnerException + e.Message + e.Source + e.StackTrace + e.TargetSite); throw e; } ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); XSSFRow headerRow = (XSSFRow)sheet.GetRow(0); //一行最後一個方格的編號 即總的列數 for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) { //SET EVERY COLUMN NAME XSSFCell cell = (XSSFCell)headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } while (rows.MoveNext()) { IRow row = (XSSFRow)rows.Current; DataRow dr = dt.NewRow(); if (row.RowNum == 0) continue;//The firt row is title,no need import for (int i = 0; i < row.LastCellNum; i++) { if (i >= dt.Columns.Count)//cell count>column count,then break //每條記錄的單元格數量不能大於表格欄位數量 20140213 { break; } ICell cell = row.GetCell(i); if ((i == 0) && (string.IsNullOrEmpty(cell.ToString()) == true))//每行第一個cell爲空,break { break; } if (cell == null) { dr[i] = null; } else { dr[i] = cell.ToString(); } } dt.Rows.Add(dr); } #endregion } return dt; } public static DataTable ExcelToDataTable(string filePath, bool isColumnName) { DataTable dataTable = null; FileStream fs = null; DataColumn column = null; DataRow dataRow = null; IWorkbook workbook = null; ISheet sheet = null; IRow row = null; ICell cell = null; int startRow = 0; // LogHelper.Debug(filePath); try { using (fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { // 2007版本 if (filePath.IndexOf(".xlsx") > 0) { workbook = new XSSFWorkbook(fs); } // 2003版本 else if (filePath.IndexOf(".xls") > 0) { workbook = new HSSFWorkbook(fs); } if (workbook != null) { sheet = workbook.GetSheetAt(0);//讀取第一個sheet,固然也能夠循環讀取每一個sheet dataTable = new DataTable(); if (sheet != null) { int rowCount = sheet.LastRowNum;//總行數 if (rowCount > 0) { IRow firstRow = sheet.GetRow(0);//第一行 int cellCount = firstRow.LastCellNum;//列數 //構建datatable的列 if (isColumnName) { startRow = 1;//若是第一行是列名,則從第二行開始讀取 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { cell = firstRow.GetCell(i); if (cell != null) { if (cell.StringCellValue != null) { column = new DataColumn(cell.StringCellValue); dataTable.Columns.Add(column); } } } } else { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { column = new DataColumn("column" + (i + 1)); dataTable.Columns.Add(column); } } //填充行 for (int i = startRow; i <= rowCount; ++i) { row = sheet.GetRow(i); if (row == null) continue; dataRow = dataTable.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { cell = row.GetCell(j); if (cell == null) { dataRow[j] = ""; } else { //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,) switch (cell.CellType) { case CellType.Blank: dataRow[j] = ""; break; case CellType.Numeric: short format = cell.CellStyle.DataFormat; //對時間格式(2015.12.五、2015/12/五、2015-12-5等)的處理 if (format == 14 || format == 31 || format == 57 || format == 58) dataRow[j] = cell.DateCellValue; else dataRow[j] = cell.NumericCellValue; break; case CellType.String: dataRow[j] = cell.StringCellValue; break; } } } dataTable.Rows.Add(dataRow); } } } } } return dataTable; } catch (Exception ex) { LogHelper.Debug("err:ExcelHelper.ExcelToDataTable" + ex.InnerException + ex.Message + ex.Source + ex.StackTrace + ex.TargetSite); if (fs != null) { fs.Close(); } return null; } } } }
讀取excel文件成DataTable。excel