首页 > 代码库 > NPOI对Excel的操作(Sheet转DataTable、List<T>)
NPOI对Excel的操作(Sheet转DataTable、List<T>)
通过NPOI对Excel进行操作,这里主要是读取的操作。封装到ExcelHelper操作类中。
1 using System.Collections.Generic; 2 using NPOI.HSSF.UserModel; 3 using NPOI.SS.UserModel; 4 using NPOI.XSSF.UserModel; 5 using System.IO; 6 using System.Data; 7 using System; 8 9 namespace CommonHelper 10 { 11 public class ExcelHelper 12 { 13 14 public ExcelHelper() { } 15 16 /// <summary> 17 /// 文件流初始化对象 18 /// </summary> 19 /// <param name="stream"></param> 20 public ExcelHelper(Stream stream) 21 { 22 _IWorkbook = CreateWorkbook(stream); 23 } 24 25 /// <summary> 26 /// 传入文件名 27 /// </summary> 28 /// <param name="fileName"></param> 29 public ExcelHelper(string fileName) 30 { 31 using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 32 { 33 _IWorkbook = CreateWorkbook(fileStream); 34 } 35 } 36 37 /// <summary> 38 /// 工作薄 39 /// </summary> 40 private IWorkbook _IWorkbook; 41 42 /// <summary> 43 /// 创建工作簿对象 44 /// </summary> 45 /// <param name="stream"></param> 46 /// <returns></returns> 47 private IWorkbook CreateWorkbook(Stream stream) 48 { 49 try 50 { 51 return new XSSFWorkbook(stream); //07 52 } 53 catch 54 { 55 return new HSSFWorkbook(stream); //03 56 } 57 58 } 59 60 /// <summary> 61 /// 把Sheet中的数据转换为DataTable 62 /// </summary> 63 /// <param name="sheet"></param> 64 /// <returns></returns> 65 private DataTable ExportToDataTable(ISheet sheet) 66 { 67 DataTable dt = new DataTable(); 68 69 //默认,第一行是字段 70 IRow headRow = sheet.GetRow(0); 71 72 //设置datatable字段 73 for (int i = headRow.FirstCellNum, len = headRow.LastCellNum; i < len; i++) 74 { 75 dt.Columns.Add(headRow.Cells[i].StringCellValue); 76 } 77 //遍历数据行 78 for (int i = (sheet.FirstRowNum + 1), len = sheet.LastRowNum + 1; i < len; i++) 79 { 80 IRow tempRow = sheet.GetRow(i); 81 DataRow dataRow = dt.NewRow(); 82 83 //遍历一行的每一个单元格 84 for (int r = 0, j = tempRow.FirstCellNum, len2 = tempRow.LastCellNum; j < len2; j++, r++) 85 { 86 87 ICell cell = tempRow.GetCell(j); 88 89 if (cell != null) 90 { 91 switch (cell.CellType) 92 { 93 case CellType.STRING: 94 dataRow[r] = cell.StringCellValue; 95 break; 96 case CellType.NUMERIC: 97 dataRow[r] = cell.NumericCellValue; 98 break; 99 case CellType.BOOLEAN:100 dataRow[r] = cell.BooleanCellValue;101 break;102 default: dataRow[r] = "ERROR";103 break;104 }105 }106 }107 dt.Rows.Add(dataRow);108 }109 return dt;110 }111 112 /// <summary>113 /// Sheet中的数据转换为List集合114 /// </summary>115 /// <param name="sheet"></param>116 /// <param name="fields"></param>117 /// <returns></returns>118 private IList<T> ExportToList<T>(ISheet sheet,string[] fields) where T:class,new()119 {120 IList<T> list = new List<T>();121 122 //遍历每一行数据123 for (int i = sheet.FirstRowNum + 1, len = sheet.LastRowNum + 1; i < len; i++) 124 {125 T t=new T();126 IRow row = sheet.GetRow(i);127 128 for (int j = 0, len2 = fields.Length; j < len2; j++)129 {130 ICell cell=row.GetCell(j);131 object cellValue= http://www.mamicode.com/null;"";146 break;147 default: cellValue = "http://www.mamicode.com/ERROR";148 break;149 }150 151 typeof(T).GetProperty(fields[j]).SetValue(t,cellValue,null);152 }153 list.Add(t);154 }155 156 return list;157 }158 159 /// <summary>160 /// 获取第一个Sheet的第X行,第Y列的值。起始点为1161 /// </summary>162 /// <param name="X">行</param>163 /// <param name="Y">列</param>164 /// <returns></returns>165 public string GetCellValue(int X, int Y) 166 {167 ISheet sheet = _IWorkbook.GetSheetAt(0);168 169 IRow row = sheet.GetRow(X-1);170 171 return row.GetCell(Y-1).ToString();172 }173 174 /// <summary>175 /// 获取一行的所有数据176 /// </summary>177 /// <param name="X">第x行</param>178 /// <returns></returns>179 public string[] GetCells(int X) 180 {181 List<string> list = new List<string>();182 183 ISheet sheet = _IWorkbook.GetSheetAt(0);184 185 IRow row = sheet.GetRow(X-1);186 187 for (int i = 0, len = row.LastCellNum; i < len; i++) 188 {189 list.Add(row.GetCell(i).StringCellValue);//这里没有考虑数据格式转换,会出现bug190 }191 return list.ToArray();192 }193 194 /// <summary>195 /// 第一个Sheet数据,转换为DataTable196 /// </summary>197 /// <returns></returns>198 public DataTable ExportExcelToDataTable() 199 {200 return ExportToDataTable(_IWorkbook.GetSheetAt(0));201 }202 203 /// <summary>204 /// 第sheetIndex表数据,转换为DataTable205 /// </summary>206 /// <param name="sheetIndex">第几个Sheet,从1开始</param>207 /// <returns></returns>208 public DataTable ExportExcelToDataTable(int sheetIndex) 209 {210 return ExportToDataTable(_IWorkbook.GetSheetAt(sheetIndex-1));211 }212 213 214 /// <summary>215 /// Excel中默认第一张Sheet导出到集合216 /// </summary>217 /// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>218 /// <returns></returns>219 public IList<T> ExcelToList<T>(string[] fields) where T:class,new ()220 {221 return ExportToList<T>(_IWorkbook.GetSheetAt(0),fields);222 }223 224 /// <summary>225 /// Excel中指定的Sheet导出到集合226 /// </summary>227 /// <param name="sheetIndex">第几张Sheet,从1开始</param>228 /// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>229 /// <returns></returns>230 public IList<T> ExcelToList<T>(int sheetIndex,string[] fields) where T:class,new()231 {232 return ExportToList<T>(_IWorkbook.GetSheetAt(sheetIndex-1), fields);233 }234 235 }236 }
NPOI对Excel的操作(Sheet转DataTable、List<T>)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。