在ASP.NET开发中高效读取Excel数据常见三种方法:使用OleDb连接字符串直接查询、借助EPPlus开源库解析或通过NPOI组件处理,下面通过完整代码示例详解实现方案。

OleDb连接器(适合简单数据提取)
原理:将Excel文件视为数据库,通过ADO.NET执行SQL查询
// 连接字符串需区分Excel版本
string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES'";
using (OleDbConnection conn = new OleDbConnection(string.Format(connStr, filePath)))
{
// 查询Sheet1工作表
OleDbDataAdapter da = new OleDbDataAdapter("SELECT FROM [Sheet1$]", conn);
DataTable dt = new DataTable();
da.Fill(dt); // 数据加载到DataTable
// 遍历数据行
foreach (DataRow row in dt.Rows)
{
Console.WriteLine(row["ProductName"] + " | " + row["Price"]);
}
}
适用场景:
- 快速读取标准格式的xls/xlsx文件
- 无需处理复杂单元格格式
- 开发环境已安装Access Database Engine
EPPlus库(推荐处理xlsx格式)
优势:无需Office依赖,支持公式计算与高级样式

// 通过NuGet安装EPPlus
using (ExcelPackage package = new ExcelPackage(new FileStream(filePath, FileMode.Open)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
// 从第2行开始读取(跳过标题)
for (int row = 2; row <= rowCount; row++)
{
string id = worksheet.Cells[row, 1].GetValue<string>();
DateTime orderDate = worksheet.Cells[row, 2].GetValue<DateTime>();
// 处理合并单元格
if(worksheet.Cells[row,3].Merge)
{
string mergedValue = worksheet.MergedCells[row,3].First().Value.ToString();
}
}
}
性能优化技巧:
// 禁用公式计算提升读取速度 package.Workbook.Calculate(); package.Workbook.CalcMode = ExcelCalcMode.Manual;
NPOI组件(最佳跨平台方案)
核心价值:同时支持.xls和.xlsx,兼容Linux环境
// NuGet安装NPOI
IWorkbook workbook;
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
workbook = Path.GetExtension(filePath).ToLower() == ".xls"
? new HSSFWorkbook(fs) // 处理xls
: new XSSFWorkbook(fs); // 处理xlsx
}
ISheet sheet = workbook.GetSheetAt(0);
for (int rowIdx = 0; rowIdx <= sheet.LastRowNum; rowIdx++)
{
IRow row = sheet.GetRow(rowIdx);
if (row == null) continue;
// 获取单元格值(自动识别类型)
ICell cell = row.GetCell(0);
string cellValue = cell?.ToString() ?? string.Empty;
// 处理日期格式
if (cell.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(cell))
{
DateTime dateValue = cell.DateCellValue;
}
}
内存管理关键:

// 使用事件驱动模式处理超大文件
public void ProcessLargeExcel(string path)
{
using (var fs = new FileStream(path, FileMode.Open))
{
IExcelDataReader reader = ExcelReaderFactory.CreateReader(fs);
while (reader.Read()) // 逐行流式读取
{
// 实时处理单行数据
}
}
}
方案选型指南
| 特性 | OleDb | EPPlus | NPOI |
|---|---|---|---|
| 文件格式支持 | xls/xlsx | 仅xlsx | xls/xlsx |
| 外部依赖 | 需ACE驱动 | 无 | 无 |
| 内存消耗 | 中等 | 低 | 可流式处理 |
| 样式/公式支持 | 基础 | 完整 | 完整 |
| 跨平台能力 | Windows only | 跨平台 | 跨平台 |
决策建议:
- 需处理旧版
.xls→ 选择NPOI - 服务端无Office环境 → 排除OleDb
- 100MB+超大文件 → 采用NPOI事件流模式
- 需生成复杂报表 → EPPlus为首选
避坑提示:使用EPPlus时需注意GPL许可证限制,商业项目建议购买商业授权,NPOI的
GetCell()方法可能返回null,务必做空值防御。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/16259.html
评论列表(3条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于使用的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
读了这篇文章,我深有感触。作者对使用的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
读了这篇文章,我深有感触。作者对使用的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!