NPOI库操作Excel文件实战教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:NPOI是一个.NET开源库,用于读写Microsoft Office文件,特别是Excel文档。最新版本NPOI2.4.1提供与.NET环境集成的工具,允许开发者独立于Microsoft Office操作Excel文件。NPOI支持多种数据源转换为Excel格式,便于数据交换和分析。压缩包中包含多个关键组件,如核心处理库文件和数据压缩处理库,支持创建和操作各种Excel文件格式,并具备读写大数据量和高级Excel功能(如数据验证、条件格式)的能力。
NPOI2.4.1.rar

1. NPOI库介绍与功能概述

1.1 NPOI简介

NPOI是一个开源的.NET库,用于读取和写入Microsoft Office格式的文件,特别适用于处理Excel文件(.xls和.xlsx格式)。它提供了广泛的API接口,使得开发者可以轻松地在.NET应用程序中操作Excel文档,而无需安装Microsoft Office。

1.2 功能概述

NPOI支持创建、读取、修改和写入Excel文档的多种操作。包括但不限于:
- 简单和复杂的单元格操作(如读取单元格值,设置单元格样式)
- 行和列的增删改查
- 创建和操作工作表(Sheet)
- 整合DataTable及其他数据源到Excel文件中
- 支持旧版(.xls)和新版(.xlsx)Excel格式

1.3 应用场景

NPOI库适用于多种场景,比如:
- 自动化生成Excel报告
- 从数据源(如数据库)导出数据到Excel
- 读取用户上传的Excel文件,并进行数据处理

NPOI库通过提供丰富的API,简化了Excel文件操作,提高了开发效率,是.NET开发者的得力助手。

2. NPOI处理Excel文件的方法

NPOI是.NET平台下处理Microsoft Office文档的开源库,尤其在处理Excel文件方面表现出色。无论你是要创建、读取,还是修改Excel文件,NPOI都能提供简洁直观的API,大大简化了相关操作流程。下面我们就深入探讨NPOI库在Excel文件处理方面的主要方法。

2.1 NPOI基础操作

2.1.1 读取Excel文件

在使用NPOI读取Excel文件之前,首先需要确保已经安装了NPOI库。可以通过NuGet包管理器轻松安装:

Install-Package NPOI

一旦安装好NPOI库,就可以使用以下代码来读取一个Excel文件:

using System.IO;
using NPOI.HSSF.UserModel; // 用于.xls格式
using NPOI.SS.UserModel; // 用于.xlsx格式
using NPOI.XSSF.UserModel; // 也用于.xlsx格式

public static IWorkbook ReadExcel(string filePath)
{
    if (filePath.EndsWith(".xls"))
    {
        return new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
    }
    else
    {
        return new XSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
    }
}

在读取文件时,NPOI需要区分处理 .xls .xlsx 文件,因为这两种文件格式分别对应不同的处理类。

2.1.2 创建Excel文件

创建Excel文件首先要创建一个 IWorkbook 实例,然后在该实例上进行操作。创建一个Excel文件的代码示例如下:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

public static void CreateExcelFile(string filePath)
{
    IWorkbook workbook;
    if (filePath.EndsWith(".xls"))
    {
        workbook = new HSSFWorkbook();
    }
    else
    {
        workbook = new XSSFWorkbook();
    }

    ISheet sheet = workbook.CreateSheet("Sheet1");

    // 创建一行数据
    IRow row = sheet.CreateRow(0);
    ICell cell = row.CreateCell(0);
    cell.SetCellValue(123);
    cell.CellStyle = workbook.CreateCellStyle();
    cell.CellStyle.SetFont(workbook.CreateFont().Boldweight = FontBoldWeight.Bold);

    // 保存文件
    using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    {
        workbook.Write(file);
    }
}

在这段代码中,我们创建了一个Excel工作簿,向其中添加了工作表,然后在工作表中添加了数据。

2.1.3 修改Excel文件

修改已经存在的Excel文件,则需要先打开文件,然后对工作簿、工作表、行、单元格等进行操作。以下是一个修改Excel文件的示例:

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

