一、引言 在.NET開發中,操作Office文檔(特別是Excel和Word)是一項常見的需求。然而,在伺服器端或無Microsoft Office環境的場景下,直接使用Office Interop可能會面臨挑戰。為瞭解決這個問題,開源庫NPOI應運而生,它提供了無需安裝Office即可創建、讀取和 ...
一、引言
在.NET開發中,操作Office文檔(特別是Excel和Word)是一項常見的需求。然而,在伺服器端或無Microsoft Office環境的場景下,直接使用Office Interop可能會面臨挑戰。為瞭解決這個問題,開源庫NPOI應運而生,它提供了無需安裝Office即可創建、讀取和修改Excel (.xls, .xlsx) 和 Word (.doc) 文件的能力。
二、NPOI簡介
NPOI是一個基於.NET的API,用於讀寫微軟的OLE 2 Compound Document formats,如Microsoft Office Excel和Word。它是Apache POI項目的.NET移植版本,允許開發者在沒有安裝Office的情況下處理這些格式的文件。
三、主要組件與方法
1. 安裝與引用
Install-Package NPOI
或者在Visual Studio中右鍵項目 -> 管理NuGet程式包 -> 搜索並安裝NPOI。
2. 引用命名空間
using NPOI.SS.UserModel; // Excel相關的介面和類
using NPOI.XSSF.UserModel; // 處理.xlsx文件
using NPOI.HSSF.UserModel; // 處理.xls文件
using System.IO; // 文件操作
3. 創建/打開工作簿
- 創建一個新的Excel工作簿(.xlsx):
var workbook = new XSSFWorkbook();
- 打開一個現有的Excel文件(.xlsx或.xls):
FileStream file = new FileStream("path_to_your_file.xlsx", FileMode.Open, FileAccess.Read);
var workbook = new XSSFWorkbook(file); // .xlsx格式
var workbook = new HSSFWorkbook(file); // .xls格式
4. 創建/獲取工作表
- 創建新的工作表:
ISheet sheet = workbook.CreateSheet("Sheet1");
- 獲取已存在的工作表:
ISheet sheet = workbook.GetSheetAt(0); // 獲取索引為0的工作表
5. 寫入單元格數據 - 創建行與單元格:
IRow row = sheet.CreateRow(rowIndex);
ICell cell = row.CreateCell(columnIndex);
- 設置單元格值:
cell.SetCellValue("文本內容"); // 文本
cell.SetCellValue(12345); // 數字
6. 合併單元格
var region = new CellRangeAddress(startRow, endRow, startColumn, endColumn);
sheet.AddMergedRegion(region);
7. 設置單元格樣式
- 創建樣式對象:
var style = workbook.CreateCellStyle();
- 設置樣式屬性(如字體、顏色、對齊方式等):
style.Alignment = HorizontalAlignment.Center;
IFont font = workbook.CreateFont();
font.Boldweight = (short)FontBoldWeight.Bold;
style.SetFont(font);
- 應用到單元格:
cell.CellStyle = style;
8. 保存文件
FileStream outputStream = new FileStream("output.xlsx", FileMode.Create);
workbook.Write(outputStream);
outputStream.Close();
9. 關閉資源
- 確保關閉Workbook以及相關的文件流以釋放資源:
workbook.Close();
file.Close();
四、高級功能
-
讀取現有文件:通過FileStream打開並讀取Excel文件內容。
-
讀取公式結果:通過ICell.CachedFormulaResultType或ICell.CellFormula屬性獲取公式計算結果。
-
操作圖表和圖片:NPOI支持插入、更新和刪除Excel中的圖表和圖片。
-
處理Word文檔:通過XWPFDocument類來創建、讀取和修改Word(.doc)文件。
五、總結
NPOI庫憑藉其強大的功能和輕量級設計,已成為.NET環境下處理Office文檔的標準工具之一。無論是在Web應用程式後臺處理用戶上傳的Excel文件,還是在批處理任務中生成報表,NPOI都能提供高效且易於使用的解決方案。通過深入理解和熟練運用NPOI的各種方法,開發者可以輕鬆應對各種複雜的文檔處理任務。
六、完整的讀取數據例子
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
public void ReadExcelFile(string filePath)
{
// 創建一個FileStream對象來打開Excel文件
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// 根據文件擴展名選擇合適的Workbook實現
IWorkbook workbook;
if (Path.GetExtension(filePath).ToLower() == ".xlsx")
{
workbook = new XSSFWorkbook(file);
}
else
{
workbook = new HSSFWorkbook(file); // 適用於.xls文件
}
// 獲取第一個工作表(索引從0開始)
ISheet sheet = workbook.GetSheetAt(0);
// 遍歷所有行
for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++)
{
IRow row = sheet.GetRow(rowIndex);
// 如果當前行不為空,則遍歷所有單元格
if (row != null)
{
for (int cellIndex = 0; cellIndex < row.LastCellNum; cellIndex++)
{
ICell cell = row.GetCell(cellIndex);
// 檢查單元格是否存在並獲取其數據類型和值
if (cell != null)
{
switch (cell.CellType)
{
case CellType.Numeric:
double numericValue = cell.NumericCellValue;
Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列:{numericValue}");
break;
case CellType.String:
string stringValue = cell.StringCellValue;
Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列:{stringValue}");
break;
case CellType.Formula:
// 如果需要顯示公式計算結果,使用CachedFormulaResultType
if (cell.CachedFormulaResultType == CellType.Numeric)
{
double formulaValue = cell.NumericCellValue;
Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列(公式結果):{formulaValue}");
}
else if (cell.CachedFormulaResultType == CellType.String)
{
string formulaValue = cell.StringCellValue;
Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列(公式結果):{formulaValue}");
}
// 其他類型的公式處理...
break;
default:
// 對於日期、布爾值等其他類型,做相應處理
break;
}
}
else
{
Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列:空單元格");
}
}
}
}
// 關閉workbook以釋放資源
workbook.Close();
}
}
在這個例子中,我們首先打開了指定路徑下的Excel文件,並根據文件類型創建了相應的HSSFWorkbook或XSSFWorkbook對象。然後,我們迴圈遍歷每一行和每一列,獲取每個單元格的內容,並根據單元格類型輸出對應的值。
請確保已安裝NPOI NuGet包併在項目中引用了必要的命名空間。
七、保存數據例子
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
public void SaveDataToExcel(string filePath)
{
// 創建一個新的HSSFWorkbook(適用於.xls格式)或XSSFWorkbook(適用於.xlsx格式)
IWorkbook workbook = new XSSFWorkbook(); // 使用.xlsx格式
// 創建新的工作表並設置名稱
ISheet sheet = workbook.CreateSheet("Sheet1");
// 創建第一行數據
IRow headerRow = sheet.CreateRow(0);
headerRow.CreateCell(0).SetCellValue("Name");
headerRow.CreateCell(1).SetCellValue("Age");
headerRow.CreateCell(2).SetCellValue("City");
// 添加三行數據
for (int i = 1; i <= 3; i++)
{
IRow dataRow = sheet.CreateRow(i);
dataRow.CreateCell(0).SetCellValue($"Person {i}");
dataRow.CreateCell(1).SetCellValue(i * 10); // 年齡假設為i*10
dataRow.CreateCell(2).SetCellValue($"City{i}");
// 設置單元格樣式(可選,例如設置字體加粗和居中)
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
IFont font = workbook.CreateFont();
font.Boldweight = (short)FontBoldWeight.Bold;
style.SetFont(font);
dataRow.Cells[0].CellStyle = style;
}
// 保存到文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(fileStream);
}
// 關閉workbook以釋放資源
workbook.Close();
}
在這個例子中,我們首先創建了一個新的XSSFWorkbook對象,併在其中創建了一個名為"Sheet1"的工作表。接著,我們在表頭添加了列名,並插入了三行示例數據。為了演示單元格樣式的設置,我們將第一列的數據設置為了加粗和居中的樣式。最後,將整個工作簿內容寫入指定路徑的Excel文件。
請註意,根據實際需求選擇創建HSSFWorkbook或XSSFWorkbook,以及調整保存的數據和樣式。確保已安裝NPOI NuGet包併在項目中引用了必要的命名空間。