一、引言
在.NET開(kāi)發(fā)中,操作Office文檔(特別是Excel和Word)是一項(xiàng)常見(jiàn)的需求。然而,在服務(wù)器端或無(wú)Microsoft Office環(huán)境的場(chǎng)景下,直接使用Office Interop可能會(huì)面臨挑戰(zhàn)。為了解決這個(gè)問(wèn)題,開(kāi)源庫(kù)NPOI應(yīng)運(yùn)而生,它提供了無(wú)需安裝Office即可創(chuàng)建、讀取和修改Excel (.xls, .xlsx) 和 Word (.doc) 文件的能力。
二、NPOI簡(jiǎn)介
NPOI是一個(gè)基于.NET的API,用于讀寫(xiě)微軟的OLE 2 Compound Document formats,如Microsoft Office Excel和Word。它是Apache POI項(xiàng)目的.NET移植版本,允許開(kāi)發(fā)者在沒(méi)有安裝Office的情況下處理這些格式的文件。
三、主要組件與方法
1. 安裝與引用Install-Package NPOI
或者在Visual Studio中右鍵項(xiàng)目 -> 管理NuGet程序包 -> 搜索并安裝NPOI。
2. 引用命名空間
using NPOI.SS.UserModel; // Excel相關(guān)的接口和類(lèi)
using NPOI.XSSF.UserModel; // 處理.xlsx文件
using NPOI.HSSF.UserModel; // 處理.xls文件
using System.IO; // 文件操作
3. 創(chuàng)建/打開(kāi)工作簿
- 創(chuàng)建一個(gè)新的Excel工作簿(.xlsx):
var workbook = new XSSFWorkbook();
- 打開(kāi)一個(gè)現(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. 寫(xiě)入單元格數(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)建樣式對(duì)象:
var style = workbook.CreateCellStyle();
- 設(shè)置樣式屬性(如字體、顏色、對(duì)齊方式等):
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();
四、高級(jí)功能
-
讀取現(xiàn)有文件:通過(guò)FileStream打開(kāi)并讀取Excel文件內(nèi)容。
-
讀取公式結(jié)果:通過(guò)ICell.CachedFormulaResultType或ICell.CellFormula屬性獲取公式計(jì)算結(jié)果。
-
操作圖表和圖片:NPOI支持插入、更新和刪除Excel中的圖表和圖片。
-
處理Word文檔:通過(guò)XWPFDocument類(lèi)來(lái)創(chuàng)建、讀取和修改Word(.doc)文件。
五、總結(jié)
NPOI庫(kù)憑借其強(qiáng)大的功能和輕量級(jí)設(shè)計(jì),已成為.NET環(huán)境下處理Office文檔的標(biāo)準(zhǔn)工具之一。無(wú)論是在Web應(yīng)用程序后臺(tái)處理用戶上傳的Excel文件,還是在批處理任務(wù)中生成報(bào)表,NPOI都能提供高效且易于使用的解決方案。通過(guò)深入理解和熟練運(yùn)用NPOI的各種方法,開(kāi)發(fā)者可以輕松應(yīng)對(duì)各種復(fù)雜的文檔處理任務(wù)。
六、完整的讀取數(shù)據(jù)例子
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
public void ReadExcelFile(string filePath)
{
// 創(chuàng)建一個(gè)FileStream對(duì)象來(lái)打開(kāi)Excel文件
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// 根據(jù)文件擴(kuò)展名選擇合適的Workbook實(shí)現(xiàn)
IWorkbook workbook;
if (Path.GetExtension(filePath).ToLower() == ".xlsx")
{
workbook = new XSSFWorkbook(file);
}
else
{
workbook = new HSSFWorkbook(file); // 適用于.xls文件
}
// 獲取第一個(gè)工作表(索引從0開(kāi)始)
ISheet sheet = workbook.GetSheetAt(0);
// 遍歷所有行
for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++)
{
IRow row = sheet.GetRow(rowIndex);
// 如果當(dāng)前行不為空,則遍歷所有單元格
if (row != null)
{
for (int cellIndex = 0; cellIndex < row.LastCellNum; cellIndex++)
{
ICell cell = row.GetCell(cellIndex);
// 檢查單元格是否存在并獲取其數(shù)據(jù)類(lèi)型和值
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:
// 如果需要顯示公式計(jì)算結(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}");
}
// 其他類(lèi)型的公式處理...
break;
default:
// 對(duì)于日期、布爾值等其他類(lèi)型,做相應(yīng)處理
break;
}
}
else
{
Console.WriteLine($"第{rowIndex + 1}行,第{cellIndex + 1}列:空單元格");
}
}
}
}
// 關(guān)閉workbook以釋放資源
workbook.Close();
}
}
在這個(gè)例子中,我們首先打開(kāi)了指定路徑下的Excel文件,并根據(jù)文件類(lèi)型創(chuàng)建了相應(yīng)的HSSFWorkbook或XSSFWorkbook對(duì)象。然后,我們循環(huán)遍歷每一行和每一列,獲取每個(gè)單元格的內(nèi)容,并根據(jù)單元格類(lèi)型輸出對(duì)應(yīng)的值。
請(qǐng)確保已安裝NPOI NuGet包并在項(xiàng)目中引用了必要的命名空間。
七、保存數(shù)據(jù)例子
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
public void SaveDataToExcel(string filePath)
{
// 創(chuàng)建一個(gè)新的HSSFWorkbook(適用于.xls格式)或XSSFWorkbook(適用于.xlsx格式)
IWorkbook workbook = new XSSFWorkbook(); // 使用.xlsx格式
// 創(chuàng)建新的工作表并設(shè)置名稱(chēng)
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();
}
在這個(gè)例子中,我們首先創(chuàng)建了一個(gè)新的XSSFWorkbook對(duì)象,并在其中創(chuàng)建了一個(gè)名為"Sheet1"的工作表。接著,我們?cè)诒眍^添加了列名,并插入了三行示例數(shù)據(jù)。為了演示單元格樣式的設(shè)置,我們將第一列的數(shù)據(jù)設(shè)置為了加粗和居中的樣式。最后,將整個(gè)工作簿內(nèi)容寫(xiě)入指定路徑的Excel文件。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-841142.html
請(qǐng)注意,根據(jù)實(shí)際需求選擇創(chuàng)建HSSFWorkbook或XSSFWorkbook,以及調(diào)整保存的數(shù)據(jù)和樣式。確保已安裝NPOI NuGet包并在項(xiàng)目中引用了必要的命名空間。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-841142.html
到了這里,關(guān)于深入解析C#中的第三方庫(kù)NPOI:Excel和Word文件處理的利器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!