.NET小笔记-NPOI读取excel内容到DataTable
下载比较新的NPOI组件支持excel2007以上的,把.dll添加引用
引入命名空间
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
直接调用下面方法,把excel内容转为DataTable
/// <summary> /// 获取excel内容 /// </summary> /// <param name="filePath">excel文件路径</param> /// <returns></returns> public static DataTable ImportExcel(string filePath) { DataTable dt = new DataTable(); using (FileStream fsRead = System.IO.File.OpenRead(filePath)) { IWorkbook wk = null; //获取后缀名 string extension = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower(); //判断是否是excel文件 if (extension == ".xlsx" || extension == ".xls") { //判断excel的版本 if (extension== ".xlsx") { wk = new XSSFWorkbook(fsRead); } else { wk = new HSSFWorkbook(fsRead); } //获取第一个sheet ISheet sheet = wk.GetSheetAt(0); //获取第一行 IRow headrow=sheet.GetRow(0); //创建列 for (int i = headrow.FirstCellNum; i < headrow.Cells.Count; i++) { // DataColumn datacolum = new DataColumn(headrow.GetCell(i).StringCellValue); DataColumn datacolum = new DataColumn("F"+(i+1)); dt.Columns.Add(datacolum); } //读取每行,从第二行起 for (int r = 1; r <= sheet.LastRowNum; r++) { bool result = false; DataRow dr = dt.NewRow(); //获取当前行 IRow row = sheet.GetRow(r); //读取每列 for (int j = 0; j < row.Cells.Count; j++) { ICell cell = row.GetCell(j); //一个单元格 dr[j] = GetCellValue(cell); //获取单元格的值 //全为空则不取 if (dr[j].ToString() != "") { result = true; } } if (result == true) { dt.Rows.Add(dr); //把每行追加到DataTable } } } } return dt; }
//对单元格进行判断取值 private static string GetCellValue(ICell cell) { if (cell == null) return string.Empty; switch (cell.CellType) { case CellType.Blank: //空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写) return string.Empty; case CellType.Boolean: //bool类型 return cell.BooleanCellValue.ToString(); case CellType.Error: return cell.ErrorCellValue.ToString(); case CellType.Numeric: //数字类型 if(HSSFDateUtil.IsCellDateFormatted(cell))//日期类型 { return cell.DateCellValue.ToString(); } else //其它数字 { return cell.NumericCellValue.ToString (); } case CellType.Unknown: //无法识别类型 default: //默认类型 return cell.ToString();// case CellType.String: //string 类型 return cell.StringCellValue; case CellType.Formula: //带公式类型 try { HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook); e.EvaluateInCell(cell); return cell.ToString(); } catch { return cell.NumericCellValue.ToString(); } } }
测试例子
我把一个名为aaa.xlsx的excel放根目录下,内容为
其中 C4是公式,其它的正常
执行代码
string filePath = Server.MapPath("~/aaa.xlsx");
DataTable dt = new DataTable();
if (File.Exists(filePath))
{
dt = ImportExcel(filePath);
}
然后打断点监测一下dt ,内容为
分类:
.net
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构