第01章-NPOI概述与入门

第一章: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包安装、版本选择建议和基础项目结构。

posted @ 2025-12-29 10:47  我才是银古  阅读(2)  评论(0)    收藏  举报