C#使用NPOI進行Excel和Word文件處理
一、引言
在.NET開發(fā)中,操作Office文檔(特別是Excel和Word)是一項常見的需求。然而,在服務(wù)器端或無Microsoft Office環(huán)境的場景下,直接使用Office Interop可能會面臨挑戰(zhàn)。為了解決這個問題,開源庫NPOI應(yīng)運而生,它提供了無需安裝Office即可創(chuàng)建、讀取和修改Excel (.xls, .xlsx) 和 Word (.doc) 文件的能力。
二、NPOI簡介
NPOI是一個基于.NET的API,用于讀寫微軟的OLE 2 Compound Document formats,如Microsoft Office Excel和Word。它是Apache POI項目的.NET移植版本,允許開發(fā)者在沒有安裝Office的情況下處理這些格式的文件。
三、主要組件與方法
1. 安裝與引用
Install-Package NPOI
或者在Visual Studio中右鍵項目 -> 管理NuGet程序包 -> 搜索并安裝NPOI。
2. 引用命名空間
using NPOI.SS.UserModel; // Excel相關(guān)的接口和類 using NPOI.XSSF.UserModel; // 處理.xlsx文件 using NPOI.HSSF.UserModel; // 處理.xls文件 using System.IO; // 文件操作
3. 創(chuàng)建/打開工作簿
創(chuàng)建一個新的Excel工作簿(.xlsx):
var workbook = new XSSFWorkbook();
打開一個現(xiàn)有的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. 創(chuàng)建/獲取工作表
創(chuàng)建新的工作表:
ISheet sheet = workbook.CreateSheet("Sheet1");
獲取已存在的工作表:
ISheet sheet = workbook.GetSheetAt(0); // 獲取索引為0的工作表
5. 寫入單元格數(shù)據(jù)
創(chuàng)建行與單元格:
IRow row = sheet.CreateRow(rowIndex); ICell cell = row.CreateCell(columnIndex);
設(shè)置單元格值:
cell.SetCellValue("文本內(nèi)容"); // 文本 cell.SetCellValue(12345); // 數(shù)字
6. 合并單元格
var region = new CellRangeAddress(startRow, endRow, startColumn, endColumn); sheet.AddMergedRegion(region);
7. 設(shè)置單元格樣式
創(chuàng)建樣式對象:
var style = workbook.CreateCellStyle();
設(shè)置樣式屬性(如字體、顏色、對齊方式等):
style.Alignment = HorizontalAlignment.Center; IFont font = workbook.CreateFont(); font.Boldweight = (short)FontBoldWeight.Bold; style.SetFont(font);
應(yīng)用到單元格:
cell.CellStyle = style;
8. 保存文件
FileStream outputStream = new FileStream("output.xlsx", FileMode.Create); workbook.Write(outputStream); outputStream.Close();
9. 關(guān)閉資源
確保關(guān)閉Workbook以及相關(guān)的文件流以釋放資源:
workbook.Close(); file.Close();
四、高級功能
- 讀取現(xiàn)有文件:通過FileStream打開并讀取Excel文件內(nèi)容。
- 讀取公式結(jié)果:通過ICell.CachedFormulaResultType或ICell.CellFormula屬性獲取公式計算結(jié)果。
- 操作圖表和圖片:NPOI支持插入、更新和刪除Excel中的圖表和圖片。
- 處理Word文檔:通過XWPFDocument類來創(chuàng)建、讀取和修改Word(.doc)文件。
五、總結(jié)
NPOI庫憑借其強大的功能和輕量級設(shè)計,已成為.NET環(huán)境下處理Office文檔的標準工具之一。無論是在Web應(yīng)用程序后臺處理用戶上傳的Excel文件,還是在批處理任務(wù)中生成報表,NPOI都能提供高效且易于使用的解決方案。通過深入理解和熟練運用NPOI的各種方法,開發(fā)者可以輕松應(yīng)對各種復雜的文檔處理任務(wù)。
六、完整的讀取數(shù)據(jù)例子
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.IO; public void ReadExcelFile(string filePath) { // 創(chuàng)建一個FileStream對象來打開Excel文件 using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { // 根據(jù)文件擴展名選擇合適的Workbook實現(xiàn) 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); // 檢查單元格是否存在并獲取其數(shù)據(jù)類型和值 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: // 如果需要顯示公式計算結(jié)果,使用CachedFormulaResultType if (cell.CachedFormulaResultType == CellType.Numeric) { double formulaValue = cell.NumericCellValue; Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列(公式結(jié)果):{formulaValue}"); } else if (cell.CachedFormulaResultType == CellType.String) { string formulaValue = cell.StringCellValue; Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列(公式結(jié)果):{formulaValue}"); } // 其他類型的公式處理... break; default: // 對于日期、布爾值等其他類型,做相應(yīng)處理 break; } } else { Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列:空單元格"); } } } } // 關(guān)閉workbook以釋放資源 workbook.Close(); } }
在這個例子中,我們首先打開了指定路徑下的Excel文件,并根據(jù)文件類型創(chuàng)建了相應(yīng)的HSSFWorkbook或XSSFWorkbook對象。然后,我們循環(huán)遍歷每一行和每一列,獲取每個單元格的內(nèi)容,并根據(jù)單元格類型輸出對應(yīng)的值。
請確保已安裝NPOI NuGet包并在項目中引用了必要的命名空間。
七、保存數(shù)據(jù)例子
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.IO; public void SaveDataToExcel(string filePath) { // 創(chuàng)建一個新的HSSFWorkbook(適用于.xls格式)或XSSFWorkbook(適用于.xlsx格式) IWorkbook workbook = new XSSFWorkbook(); // 使用.xlsx格式 // 創(chuàng)建新的工作表并設(shè)置名稱 ISheet sheet = workbook.CreateSheet("Sheet1"); // 創(chuàng)建第一行數(shù)據(jù) IRow headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("Name"); headerRow.CreateCell(1).SetCellValue("Age"); headerRow.CreateCell(2).SetCellValue("City"); // 添加三行數(shù)據(jù) for (int i = 1; i <= 3; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"Person {i}"); dataRow.CreateCell(1).SetCellValue(i * 10); // 年齡假設(shè)為i*10 dataRow.CreateCell(2).SetCellValue($"City{i}"); // 設(shè)置單元格樣式(可選,例如設(shè)置字體加粗和居中) 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); } // 關(guān)閉workbook以釋放資源 workbook.Close(); }
在這個例子中,我們首先創(chuàng)建了一個新的XSSFWorkbook對象,并在其中創(chuàng)建了一個名為"Sheet1"的工作表。接著,我們在表頭添加了列名,并插入了三行示例數(shù)據(jù)。為了演示單元格樣式的設(shè)置,我們將第一列的數(shù)據(jù)設(shè)置為了加粗和居中的樣式。最后,將整個工作簿內(nèi)容寫入指定路徑的Excel文件。
請注意,根據(jù)實際需求選擇創(chuàng)建HSSFWorkbook或XSSFWorkbook,以及調(diào)整保存的數(shù)據(jù)和樣式。確保已安裝NPOI NuGet包并在項目中引用了必要的命名空間。
到此這篇關(guān)于C#使用NPOI進行Excel和Word文件處理的文章就介紹到這了,更多相關(guān)C# NPOI處理文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用IronPython調(diào)用python代碼的實現(xiàn)示例
本文主要介紹了在C#中使用IronPython調(diào)用Python代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-01-01詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法
這篇文章主要介紹了詳解借助.NET框架中的XmlTextReader類讀取XML的方法,這種方式的執(zhí)行效率還是比較令人滿意的,需要的朋友可以參考下2016-04-04C#實現(xiàn)文件與字符串互轉(zhuǎn)的方法詳解
這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)文件與字符串互轉(zhuǎn)效果,文中的示例代碼講解詳細,對我們學習C#有一定幫助,需要的可以參考一下2022-08-08C#中數(shù)據(jù)的傳遞以及ToolStripProgressBar
本文主要介紹了C#的數(shù)據(jù)傳遞方法以及ToolStripProgressBar進度條的使用。希望對大家有所幫助,話不多說,請看下面代碼2016-11-11C# 兩種方式反編譯修改源碼(dnspy,ildasm & ilasm)
這篇文章主要介紹了C# 兩種方式反編譯修改源碼(dnspy,ildasm & ilasm),幫助大家更好的理解和使用c#語言,感興趣的朋友可以了解下2020-11-11