C#使用NPOI读写Excel:安装、读取与写入操作指南

Elena
Elena
发布时间:2026-10-16 | 5人浏览过
原创

在C#开发中处理Excel文件常遇到环境依赖问题,NPOI是一个轻量级且无需安装Microsoft Office的解决方案。本文介绍如何在Visual Studio中配置NPOI库,并提供读取Excel数据及修改保存文件的C#代码示例。

结果与目标

通过集成NPOI库,C#应用程序能够直接解析.xls和.xlsx文件,实现单元格的读取、数据修改及文件重新保存,而无需依赖系统安装的Excel软件。

准备条件

  • 已安装Visual Studio或其他支持C#的开发环境。
  • 目标项目为.NET Framework或.NET Core/5+。
  • 待操作的Excel文件路径已知。

第1步:添加NPOI库引用

目的:引入必要的动态链接库以支持Excel文件操作。

入口:Visual Studio解决方案资源管理器。

动作:

  1. 在项目上右键点击,选择“管理 NuGet 程序包”。
  2. 在浏览标签页搜索 NPOI。
  3. 点击安装最新版 NPOI 及其依赖项。

完成状态:项目中包含对 NPOI、Apache.Commons 等库的引用。

真实操作顺序

第2步:读取Excel文件内容

目的:遍历工作簿中的每个Sheet、Row和Cell,提取数据。

入口:C#类文件或后端服务逻辑。

动作:

  1. 声明 IWorkbook 和 FileStream 实例。
  2. 使用 File.OpenRead(path) 打开文件流。
  3. 将文件流传递给 XSSFWorkbook 构造函数。
  4. 通过 wk.NumberOfSheets 循环获取所有Sheet。
  5. 针对每个Sheet,通过 LastRowNum 确定行数,逐行获取 IRow。
  6. 每行内通过 LastCellNum 确定列数,获取 ICell 并转换为字符串。

重要参数:注意处理 null 值的Sheet或Row,避免空引用异常。

关键代码示例:

private IWorkbook wk;
private FileStream fs;
private void OpenExcel(string path)
{
    StringBuilder sbr = new StringBuilder();
    try
    {
        using (fs = File.OpenRead(path)) // 打开Excel文件
        {
            wk = new XSSFWorkbook(fs); // 初始化工作簿

            for (int i = 0; i < wk.NumberOfSheets; i++) // 遍历所有Sheet
            {
                ISheet sheet = wk.GetSheetAt(i);

                for (int j = 0; j <= sheet.LastRowNum; j++) // 遍历行
                {
                    IRow row = sheet.GetRow(j);
                    if (row != null)
                    {
                        sbr.AppendLine("-------------------------------------\r\n");
                        for (int k = 0; k <= row.LastCellNum; k++) // 遍历单元格
                        {
                            ICell cell = row.GetCell(k);
                            if (cell != null)
                            {
                                sbr.Append(cell.ToString()); // 获取单元格内容
                            }
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        // 建议在生产环境中记录详细日志而非仅显示MessageBox
        MessageBox.Show($"文件被占用或格式错误: {ex.Message}");
    }
}

第3步:修改单元格数值

目的:更新指定行列位置的单元格内容。

入口:已加载的 ISheet 对象。

动作:

  1. 定位目标行: sheet.GetRow(row)。
  2. 定位目标单元格: ...GetCell(column)。
  3. 调用 SetCellValue(value) 设置新值。

关键代码示例:

private void SetCellValue(ISheet sheet, int row, int column, string value)
{
    // 确保行存在
    IRow tmpRow = sheet.GetRow(row) ?? sheet.CreateRow(row);
    ICell tmpCell = tmpRow.GetCell(column) ?? tmpRow.CreateCell(column);
    
    // 设置文本类型值
    tmpCell.SetCellValue(value);
}

注意:如果目标行或列不存在,建议先创建再赋值,以确保代码鲁棒性。

第4步:保存修改后的文件

目的:将内存中修改后的工作簿写回磁盘。

入口:包含修改内容的 IWorkbook 实例。

动作:

  1. 使用 File.Create(path) 创建输出流。
  2. 调用 wk.Write(fs) 将数据写入流。
  3. 关闭并释放文件流。

风险提醒:保存前请确保用户已备份原文件,因为此操作会覆盖原有数据。

关键代码示例:

private void SaveExcel(string path)
{
    using (FileStream fs2 = File.Create(path))
    {
        wk.Write(fs2);
    }
    MessageBox.Show("文件修改成功!!!");
}

简要总结

NPOI提供了无需依赖Office即可处理Excel的强大能力。通过理解Workbook、Sheet、Row、Cell四个层级的API调用,可以灵活地实现数据的读取与写入。在实际应用中,建议补充对空单元格的判断及文件流的正确释放,以提升程序的稳定性。

以上就是C#使用NPOI库读写Excel文件的详细内容,更多关于C# Excel开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表