分析
解析Excel首先就要解析Excel的結構.然后用面向對象的思想分析一下
![]()
這是一個excel文件.下面我們就來分析一下如果讓你寫這個poi框架,那么你會怎么設計.
1. 首先要有一個對象表示這整個Excel文件.
2. 可是這個excel文件中有好多頁.Sheet1, Sheet2等等,所以我們還需要一個對象表示頁.
3. 在頁中,有行,所以還需要一個對象表示行.
4. 在行中,最后細分到格cell.
5. 格cell中數據還有好多類型.有字符串,數字,時間等等.
POI中的對象與excel對象的對應
excel文件就有多種類型了.后綴有 xls 與 xlsx
![]()
所以對於不同類型的文件,就需要使用不同的poi中的對象了.
1. 如果你要解析的是xls文件![]()
從代碼不難發現,這里的處理邏輯是
1>. 先用inputstream獲取excel文件的io流
2>. 然后創建一個內存中的excel文件HSSFWorkbook類型對象.這個對象表示了整個excel文件.
3>. 對這個excel文件的每頁做循環處理
4>. 對每頁中的每行做循環處理.
5>. 對每行中的每個單元格做做處理,獲取這個單元格的值.
6>. 把這行的結果添加到一個List數組中.
7>. 把每行的結果添加到最后的總結果中.
8>. 解析完以后就獲取了一個List< List < String > > 類型的對象了.
2. 如果你要處理xlsx類型的文件則![]()
和上面一樣,我就不說了.
存在的問題
其實有時候我們希望得到的數據就是excel中的數據,可是最后發現結果不理想
如果你的excel中的數據是數字,你會發現Java中對應的變成了科學計數法的.
所以在獲取值的時候就要做一些特殊處理.
這樣就能保證獲取的值是我想要的值.
網上的做法是對於數值類型的數據格式化,獲取自己想要的結果.
其實也沒有那么麻煩.我在做的時候突然想到了一種處理解決方案.供參考
我們看一下poi中對於的toString()方法![]()
該方法是poi的方法,從源碼中我們可以發現,該處理流程是
1. 獲取單元格的類型
2. 根據類型格式化數據並輸出.這不一下子就造成了很多不是我們想要的.
所以我們就要改造一下這個方法例如這樣![]()
我的做法是這樣的
1. 對於不熟悉的類型,或者為空則返回”” 控制串.
2.如果是數字,則修改單元格類型為String,然后返回String.這樣就保證數字不被格式化了.
3. 雖然不知道這么做有什么后果,可是成功了.
注:需要導入的jar包: