1. 關於NPOI
NPOI是一個開源的用於在C#程序中讀寫Excel、WORD等微軟OLE2組件文檔的項目,使用NPOI可以在沒有安裝Office的情況下對Word或Excel文檔進行讀寫操作。
2. 使用NPOI的好處
- C#程序中操作Excel的另外一種方法是使用.NET自帶的Excel API,但是這種方法需要運行環境安裝微軟的Excel,而使用NPOI可以在沒有安裝Microsoft Office Excel的設備上對Excel進行操作。
- 因為服務器一般不安裝office這么龐大的辦公軟件,所以NPOI適合在服務器端生成數據文件。
- 幾乎支持所有的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
轉載請注明出處,謝謝!