public static void ModifyExcelFile(string filePath)
{
    IWorkbook workbook;
    using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
    {
        workbook = new XSSFWorkbook(file);
    }

    ISheet sheet = workbook.GetSheetAt(0);

    // 获取第一行第一列的单元格
    IRow row = sheet.GetRow(0);
    if (row != null)
    {
        ICell cell = row.GetCell(0);
        if (cell != null)
        {
            cell.SetCellValue("Modified");
        }
    }

    using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    {
        workbook.Write(file);
    }
}

在这个示例中,我们首先读取了一个Excel文件,然后获取了第一个工作表的第一行第一列的单元格,并修改了该单元格的值。

2.2 NPOI复杂操作

2.2.1 单元格操作

在NPOI中,单元格是最小的操作单位。NPOI提供了一系列的方法来设置单元格的值、类型、样式、公式等属性。

ICell cell = row.CreateCell(0);
cell.SetCellValue("Hello, World!");
cell.CellStyle = workbook.CreateCellStyle();
cell.CellStyle.SetFont(workbook.CreateFont().Boldweight = FontBoldWeight.Bold);

这段代码创建了一个单元格,并设置了值和样式。

2.2.2 行和列的操作

NPOI允许对行和列进行一系列的操作,比如插入、删除、获取、设置等。

IRow row = sheet.CreateRow(0); // 创建第一行
sheet.RemoveRow(row); // 删除第一行

IColumn column = sheet.GetColumn(0); // 获取第一列
sheet.SetColumnHidden(0, true); // 隐藏第一列

2.2.3 工作表操作

在Excel中,工作表是组织数据的基础单位。使用NPOI,可以创建、删除或获取工作表。

ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建名为Sheet1的工作表
workbook.DeleteSheet(sheet); // 删除Sheet1工作表
int sheetIndex = workbook.GetSheetIndex(sheetName); // 获取名为sheetName的工作表索引

总结

在本节中,我们详细介绍了使用NPOI库进行Excel文件处理的基础和复杂操作。从读取和创建到修改Excel文件,再到对单元格、行、列和工作表的具体操作,我们通过代码示例向您展示了如何利用NPOI实现这些功能。通过深入理解这些操作,开发者可以高效地在.NET应用程序中集成对Excel文件的处理能力,提升应用程序的功能性和用户体验。

3. NPOI与DataTable等数据源的整合

3.1 DataTable数据源整合

3.1.1 DataTable与NPOI的转换

在.NET开发环境中,DataTable是一种常见的数据结构,用于在内存中存储数据表。NPOI库提供了一种方便的方法来处理Excel文件,包括与DataTable等数据源的整合。整合这两个组件首先需要一个将DataTable转换为Excel工作表的步骤,反之亦然。这里,我们会重点探讨如何将DataTable转换为Excel工作表。

实现DataTable转换为Excel工作表

要将DataTable转换为Excel工作表,我们可以遵循以下步骤:

  1. 初始化Excel文档和工作表。
  2. 遍历DataTable的每一行,并将每一行数据写入到Excel工作表中。
  3. 设置列头,以匹配DataTable的列名。
  4. 保存Excel文档。

以下是一个简单的代码示例,演示了如何执行上述步骤:

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

public void DataTableToExcel(DataTable dataTable, string filePath)
{
    IWorkbook workbook = new XSSFWorkbook(); // 创建工作簿
    ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建工作表

    // 将DataTable列名写入Excel的列头
    IRow headerRow = sheet.CreateRow(0);
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);
    }

    // 遍历DataTable的行,并将每行数据写入Excel工作表
    for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
    {
        IRow row = sheet.CreateRow(rowIndex + 1);
        for (int colIndex = 0; colIndex < dataTable.Columns.Count; colIndex++)
        {
            row.CreateCell(colIndex).SetCellValue(dataTable.Rows[rowIndex][colIndex].ToString());
        }
    }

    // 使用文件流保存Excel文档
    using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    {
        workbook.Write(file);
    }
}

