第一章:NPOI概述与入门

1.1 NPOI简介

1.1.1 什么是NPOI

NPOI是一个强大的.NET库,用于读取、写入和操作Microsoft Office文件(Excel、Word、PowerPoint),无需安装Microsoft Office软件。它是Apache POI项目的.NET移植版本,完全开源免费,广泛应用于企业级应用开发中。

NPOI的名称来源于:

  • N - 代表.NET平台
  • POI - 源自Apache POI(Poor Obfuscation Implementation)

1.1.2 NPOI的发展历程

2008年 - NPOI项目启动,由Tony Qu(屈喆)创建
   ↓
2010年 - 支持Excel 2007格式(.xlsx)
   ↓
2012年 - 支持Word文档(.docx)
   ↓
2015年 - 支持PowerPoint(.pptx)
   ↓
2020年 - 全面支持.NET Core和.NET 5
   ↓
2024年 - 支持.NET 6/7/8,持续活跃开发中

1.1.3 NPOI的核心优势

  1. 无需安装Office:服务器端处理文档无需安装Microsoft Office
  2. 完全免费开源:Apache 2.0许可证,商业项目可免费使用
  3. 跨平台支持:支持Windows、Linux、macOS
  4. 高性能:内存占用低,处理速度快
  5. 功能完整:支持Excel、Word、PowerPoint的主要功能
  6. 活跃维护:GitHub上持续更新,社区活跃

1.2 支持的文件格式

1.2.1 Excel文件格式

格式 扩展名 说明 NPOI类
Excel 97-2003 .xls 二进制格式(BIFF8) HSSFWorkbook
Excel 2007+ .xlsx OpenXML格式 XSSFWorkbook
Excel 流式写入 .xlsx 大数据量优化 SXSSFWorkbook

1.2.2 Word文件格式

格式 扩展名 说明 NPOI类
Word 2007+ .docx OpenXML格式 XWPFDocument
Word 97-2003 .doc 二进制格式 HWPFDocument(有限支持)

1.2.3 PowerPoint文件格式

格式 扩展名 说明 NPOI类
PowerPoint 2007+ .pptx OpenXML格式 XMLSlideShow
PowerPoint 97-2003 .ppt 二进制格式 HSLFSlideShow

1.3 NPOI架构概览

1.3.1 核心命名空间

NPOI
├── NPOI.SS.UserModel          # 电子表格抽象接口
├── NPOI.HSSF.UserModel        # Excel 97-2003 (.xls)
├── NPOI.XSSF.UserModel        # Excel 2007+ (.xlsx)
├── NPOI.XWPF.UserModel        # Word 2007+ (.docx)
├── NPOI.HWPF.UserModel        # Word 97-2003 (.doc)
├── NPOI.XSLF.UserModel        # PowerPoint 2007+ (.pptx)
├── NPOI.HSLF.UserModel        # PowerPoint 97-2003 (.ppt)
├── NPOI.SS.Util               # 电子表格工具类
└── NPOI.Util                  # 通用工具类

1.3.2 接口与实现的关系

NPOI采用接口抽象设计,使得代码可以在不同格式间复用:

// 统一接口
IWorkbook workbook;        // 工作簿接口
ISheet sheet;              // 工作表接口
IRow row;                  // 行接口
ICell cell;                // 单元格接口

// .xls格式实现
workbook = new HSSFWorkbook();

// .xlsx格式实现
workbook = new XSSFWorkbook();

// 相同的操作代码
ISheet sheet = workbook.CreateSheet("Sheet1");
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
cell.SetCellValue("Hello NPOI!");

1.3.3 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                         应用程序代码                             │
├─────────────────────────────────────────────────────────────────┤
│                      NPOI 抽象接口层                             │
│   IWorkbook  │  ISheet  │  IRow  │  ICell  │  ICellStyle       │
├─────────────────────────────────────────────────────────────────┤
│                        NPOI 实现层                               │
│  ┌─────────────────┐  ┌─────────────────┐  ┌────────────────┐  │
│  │   HSSF (.xls)   │  │   XSSF (.xlsx)  │  │ SXSSF (流式)   │  │
│  └─────────────────┘  └─────────────────┘  └────────────────┘  │
├─────────────────────────────────────────────────────────────────┤
│                        底层支持库                                │
│  ┌─────────────────┐  ┌─────────────────┐  ┌────────────────┐  │
│  │   POIFS (OLE2)  │  │  OpenXml4Net    │  │   ICSharpCode  │  │
│  └─────────────────┘  └─────────────────┘  └────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

1.4 NPOI与其他库的对比

1.4.1 NPOI vs EPPlus

特性 NPOI EPPlus
开源协议 Apache 2.0(免费) Polyform Noncommercial(商业收费)
Excel格式 .xls + .xlsx 仅.xlsx
Word支持 支持 不支持
PowerPoint支持 支持 不支持
性能 优秀 优秀
社区活跃度 高 高

1.4.2 NPOI vs ClosedXML

特性 NPOI ClosedXML
开源协议 Apache 2.0 MIT
Excel格式 .xls + .xlsx 仅.xlsx
Word/PPT支持 支持 不支持
API友好度 中等 高
功能完整性 高 中

1.4.3 NPOI vs Microsoft Office Interop

特性 NPOI Office Interop
需要Office 不需要 需要安装Office
服务器使用 推荐 不推荐
性能 高 低
稳定性 高 容易出现COM错误
跨平台 支持 仅Windows

1.5 适用场景

1.5.1 推荐使用NPOI的场景

✅ 报表导出:批量生成Excel报表
✅ 数据导入:解析用户上传的Excel文件
✅ 文档生成:自动化生成Word合同、报告
✅ 模板填充:基于模板生成个性化文档
✅ 服务器端处理:Web应用中的文档处理
✅ 批量处理:大量文档的自动化处理
✅ 跨平台应用:Linux服务器上的文档处理

1.5.2 可能不适合的场景

⚠️ 需要完整Office功能(如VBA宏执行)
⚠️ 复杂的PowerPoint动画效果
⚠️ 需要实时预览文档效果
⚠️ 极其复杂的Word排版

1.6 快速入门示例

1.6.1 创建第一个Excel文件

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

// 创建工作簿
IWorkbook workbook = new XSSFWorkbook();

// 创建工作表
ISheet sheet = workbook.CreateSheet("员工信息");

// 创建表头
IRow headerRow = sheet.CreateRow(0);
headerRow.CreateCell(0).SetCellValue("姓名");
headerRow.CreateCell(1).SetCellValue("年龄");
headerRow.CreateCell(2).SetCellValue("部门");

// 创建数据行
IRow dataRow = sheet.CreateRow(1);
dataRow.CreateCell(0).SetCellValue("张三");
dataRow.CreateCell(1).SetCellValue(28);
dataRow.CreateCell(2).SetCellValue("技术部");

// 保存文件
using (FileStream fs = new FileStream("员工信息.xlsx", FileMode.Create))
{
    workbook.Write(fs);
}

Console.WriteLine("Excel文件创建成功!");

1.6.2 读取Excel文件

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

// 打开文件
using (FileStream fs = new FileStream("员工信息.xlsx", FileMode.Open, FileAccess.Read))
{
    IWorkbook workbook = new XSSFWorkbook(fs);
    ISheet sheet = workbook.GetSheetAt(0);
    
    // 遍历所有行
    for (int i = 0; i <= sheet.LastRowNum; i++)
    {
        IRow row = sheet.GetRow(i);
        if (row == null) continue;
        
        // 遍历所有单元格
        for (int j = 0; j < row.LastCellNum; j++)
        {
            ICell cell = row.GetCell(j);
            Console.Write($"{GetCellValue(cell)}\t");
        }
        Console.WriteLine();
    }
}

// 获取单元格值的辅助方法
static string GetCellValue(ICell cell)
{
    if (cell == null) return "";
    
    return cell.CellType switch
    {
        CellType.String => cell.StringCellValue,
        CellType.Numeric => cell.NumericCellValue.ToString(),
        CellType.Boolean => cell.BooleanCellValue.ToString(),
        CellType.Formula => cell.CellFormula,
        _ => ""
    };
}

1.6.3 创建第一个Word文档

using NPOI.XWPF.UserModel;
using System.IO;

// 创建文档
XWPFDocument doc = new XWPFDocument();

// 创建标题段落
XWPFParagraph titlePara = doc.CreateParagraph();
titlePara.Alignment = ParagraphAlignment.CENTER;
XWPFRun titleRun = titlePara.CreateRun();
titleRun.SetText("NPOI Word文档示例");
titleRun.IsBold = true;
titleRun.FontSize = 20;

// 创建正文段落
XWPFParagraph bodyPara = doc.CreateParagraph();
XWPFRun bodyRun = bodyPara.CreateRun();
bodyRun.SetText("这是使用NPOI创建的第一个Word文档。NPOI是一个强大的.NET库,可以轻松操作Office文档。");
bodyRun.FontSize = 12;

// 保存文件
using (FileStream fs = new FileStream("示例文档.docx", FileMode.Create))
{
    doc.Write(fs);
}

Console.WriteLine("Word文档创建成功!");

1.7 本章小结

本章介绍了NPOI的基本概念、发展历程和核心优势。通过本章学习,你应该了解到:

  • NPOI是Apache POI的.NET移植版本,完全开源免费
  • 支持Excel(.xls/.xlsx)、Word(.docx)、PowerPoint(.pptx)等格式
  • 无需安装Microsoft Office,可在服务器端安全使用
  • 采用接口抽象设计,代码可在不同格式间复用
  • 与其他库相比,NPOI在功能完整性和开源协议方面具有优势

在接下来的章节中,我们将深入学习NPOI的各项功能,从环境搭建开始,逐步掌握Excel、Word、PowerPoint的完整操作方法。


下一章预告:第二章将详细介绍NPOI的环境搭建和项目配置,包括NuGet包安装、版本选择建议和基础项目结构。