C#基于NPOI操作Excel
NPOI簡介
NPOI是指構建在POI 3.x版本之上的一個程序,NPOI可以在沒有安裝Office的情況下對Word或Excel文檔進行讀寫操作。
NPOI是一個開源的C#讀寫Excel、WORD等微軟OLE2組件文檔的項目。
優(yōu)勢
(一)傳統(tǒng)操作Excel遇到的問題:
1、如果是.NET,需要在服務器端裝Office,且及時更新它,以防漏洞,還需要設定權限允許.NET訪問COM+,如果在導出過程中出問題可能導致服務器宕機。
2、Excel會把只包含數(shù)字的列進行類型轉換,本來是文本型的,Excel會將其轉成數(shù)值型的,比如編號000123會變成123。
3、導出時,如果字段內容以“-”或“=”開頭,Excel會把它當成公式進行,會報錯。
4、Excel會根據(jù)Excel文件前8行分析數(shù)據(jù)類型,如果正好你前8行某一列只是數(shù)字,那它會認為該列為數(shù)值型,自動將該列轉變成類似1.42702E+17格式,日期列變成包含日期和數(shù)字的。
(二)使用NPOI的優(yōu)勢
1、您可以完全免費使用該框架
2、包含了大部分EXCEL的特性(單元格樣式、數(shù)據(jù)格式、公式等等)
3、專業(yè)的技術支持服務(24*7全天候) (非免費)
4、支持處理的文件格式包括xls, xlsx, docx.
5、采用面向接口的設計架構( 可以查看 NPOI.SS 的命名空間)
6、同時支持文件的導入和導出
7、基于.net 2.0 也支持xlsx 和 docx格式(當然也支持.net 4.0)
8、來自全世界大量成功且真實的測試Cases
9、大量的實例代碼
11、你不需要在服務器上安裝微軟的Office,可以避免版權問題。
12、使用起來比Office PIA的API更加方便,更人性化。
13、你不用去花大力氣維護NPOI,NPOI Team會不斷更新、改善NPOI,絕對省成本。
14、不僅僅對與Excel可以進行操作,對于doc、ppt文件也可以做對應的操作
NPOI之所以強大,并不是因為它支持導出Excel,而是因為它支持導入Excel,并能“理解”OLE2文檔結構,這也是其他一些Excel讀寫庫比較弱的方面。通常,讀入并理解結構遠比導出來得復雜,因為導入你必須假設一切情況都是可能的,而生成你只要保證滿足你自己需求就可以了,如果把導入需求和生成需求比做兩個集合,那么生成需求通常都是導入需求的子集,這一規(guī)律不僅體現(xiàn)在Excel讀寫庫中,也體現(xiàn)在pdf讀寫庫中,目前市面上大部分的pdf庫僅支持生成,不支持導入。
操作Excel
/// <summary> /// 基于NPOI操作Excel /// </summary> public void ExportExcel() { string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Excel\\"; string fileName = filePath + "TestExcel_" + DateTime.UtcNow.ToString("yyyyMMddHHmmss") + ".xlsx"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { XSSFWorkbook workbook = new XSSFWorkbook(); //創(chuàng)建單元格樣式 ICellStyle cellStyle = workbook.CreateCellStyle(); //設置為文本格式,也可以為 text,即 dataFormat.GetFormat("text"); cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; //下邊框線 cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; //左邊框線 cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; //右邊框線 cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; //上邊框線 //設置頁簽名 ISheet sheet = workbook.CreateSheet("導出號段"); //設置列寬 sheet.SetColumnWidth(4, 10 * 500);//第五列 BTMAC sheet.SetColumnWidth(5, 10 * 500);//第六列 WifiMAC1 sheet.SetColumnWidth(6, 10 * 500);//第七列 WifiMAC2 sheet.SetColumnWidth(7, 10 * 500);//第八列 HARD_CODE sheet.SetColumnWidth(8, 10 * 500);//第九列 QR_CODE //Excel表頭欄位 string[] excelHeader = new string[] { "IMEI1", "IMEI2", "MEID", "MSN編號", "藍牙MAC地址", "無線MAC地址1", "無線MAC地址2", "HARD_CODE", "QR_CODE", "TOKEN", "KEYMASTER" }; //設置表頭字段 IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < excelHeader.Length; i++) { headerRow.CreateCell(i).SetCellValue(excelHeader[i]); } //展開的數(shù)量 int count = int.Parse(LoginInfo.QTY); //十六進制轉為十進制 Int64 StarthardCode = Int64.Parse(LoginInfo.HardCode, NumberStyles.HexNumber); Int64 StartbtMAC = Int64.Parse(LoginInfo.BTMAC, NumberStyles.HexNumber); Int64 StartWifiMAC1 = Int64.Parse(LoginInfo.WiFiMAC1, NumberStyles.HexNumber); Int64 StartWifiMAC2 = 0; if (LoginInfo.IsEnableWiFiMAC2) { StartWifiMAC2 = Int64.Parse(LoginInfo.WiFiMAC2, NumberStyles.HexNumber); } //填充Excel for (int i = 0; i < count; i++) { IRow row = sheet.CreateRow(i + 1); //BTMAC Int64 current_btMAC = StartbtMAC + i; //轉回十六進制,大寫 //string strCurrent_btMAC = Convert.ToString(current_btMAC, 16).ToUpper(); string strCurrent_btMAC = current_btMAC.ToString("X").ToUpper(); row.CreateCell(4).SetCellValue(strCurrent_btMAC); //WifiMAC1 Int64 current_WifiMAC1 = StartWifiMAC1 + i; //轉回十六進制,大寫 string strCurrent_WifiMAC1 = current_WifiMAC1.ToString("X").ToUpper(); row.CreateCell(5).SetCellValue(strCurrent_WifiMAC1); //WifiMAC2 if (LoginInfo.IsEnableWiFiMAC2) { Int64 current_WifiMAC2 = StartWifiMAC2 + i; //轉回十六進制,大寫 string strCurrent_WifiMAC2 = current_WifiMAC2.ToString("X").ToUpper(); row.CreateCell(6).SetCellValue(strCurrent_WifiMAC2); } //HardCode Int64 current_HardCode = StarthardCode + i; //轉回十六進制,小寫 string strCurrent_HardCode = current_HardCode.ToString("X").ToLower(); row.CreateCell(7).SetCellValue(strCurrent_HardCode); } workbook.Write(fs); //寫入到Excel中 } }
到此這篇關于C#基于NPOI操作Excel的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
解決C# winForm自定義鼠標樣式的兩種實現(xiàn)方法詳解
本篇文章是對在C#中winForm自定義鼠標樣式的兩種實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05