简介:NPOI是一个.NET开源库,用于读写Microsoft Office文件,特别是Excel文档。最新版本NPOI2.4.1提供与.NET环境集成的工具,允许开发者独立于Microsoft Office操作Excel文件。NPOI支持多种数据源转换为Excel格式,便于数据交换和分析。压缩包中包含多个关键组件,如核心处理库文件和数据压缩处理库,支持创建和操作各种Excel文件格式,并具备读写大数据量和高级Excel功能(如数据验证、条件格式)的能力。
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工作表,我们可以遵循以下步骤:
- 初始化Excel文档和工作表。
- 遍历DataTable的每一行,并将每一行数据写入到Excel工作表中。
- 设置列头,以匹配DataTable的列名。
- 保存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功能,例如数据验证和条件格式。
简介:NPOI是一个.NET开源库,用于读写Microsoft Office文件,特别是Excel文档。最新版本NPOI2.4.1提供与.NET环境集成的工具,允许开发者独立于Microsoft Office操作Excel文件。NPOI支持多种数据源转换为Excel格式,便于数据交换和分析。压缩包中包含多个关键组件,如核心处理库文件和数据压缩处理库,支持创建和操作各种Excel文件格式,并具备读写大数据量和高级Excel功能(如数据验证、条件格式)的能力。