推荐使用NPOI操作Excel,它是Apache POI的.NET移植版,免费开源、无需Office,支持.xls与.xlsx格式;通过XSSFWorkbook/HSSFWorkbook读取工作表,遍历IRow与ICell获取数据,注意判断CellType避免异常。

用C#操作Excel文件,推荐使用NPOI——它是Apache POI的.NET移植版,免费、开源、无需安装Office,支持.xls(Excel 97-2003)和.xlsx(Excel 2007+)格式,读写稳定,适合后台服务和批量处理。
安装NPOI NuGet包
在Visual Studio中右键项目 → “管理NuGet程序包” → 搜索并安装:
• NPOI(主包,含xls/xlsx支持)
• 可选:NPOI.Extension(提供更简洁的辅助方法,如自动类型转换)
读取Excel文件(.xlsx为例)
核心是XSSFWorkbook(xlsx)或HSSFWorkbook(xls),通过工作表(ISheet)和行(IRow)、单元格(ICell)逐级访问:
- 用
FileStream打开文件,构造XSSFWorkbook - 用
GetSheetAt(0)或GetSheet("Sheet1")获取工作表 - 遍历行(
sheet.LastRowNum + 1为总行数),跳过空行 - 对每个单元格调用
cell.ToString()或cell.StringCellValue/cell.NumericCellValue,注意先判断cell.CellType避免异常
示例:读取首列姓名(假设第0行为标题,数据从第1行开始)
var fs = new FileStream("data.xlsx", FileMode.Open);var wb = new XSSFWorkbook(fs);
var sheet = wb.GetSheetAt(0);
for (int i = 1; i var row = sheet.GetRow(i);
if (row == null) continue;
var cell = row.GetCell(0);
if (cell != null && cell.CellType == CellType.String) {
Console.WriteLine(cell.StringCellValue);
}
}
fs.Close(); wb.Close();
写入Excel文件(生成新.xlsx)
创建空白工作簿→添加工作表→创建行与单元格→设置值和样式→保存到文件流:
- 用
new XSSFWorkbook()新建工作簿 -
workbook.CreateSheet("数据表")添加工作表 -
sheet.CreateRow(0)创建第0行,再用row.CreateCell(0)创建单元格 - 对单元格调用
SetCellValue("文本")或SetCellValue(123.45) - 最后用
FileStream写入磁盘(注意用FileMode.Create)
小技巧:可预先创建CellStyle(如加粗、居中、日期格式)并复用,提升性能。
常见问题与注意点
• 中文乱码? NPOI默认UTF-8,只要源文件编码正常、控制台/IDE支持Unicode,一般不会乱码;若导出CSV需手动指定编码。
• 日期读出来是数字? Excel内部用浮点数存日期,需用cell.DateCellValue获取DateTime对象,或用cell.ToString()直接得格式化字符串。
• 大文件卡顿? 避免一次性加载全部数据;可考虑SAX模式(XSSFReader)流式读取,但仅支持xlsx且不支持写入。
• 公式计算? NPOI默认不自动重算公式,可用workbook.GetCreationHelper().CreateFormulaEvaluator().Evaluate(cell)手动求值。
基本上就这些。NPOI上手快,文档全,GitHub上有大量示例。只要避开空单元格和类型误判,读写Excel很稳。