在上述代码中,我们创建了一个XSSFWorkbook实例代表Excel文档,接着创建了一个工作表Sheet1。通过遍历DataTable的列和行,我们可以把数据写入Excel工作表中相应的单元格。最后,使用FileStream将工作簿写入到指定的文件路径。

3.1.2 DataTable数据的写入Excel

在实际应用场景中,我们可能会碰到动态的数据源,这就要求我们能够将变化的数据更新到Excel文件中。通过使用NPOI库,我们可以编写代码来实现这一点。

实现DataTable数据写入已存在的Excel工作表

以下代码段演示如何将DataTable的数据添加到已经存在的Excel文件的工作表中:

public void AppendDataTableToExistingExcel(DataTable dataTable, string filePath)
{
    using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
    {
        IWorkbook workbook = new XSSFWorkbook(file); // 从文件中加载现有的工作簿
        ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表

        int rowCount = sheet.LastRowNum + 1; // 获取最后一行的行号

        // 遍历DataTable的行,并将每行数据添加到工作表中
        for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
        {
            IRow row = sheet.CreateRow(rowCount++); // 在Excel中创建新行
            for (int colIndex = 0; colIndex < dataTable.Columns.Count; colIndex++)
            {
                row.CreateCell(colIndex).SetCellValue(dataTable.Rows[rowIndex][colIndex].ToString());
            }
        }

        // 重新写入文件以保存更改
        using (FileStream outputStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            workbook.Write(outputStream);
        }
    }
}

在这个函数中,我们首先打开一个已存在的Excel文件,并读取它的工作簿和工作表。之后,我们遍历DataTable,并将每一行数据添加到工作表中。要注意的是, LastRowNum 属性不包括任何空行,所以我们使用它来确定下一个要添加的行号。一旦数据添加完成,我们使用一个FileStream将更改写回到文件中。

3.1.3 从Excel读取数据到DataTable

不仅能够将DataTable写入到Excel文件,我们同样可以实现从Excel文件读取数据到DataTable。这对于数据的展示、处理以及数据迁移是很有用的。

实现从Excel读取数据到DataTable

以下是将Excel工作表中的数据读取到DataTable的代码示例:

public DataTable ReadExcelToDataTable(string filePath)
{
    DataTable dataTable = new DataTable();
    using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        IWorkbook workbook = new XSSFWorkbook(file);
        ISheet sheet = workbook.GetSheetAt(0); // 假定我们只需要第一个工作表的数据

        // 读取列头
        IRow headerRow = sheet.GetRow(0);
        if (headerRow != null)
        {
            foreach (ICell cell in headerRow)
            {
                dataTable.Columns.Add(cell.StringCellValue);
            }
        }

        // 读取数据行
        for (int rowIndex = headerRow == null ? 0 : 1; rowIndex <= sheet.LastRowNum; rowIndex++)
        {
            IRow row = sheet.GetRow(rowIndex);
            if (row == null) continue; // 跳过空行

            DataRow dataRow = dataTable.NewRow();
            int columnIndex = 0;
            foreach (ICell cell in row)
            {
                switch (cell.CellType)
                {
                    case CellType.Numeric:
                        dataRow[columnIndex] = cell.NumericCellValue;
                        break;
                    case CellType.String:
                        dataRow[columnIndex] = cell.StringCellValue;
                        break;
                    case CellType.Boolean:
                        dataRow[columnIndex] = cell.BooleanCellValue;
                        break;
                    case CellType.Formula:
                        dataRow[columnIndex] = cell.CellFormula;
                        break;
                    // 更多的单元格类型可以在这里添加处理逻辑
                    default:
                        dataRow[columnIndex] = " ";
                        break;
                }
                columnIndex++;
            }
            dataTable.Rows.Add(dataRow);
        }
    }

    return dataTable;
}

这段代码首先创建一个空的DataTable。然后,打开一个Excel文件并获取第一个工作表的数据。接着,代码读取工作表的列头,并将列头添加到DataTable中。之后,代码遍历工作表中的每一行数据,并将每个单元格的内容读取到新的DataRow中,最后将DataRow添加到DataTable中。

上述代码中的 CellType 枚举用于确定单元格中的数据类型,并进行相应的处理。在实际应用中,根据需要处理的数据类型,可以扩展更多的 CellType 情况。

3.2 其他数据源整合

3.2.1 List数据源整合

除了DataTable,我们常常会处理来自业务逻辑的复杂数据结构,例如List集合。整合List数据源到Excel,我们需要将List转换成DataTable或者直接遍历List对象,将数据写入Excel。

实现List数据写入Excel

假设我们有一个简单模型类 Person ,并有一个 List<Person> 的数据集合,我们想要将这些数据写入Excel,实现方式如下:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    // 其他属性
}

// 将List<Person>写入Excel
public void ListToExcel(List<Person> personList, string filePath)
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add("Name", typeof(string));
    dataTable.Columns.Add("Age", typeof(int));

    foreach (Person person in personList)
    {
        dataTable.Rows.Add(person.Name, person.Age);
    }

    DataTableToExcel(dataTable, filePath);
}

在这个例子中,我们首先创建了一个DataTable,给它添加了与List中Person对象属性对应的列。然后,我们遍历personList集合,把每个Person对象的数据添加到DataTable中的一行。最后,我们调用之前实现的 DataTableToExcel 方法将DataTable的内容写入到Excel文件中。

3.2.2 自定义数据源整合

在某些情况下,我们可能会遇到更为复杂的自定义数据源,这可能涉及到数据模型的层次结构。对于这种整合,通常需要实现更复杂的逻辑,来递归处理对象和子对象的关系,同时将它们映射到Excel中的行和列。

实现自定义数据源写入Excel

这里我们考虑一个简化的例子,其中有一个 Order 类,它包含了 OrderDetails ,这是一个 List<OrderDetail> 的集合。每个 OrderDetail 类包含商品名称和数量。我们需要将这些数据扁平化后写入Excel。

public class Order
{
    public int OrderId { get; set; }
    public List<OrderDetail> OrderDetails { get; set; }
}

public class OrderDetail
{
    public string ProductName { get; set; }
    public int Quantity { get; set; }
}

public void CustomObjectToExcel(List<Order> orders, string filePath)
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add("OrderId", typeof(int));
    dataTable.Columns.Add("ProductName", typeof(string));
    dataTable.Columns.Add("Quantity", typeof(int));

    foreach (Order order in orders)
    {
        dataTable.Rows.Add(order.OrderId, "", 0); // 添加订单头信息

        foreach (OrderDetail detail in order.OrderDetails)
        {
            dataTable.Rows.Add("", detail.ProductName, detail.Quantity); // 添加订单详情信息
        }
    }

    DataTableToExcel(dataTable, filePath);
}

在这个实现中,我们创建了一个DataTable,并为订单信息和订单详情分别添加了列。我们遍历订单列表,首先添加一个订单头信息,然后遍历该订单的订单详情,分别添加到DataTable中。最后,使用 DataTableToExcel 方法将数据写入到Excel文件中。

在整合NPOI和不同数据源时,了解如何有效地转换和映射数据是非常重要的。这种转换可能需要对数据进行适当的处理和格式化,以便在Excel中正确地展示。希望以上内容能够帮助你更好地理解NPOI与DataTable等数据源整合的原理和方法。

4. 支持Excel新旧格式(.xls和.xlsx)

NPOI库不仅支持Microsoft Office的较新格式.xlsx,同时也兼容旧版的.xls格式。本章节将深入探讨如何使用NPOI来读取、创建和修改这两种格式的Excel文件。

4.1 .xls格式处理

4.1.1 读取.xls文件

与.xlsx文件相比,.xls文件通常比较复杂,特别是在文件结构和对象模型上。NPOI通过HSSF(Horrible Spreadsheet Format)组件来处理.xls格式的文件。

using NPOI.HSSF.UserModel;
using System.IO;

// 加载现有的.xls文件
FileStream file = new FileStream("example.xls", FileMode.Open, FileAccess.Read);
HSSFWorkbook workbook = new HSSFWorkbook(file);

// 获取第一个工作表
ISheet sheet = workbook.GetSheetAt(0);

// 遍历行
foreach (IRow row in sheet)
{
    // 遍历列
    foreach (ICell cell in row)
    {
        // 获取单元格的类型和值
        if (cell.CellType == CellType.String)
        {
            Console.Write(cell.StringCellValue);
        }
        else if (cell.CellType == CellType.Numeric)
        {
            Console.Write(cell.NumericCellValue);
        }
        Console.Write("\t");
    }
    Console.WriteLine();
}
file.Close();

上面的代码演示了如何使用NPOI来读取.xls格式的文件。首先,通过 HSSFWorkbook 类创建一个工作簿对象,然后使用 GetSheetAt 方法获取需要的工作表。接下来,可以遍历工作表中的行和列,根据单元格的类型来获取相应的数据。

4.1.2 创建.xls文件

创建.xls文件的过程与读取过程类似,但是我们使用的是 HSSFWorkbook 类的实例。

HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Example Sheet");

// 创建行和单元格
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
cell.SetCellValue("Hello World!");

// 写入文件
FileStream fileOut = new FileStream("exampleCreated.xls", FileMode.Create, FileAccess.Write);
workbook.Write(fileOut);
fileOut.Close();

上述代码演示了如何创建一个新的.xls文件,并向其中添加数据。 CreateSheet 方法用于创建一个新的工作表, CreateRow CreateCell 用于添加行和单元格。最终,使用 Write 方法将工作簿对象写入到磁盘文件中。

4.1.3 修改.xls文件

修改.xls文件通常需要先读取现有的文件,然后进行修改后再保存。

// 假设已经有了一个名为example.xls的文件
FileStream fileIn = new FileStream("example.xls", FileMode.Open, FileAccess.Read);
HSSFWorkbook workbook = new HSSFWorkbook(fileIn);
ISheet sheet = workbook.GetSheetAt(0);
IRow row = sheet.GetRow(0); // 获取第一行
ICell cell = row.GetCell(0); // 获取第一列的单元格

cell.SetCellValue("Updated Value"); // 更新单元格值

FileStream fileOut = new FileStream("exampleUpdated.xls", FileMode.Create, FileAccess.Write);
workbook.Write(fileOut);
fileIn.Close();
fileOut.Close();

在上述代码中,我们首先打开一个已存在的.xls文件,并读取其中的内容。然后我们找到需要修改的单元格并更改其值。最后,我们将修改后的工作簿对象保存为一个新的文件。

4.2 .xlsx格式处理

4.2.1 读取.xlsx文件

读取.xlsx文件使用的是NPOI提供的XSSF组件。XSSF基于OpenXML格式,它提供了比HSSF更现代和更高效的Excel处理能力。

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

// 加载现有的.xlsx文件
FileStream file = new FileStream("example.xlsx", FileMode.Open, FileAccess.Read);
XSSFWorkbook workbook = new XSSFWorkbook(file);

// 获取第一个工作表
ISheet sheet = workbook.GetSheetAt(0);

// 遍历行
foreach (IRow row in sheet)
{
    // 遍历列
    foreach (ICell cell in row)
    {
        // 获取单元格的类型和值
        if (cell.CellType == CellType.String)
        {
            Console.Write(cell.StringCellValue);
        }
        else if (cell.CellType == CellType.Numeric)
        {
            Console.Write(cell.NumericCellValue);
        }
        Console.Write("\t");
    }
    Console.WriteLine();
}
file.Close();

这段代码类似于处理.xls文件的代码,只不过这里使用了 XSSFWorkbook 类。请注意,读取文件的方式和遍历工作表的逻辑保持一致,使得两种格式的处理代码具有很好的可读性和重用性。

4.2.2 创建.xlsx文件

创建.xlsx文件时,NPOI同样提供了清晰的API,方便我们创建新的Excel文件。

XSSFWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Example Sheet");

// 创建行和单元格
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
cell.SetCellValue("Hello World!");

// 写入文件
FileStream fileOut = new FileStream("exampleCreated.xlsx", FileMode.Create, FileAccess.Write);
workbook.Write(fileOut);
fileOut.Close();

这里, XSSFWorkbook 类被用于创建一个新的工作簿对象, CreateSheet 方法创建一个新工作表,然后通过 CreateRow CreateCell 方法添加数据。

4.2.3 修改.xlsx文件

与.xls文件类似,修改.xlsx文件也需要先读取现有文件,进行修改,然后保存。

FileStream fileIn = new FileStream("example.xlsx", FileMode.Open, FileAccess.Read);
XSSFWorkbook workbook = new XSSFWorkbook(fileIn);
ISheet sheet = workbook.GetSheetAt(0);
IRow row = sheet.GetRow(0);
ICell cell = row.GetCell(0);

cell.SetCellValue("Updated Value");

FileStream fileOut = new FileStream("exampleUpdated.xlsx", FileMode.Create, FileAccess.Write);
workbook.Write(fileOut);
fileIn.Close();
fileOut.Close();

在上述代码中,我们首先打开一个已存在的.xlsx文件,然后获取并修改单元格的值。最后,将修改后的工作簿对象保存为一个新的文件。

以上是使用NPOI库处理.xls和.xlsx格式的Excel文件的基本方法。下一章节,我们将探讨如何在.NET环境下创建和读取Excel文件。

5. .NET环境下创建和读取Excel文件

在.NET环境中,使用NPOI库可以很方便地创建和读取Excel文件。NPOI支持.xls和.xlsx两种文件格式,允许开发者在.NET应用程序中实现对Excel文件的复杂操作。本章我们将深入探讨如何在.NET环境下使用NPOI创建和读取Excel文件。

5.1 创建Excel文件

5.1.1 创建简单的Excel文件

创建一个简单的Excel文件是NPOI库中最基本的操作之一。我们将从创建一个新的工作簿(Workbook),到添加一个工作表(Sheet),再到填充数据,最后保存文件为一个完整的流程。

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

// 创建一个HSSFWorkbook实例(用于.xls文件)
//Workbook workbook = new HSSFWorkbook();
// 创建一个XSSFWorkbook实例(用于.xlsx文件)
Workbook workbook = new XSSFWorkbook();
// 创建一个工作表(Sheet)
ISheet sheet = workbook.CreateSheet("ExampleSheet");

// 创建行(Row)和单元格(Cell)
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);

// 设置单元格数据
cell.SetCellValue("Hello, NPOI!");

// 保存工作簿
using (FileStream file = new FileStream("Example.xlsx", FileMode.Create, FileAccess.Write))
{
    workbook.Write(file);
}

5.1.2 创建复杂的Excel文件

创建复杂Excel文件涉及多个工作表、多种数据类型以及格式化。以下是一个创建包含多种数据类型和样式的复杂Excel文件的示例:

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

// 创建一个新的工作簿实例
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
ISheet sheet2 = workbook.CreateSheet("Sheet2");

// 创建一些行和单元格,并添加一些数据和样式
for (int rownum = 0; rownum < 10; rownum++)
{
    IRow row = sheet1.CreateRow(rownum);
    for (int cellnum = 0; cellnum < 5; cellnum++)
    {
        ICell cell = row.CreateCell(cellnum);
        cell.SetCellValue(new XSSFRichTextString("Row " + rownum + ", Cell " + cellnum));
    }
}

// 添加样式到单元格
ICellStyle style = workbook.CreateCellStyle();
style.DataFormat = workbook.CreateDataFormat().GetFormat("@");

ICell cell = sheet2.GetRow(0).GetCell(0);
cell.CellStyle = style;
cell.SetCellValue("=Sheet1!A1");

// 保存工作簿到文件
using (FileStream fileOut = new FileStream("ComplexExample.xlsx", FileMode.Create, FileAccess.Write))
{
    workbook.Write(fileOut);
}

5.2 读取Excel文件

5.2.1 读取简单的Excel文件

