NPOI操作EXCEL(一)——npoi基礎


去年項目有一個子模塊需要解析上百張不一樣的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的組件,也歡迎指教。很久不做這一塊,不太了解行情了...

 

原創文章,代碼都是從自己項目里貼出來的(或者自己挨條整理的)。轉載請注明出處哦,親~~~


免責聲明!

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



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