去年項目有一個子模塊需要解析上百張不一樣的excel表格入庫,當時用的NPOI,做了很久...也嘗試想把代碼分享到oschina,結果沒堅持兩篇就放棄了。
趕巧的是,昨天運營那邊提出要錄入一些基礎數據,我想着也就幾百個員工、企業的信息,自己找兩個姑娘手動錄入唄(為啥是姑娘?讓一個大老爺們去錄假數據,你去嗎?反正我不去)...結果,一個同事吭哧吭哧跑來找我:
“手動錄入太慢了,填一堆基本信息,還要傳頭像,傳身份證,傳營業執照什么的”
嗯哼!想讓我寫代碼給你們錄?沒門!
於是忽悠道“唉,找領導多要幾個人唄。你看我就算給你寫代碼上傳,你也得先整理好excel,圖片單獨在文件夾存好,還得能和excel的數據匹配起來,等你做完這些,早該手動錄完了...”
那同事晃悠着腦袋想了想,說“幾萬條數據呢,手動錄得猴年馬月了。再說數據格式本來就很整齊,圖片也能和名字匹配上”...然后嘻嘻的望着我
窩艹,怎么感覺挖坑把自己埋了。再說,尼瑪現在的運營假數據都是上萬條上萬條的入庫了?我們這些小碼農還是太呆啊...
自己挖的坑,含着淚也得填完。
這不,今天又翻出了去年那個項目的代碼和資料,撲哧撲哧的干活...
先來介紹一下NPOI基本的東西:
1.下載地址:http://npoi.codeplex.com (最新版已經2.2.0.0了)
2.包里面的DLL文件:
NPOI.dll
OOXML.dll
OpenXml4Net.dll
OpenXmlFormats.dll
ICSharpCode.SharpZipLib.dll
3.NPOI 2.0以后的版本都支持OOXML(EXCEL2007及以上版本)。帶XSSF的命名空間支持07及以上,HSSF支持03版本。
XSSF中XSSFWorkbook,XSSFSheet,XSSFRow,XSSFCell分別對應EXCEL中工作簿,工作表,行,列。
HSSF中同樣有HSSFWorkbook,HSSFSheet,HSSFRow,HSSFCell
它們繼承於同一個接口:IWorkbook(命名空間:using NPOI.SS.UserModel;)
可以用如下代碼做版本判斷(暫時只考慮.xls與.xlsx文件,博主沒用.csv)
IWorkbook workbook = null; if(System.IO.Path.GetExtension(filePath)=="xls") { workbook = new HSSFWorkbook(ExcelFileStream); } else if(System.IO.Path.GetExtension(filePath)=="xlsx") { workbook = new XSSFWorkbook(ExcelFileStream); } else { throw new exception("文件類型錯誤"); }
4.常用的基本方法:
創建工作簿 IWorkbook workbook = new XSSFWorkbook();
按指定名稱創建Sheet workbook.CreateSheet("SheetName");
移出Sheet workbook.RemoveSheetAt(SheetIndex);
按名稱獲得Sheet對象 ISheet sheet = workbook.GetSheet("SheetName ");
根據索引獲得Sheet對象 ISheet sheet = workbook.GetSheetAt(SheetIndex);
獲得某一個ISheet的所有IRow,通常可以用 ISheet.GetRowEnumerator()
獲得某一特定行,可以直接用 ISheet.GetRow(rowIndex)
工作表中第一個有數據行的行號 ISheet.FirstRowNum
工作表中最后一個有數據行的行號 ISheet.LastRowNum
一行中第一個有數據列的列號 IRow.FirstCellNum
一行中最后一個有數據列的列號 IRow.LastCellNum
獲取sheet所有合並單元格索引 ISheet.NumMergedRegions
獲取某合並單元格的地址(i是合並單元格索引) ISheet.GetMergedRegion(i)
獲得數據類型CellRangeAddress,含起始行號和列號
獲取某單元格值 Row.GetCell(j).StringCellValue.Trim()
公式單元格如果是數字可以:Row.GetCell(j).NumericCellValue.ToString()
5.NPOI.DLL中包含的模塊
NPOI.Util 基礎輔助庫
NPOI.POIFS OLE2格式讀寫庫,主要負責處理DocumentInformation
NPOI.DDF Microsoft Drawing格式讀寫庫
NPOI.SS Excel 2003和Excel 2007操作庫共用的接口庫以及公用模塊實現,如公式計算庫
NPOI.HPSF OLE2的Summary Information和Document Summary Information屬性讀寫庫
NPOI.HSSF Excel BIFF格式讀寫庫,這是用戶用的最多的命名空間
6.NPOI.OOXML.DLL中包含的模塊(主要是2007版本操作方法)
NPOI.XSSF Excel 2007操作庫,大部分對象都實現了NPOI.SS的接口
NPOI.XWPF Word 2007操作庫
7.EXCEL單元格值基本類型
Unknown = -1, // 未知
Numeric = 0, // 數值型
String = 1, // 文本型
Formula = 2, // 公式型
Blank = 3, // 空白
Boolean = 4, // 布爾型
Error = 5, // 錯誤
感覺基本常用的就是這些,需要用到其它接口可以直接查API。
今天也是把NPOI再復習一遍,寫了一些基本的操作代碼和上傳設計。明天上傳方法寫好再繼續貼出來分享給大家....
博主的基本思想是,對每一個excel模板都做一個對應的XML配置文件,里面是規則集。然后所有模板的excel上傳均通過一個方法,解析數據與規則集,最后反射到DTO,再根據業務映射到不同實體,調用不同ADD服務入庫
若果大家有比較好的其他開源的操作excel的組件,也歡迎指教。很久不做這一塊,不太了解行情了...
原創文章,代碼都是從自己項目里貼出來的(或者自己挨條整理的)。轉載請注明出處哦,親~~~