读取简单的Excel文件涉及打开文件、获取工作表、遍历行和单元格,然后读取单元格中的数据。

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

// 打开一个Excel文件
IWorkbook workbook;
using (FileStream file = new FileStream("Example.xlsx", FileMode.Open, FileAccess.Read))
{
    workbook = new XSSFWorkbook(file);
}

// 获取第一个工作表
ISheet sheet = workbook.GetSheetAt(0);

// 遍历行和单元格
foreach (IRow row in sheet)
{
    foreach (ICell cell in row)
    {
        // 打印单元格中的数据
        Console.Write(cell.ToString() + "\t");
    }
    Console.WriteLine();
}

5.2.2 读取复杂的Excel文件

对于复杂文件,我们可能需要读取数据的同时,解析和处理单元格的样式和格式。下面是一个读取包含多种数据类型的复杂Excel文件,并输出数据的示例:

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

// 打开一个Excel文件
IWorkbook workbook;
using (FileStream file = new FileStream("ComplexExample.xlsx", FileMode.Open, FileAccess.Read))
{
    workbook = new XSSFWorkbook(file);
}

// 获取名为"Sheet2"的工作表
ISheet sheet = workbook.GetSheet("Sheet2");

// 遍历行和单元格
foreach (IRow row in sheet)
{
    foreach (ICell cell in row)
    {
        // 检查单元格是否包含公式
        if (cell.CellType == CellType.Formula)
        {
            Console.Write("Formula: ");
        }
        // 检查单元格是否包含字符串
        else if (cell.CellType == CellType.String)
        {
            Console.Write("String: " + cell.StringCellValue + "\t");
        }
        // 检查单元格是否包含数字
        else if (cell.CellType == CellType.Numeric)
        {
            Console.Write("Numeric: " + cell.NumericCellValue + "\t");
        }
        Console.Write("Style: " + cell.CellStyle.DataFormatString);
    }
    Console.WriteLine();
}

通过上述示例代码,我们展示了如何在.NET环境下使用NPOI库创建和读取Excel文件。代码中包含的操作涵盖了从基础到进阶的各种场景,展示了NPOI的强大功能以及如何应对实际编程中的不同需求。

6. NPOI核心组件解析(NPOI.dll, NPOI2.0.dll, NPOI.OOXML.dll等)

NPOI库的核心是其提供的一系列DLL文件,它们共同支持处理Excel文件的不同方面。本章节将深入分析这些核心组件的功能和使用方法,以便更好地理解和掌握NPOI库的潜能。

6.1 NPOI.dll解析

NPOI.dll是NPOI库的核心组件之一,主要负责处理旧版Excel文件(.xls格式)。这个组件提供了丰富的方法和类库,用于实现对.xls文件的读取、创建和修改。

6.1.1 NPOI.dll的功能和使用

  • 读取.xls文件 :使用 FileStream 打开文件流,然后使用 HSSFWorkbook 类来加载整个文件。
  • 创建.xls文件 :创建 HSSFWorkbook 对象,构建 HSSFSheet HSSFRow 等对象,最终将这些对象写入到 HSSFWorkbook 中,并通过 FileStream 保存文件。
  • 修改.xls文件 :加载现有的 HSSFWorkbook 文件,找到需要修改的工作表 HSSFSheet ,然后对单元格 HSSFCell 进行操作,最后保存修改。

示例代码

// 读取.xls文件示例
FileStream file = new FileStream("example.xls", FileMode.Open, FileAccess.Read);
HSSFWorkbook workbook = new HSSFWorkbook(file);
// 对workbook进行操作...

// 创建.xls文件示例
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.CreateSheet("Sheet1");
HSSFRow row = sheet.CreateRow(0);
HSSFCell cell = row.CreateCell(0);
cell.SetCellValue("Hello, NPOI!");
// 写入文件流保存...

// 修改.xls文件示例
FileStream file = new FileStream("example.xls", FileMode.Open, FileAccess.ReadWrite);
HSSFWorkbook workbook = new HSSFWorkbook(file);
HSSFSheet sheet = workbook.GetSheetAt(0);
HSSFRow row = sheet.GetRow(0);
HSSFCell cell = row.GetCell(0);
cell.SetCellValue("Updated Cell Value");
file.Close();

6.2 NPOI2.0.dll解析

NPOI2.0.dll是NPOI库的另一个主要组件,专注于处理新版Excel文件(.xlsx格式)。使用NPOI2.0.dll,开发者可以利用OOXML标准来操作Excel文件。

6.2.1 NPOI2.0.dll的功能和使用

  • 读取.xlsx文件 :使用 FileStream 读取文件流,然后使用 XSSFWorkbook 类来加载整个文件。
  • 创建.xlsx文件 :创建 XSSFWorkbook 对象,构建 XSSFSheet XSSFRow 等对象,并添加单元格 XSSFCell
  • 修改.xlsx文件 :加载现有的 XSSFWorkbook 对象,找到需要修改的 XSSFSheet ,对 XSSFRow XSSFCell 进行操作,最后保存文件。

示例代码

// 读取.xlsx文件示例
FileStream file = new FileStream("example.xlsx", FileMode.Open, FileAccess.Read);
XSSFWorkbook workbook = new XSSFWorkbook(file);
// 对workbook进行操作...

// 创建.xlsx文件示例
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.CreateSheet("Sheet1");
XSSFRow row = sheet.CreateRow(0);
XSSFCell cell = row.CreateCell(0);
cell.SetCellValue("Hello, NPOI 2.0!");
// 写入文件流保存...

// 修改.xlsx文件示例
FileStream file = new FileStream("example.xlsx", FileMode.Open, FileAccess.ReadWrite);
XSSFWorkbook workbook = new XSSFWorkbook(file);
XSSFSheet sheet = workbook.GetSheetAt(0);
XSSFRow row = sheet.GetRow(0);
XSSFCell cell = row.GetCell(0);
cell.SetCellValue("Updated Cell Value");
file.Close();

6.3 NPOI.OOXML.dll解析

NPOI.OOXML.dll是一个重要的组件,它基于Open Packaging Conventions (OPC)和OOXML标准,专门用于处理Excel的 .xlsx 文件。

6.3.1 NPOI.OOXML.dll的功能和使用

  • 读取.xlsx文件 :此组件特别适用于读取OOXML格式的Excel文件,通过 FileOpenPackaging PackageRelationship 等类。
  • 创建.xlsx文件 :使用 SpreadsheetDocument 创建新的工作簿,通过 WorkbookPart SheetPart 添加和修改工作表中的内容。
  • 修改.xlsx文件 :加载现有的 SpreadsheetDocument 文档,定位到特定的 WorkbookPart SheetPart ,进行数据的修改。

示例代码

// 读取.xlsx文件示例
using (SpreadsheetDocument document = SpreadsheetDocument.Open("example.xlsx", false))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    // 对workbookPart进行操作...
}

// 创建.xlsx文件示例
using (SpreadsheetDocument document = SpreadsheetDocument.Create("example.xlsx", SpreadsheetDocumentType.Workbook))
{
    WorkbookPart workbookPart = document.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();
    // 添加SheetPart和设置数据...
}

// 修改.xlsx文件示例
using (SpreadsheetDocument document = SpreadsheetDocument.Open("example.xlsx", true))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    // 对workbookPart中的数据进行修改...
}

本章到此结束,我们探讨了NPOI库中各个核心组件的功能和使用方法。第七章将继续深入探讨NPOI的高级Excel功能,例如数据验证和条件格式。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:NPOI是一个.NET开源库,用于读写Microsoft Office文件,特别是Excel文档。最新版本NPOI2.4.1提供与.NET环境集成的工具,允许开发者独立于Microsoft Office操作Excel文件。NPOI支持多种数据源转换为Excel格式,便于数据交换和分析。压缩包中包含多个关键组件,如核心处理库文件和数据压缩处理库,支持创建和操作各种Excel文件格式,并具备读写大数据量和高级Excel功能(如数据验证、条件格式)的能力。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值