基於NPOI對Excel進行簡單的操作


1. 關於NPOI

  NPOI是一個開源的用於在C#程序中讀寫Excel、WORD等微軟OLE2組件文檔的項目,使用NPOI可以在沒有安裝Office的情況下對Word或Excel文檔進行讀寫操作。

2. 使用NPOI的好處

  1. C#程序中操作Excel的另外一種方法是使用.NET自帶的Excel API,但是這種方法需要運行環境安裝微軟的Excel,而使用NPOI可以在沒有安裝Microsoft Office Excel的設備上對Excel進行操作。
  2. 因為服務器一般不安裝office這么龐大的辦公軟件,所以NPOI適合在服務器端生成數據文件。
  3. 幾乎支持所有的Office97~Office2007的文件格式。

3.  NPOI使用方法

  NPOI里面的管理層次為:workbook->worksheet->row->cell,類比關系型數據庫就是:

NPOI

說明

關系型數據庫

workbook

Excel文件

database

worksheet

工作表

table

row

record記錄

cell

單元格

field字段

3.1 獲取DLL

   方式1:用Nuget命令行安裝NPOI引用

Install-Package NPOI -Version 2.4.0

   方式2:直接在VS的Nuget包管理器中搜索“NPOI”獲取

3.2 將NPOI的DLL導入工程

using NPOI; //基礎輔助庫
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;

   其中,NPOI 使用 HSSFWorkbook 類來處理 xls,XSSFWorkbook 類來處理 xlsx,它們都繼承接口 IWorkbook,因此可以通過 IWorkbook 來統一處理 xls 和 xlsx 格式的文件。(本文以XLSX為例)

3.3 創建和讀寫Excel

  (1)  創建Excel文件

XSSFWorkbook workbook2007 = new XSSFWorkbook(); //創建xlsx工作簿
HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿

  Excel規定一個Workbook必須至少帶1個Sheet,所以創建Excel之后必須同時創建Sheet的代碼才能保證生成的文件正常。

ISheet sheet = workbook2007.CreateSheet("sheet1"); //創建一個Sheet

       創建行和列的方式:

IRow row = sheet.CreateRow(0); //創建一行
ICell cell = row.CreateCell(0); //創建一列

  創建XSSFWorkbook實例之后,要將其寫入文件:

FileStream file =new FileStream(@"NpoiTest.xlsx", FileMode.Create);
workbook2007.Write(file);
file.Close();
workbook2007.Close();

   之后會在指定目錄下生成Excel文件。

  (2)  向Excel文件寫入數據

  寫數據要遵循一定的順序,可以概括為:讀取(或新建一個工作簿)->獲取工作表->對工作表添加行->對每一行添加單元格->對單元格賦值。

XSSFWorkbook workbook2007 = new XSSFWorkbook(); //創建xlsx工作簿
workbook2007.CreateSheet("Sheet1");  //新建1個Sheet工作表
//ISheet sheet = workbook2007.CreateSheet("Sheet1");
HSSFSheet SheetOne = (HSSFSheet)workbook2007.GetSheet("Sheet1"); //獲取名稱為Sheet1的工作表
//對工作表先添加行,下標從0開始
for (int i = 0; i < 2; i++)
{
    SheetOne.CreateRow(i); //為SheetOne添加2行
    //IRow row = SheetOne.CreateRow(i);
}
//對每一行創建3個單元格
HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(0);  //獲取Sheet1工作表的首行
HSSFCell[] SheetCell = new HSSFCell[3];
for (int i = 0; i < 3; i++)
{
    SheetCell[i] = (HSSFCell)SheetRow.CreateCell(i);  //為第一行創建3個單元格
    //ICell headcell = SheetRow.CreateCell(i);
}
//創建之后就可以賦值了
SheetCell[0].SetCellValue("CellValue");        
SheetCell[1].SetCellValue("CellValue2");
SheetCell[2].SetCellValue("CellValue3");
FileStream file2007 = new FileStream(@"E:\Excel2007.xls", FileMode.Create);
workbook2007.Write(file2007);
file2007.Close();
workbook2007.Close();

//轉化為字節數組
//MemoryStream ms = new MemoryStream();
//workbook.Write(ms);
//ms.Flush();
//ms.Position = 0;
//return ms; 

  (3)  讀取Excel文件數據

  workbook的寫入需要借助於FileStream來打開一個文件流,在創建FileStream的時候,可以傳入數據的保存路徑和文件名。

  HSSFWorkbook類和XSSFWorkbook類都繼承自IWorkbook類,所以在不知道所要讀取的Excel文件時xls還是xlsx時,可以使用IWorkbook來聲明一個通用的工作簿變量,隨后根據傳入的文件名判斷是xls還是xlsx。

IWorkbook workbook = null;  //新建IWorkbook對象
string fileName = "E:\\Excel2007.xls";
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
{
    workbook = new XSSFWorkbook(fileStream);  //xlsx數據讀入workbook
}
else if (fileName.IndexOf(".xls") > 0) // 2003版本
{
    workbook = new HSSFWorkbook(fileStream);  //xls數據讀入workbook
}
ISheet sheet = workbook.GetSheetAt(0);  //獲取第一個工作表
IRow row;// = sheet.GetRow(0); //新建當前工作表行數據
for (int i = 0; i < sheet.LastRowNum; i++)  //對工作表每一行
{
    row = sheet.GetRow(i);   //row讀入第i行數據
    if (row != null)
    {
        for (int j = 0; j < row.LastCellNum; j++)  //對工作表每一列
        {
            string cellValue = row.GetCell(j).ToString(); //獲取i行j列數據
            Console.WriteLine(cellValue);
        }
    }
}
Console.ReadLine();
fileStream.Close();
workbook.Close();

3.4 Excel樣式設置

  (1)  設置字體

ICellStyle style = workbook.CreateCellStyle();//創建樣式對象
IFont font = workbook.CreateFont(); //創建一個字體樣式對象
font.FontName = "方正舒體"; //和excel里面的字體對應
font.Color = new HSSFColor.PIN.Index();//顏色參考NPOI的顏色對照表 (對照表見參考網址(參考文檔2))
font.IsItalic = true; //斜體(下划線?)
font.FontHeightInPoints = 16;//字體大小
font.Boldweight = short.MaxValue;//字體加粗
style.SetFont(font); //將字體樣式賦給樣式對象
cell.CellStyle = style; //把樣式賦給單元格

   (2)  設置單元格前景色

ICellStyle style=workbook.CreateCellStyle();
style.FillForegroundColor = 14; //具體數字代表的顏色看NPOI顏色對照表
style.FillPattern = FillPatternType.SOLID_FOREGROUND;

style.FillForegroundColor = HSSFColor.Blue.Index;//選中后文字背景
style.FillBackgroundColor = HSSFColor.Red.Index;//選中后單元格背景
style.FillPattern = FillPattern.AltBars;

   (3)  設置單元格寬高

row.Height = 30 * 20;    //行高,行高為30
sheet.SetColumnWidth(3, 13 * 256)   //列寬,第4列的列寬為13

   (4)  合並單元格

  單元格合並后,樣式以左上角的單元格為准。

sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10));
//CellRangeAddress四個參數為:起始行,結束行,起始列,結束列

   (5)  單元格水平居中和對齊

style.Alignment = HorizontalAlignment.CENTER;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//水平對齊
style.VerticalAlignment = VerticalAlignment.Center;//垂直對齊

   (6)  設置公式

cell.SetCellFormula = "公式"; //公式中不需要寫“=”號

   (7)  設置邊框

  分別設置上下左右邊框樣式

style.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.THICK;

  分別設置上下左右邊框顏色

style.TopBorderColor = HSSFColor.OliveGreen.Blue.Index;
style.BottomBorderColor = HSSFColor.OliveGreen.Blue.Index;
style.LeftBorderColor = HSSFColor.OliveGreen.Blue.Index;
style.RightBorderColor = HSSFColor.OliveGreen.Blue.Index;

   (8)  其它

style.WrapText = true; //自動換行
style.Indention = 0;//縮進 

3.5 用類CSS的方法設置單元格樣式

  NPOI.CSS是一個可以在使用NPOI時用類CSS的方法設置單元格樣式的NPOI擴展,支持.NET4及以上版本的項目。

   (1)  引用NPOI.CSS.dll

using NPOI.CSS;

   (2)  設置單元格樣式

cell.CSS("color:red;font-weight:bold;font-size:11;font-name:宋體;border-type:thin;");

  具體樣式參數見參考網址(參考文檔3)。

  (網上好像很難找到NPOI.CSS.dll的資源,需要的朋友可以直接在Github(參考文檔3)找到源碼,然后編譯生成。)

 

參考文檔:

  1.文檔讀寫相關:

  https://blog.csdn.net/dcrmg/article/details/52356236

  2. 樣式設置相關:

  https://www.cnblogs.com/nxxshxf/p/6410797.html

  https://blog.csdn.net/qq_35957944/article/details/85163316

  3. NPOI.CSS屬性:

  https://github.com/qihangnet/NPOI.CSS

 


原文地址:https://www.cnblogs.com/imdeveloper/p/10963364.html
轉載請注明出處,謝謝!


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM