第十八篇:java操作Excel要处理和分辨的几个概念
工具:org.apache.poi
Excel格式:.xls(03,存儲量小些);.xlsx(07以上)?
首先明確這點:給你一個裝滿數據的Excel,并不能保證每行都有數據,每一行并不能保證每個單元格都有數據?
所以要理解以下幾個方法:
1、一個Excel是一個workbook對象(工作薄),一個workbook可能包含好幾個sheet(工作表)?,通常的做法是一個wb里面就放一個sheet,便于操作,所以通常這樣來取第一個?? Sheet sheet = wb.getSheetAt(0);
接下來,為了測試我新建一個test.xls,里面放些這樣的數據
共12行,其中第11行是空的,共8列,其中第六列是空的,第一行第7和8個單元格都有數據,這里都是眼見的第多少行第多少列
2、sheet?
System.out.println(sheet.getFirstRowNum());?????????????????????????????//0,第一行的邏輯索引號
System.out.println(sheet.getLastRowNum());???????????????????????????? //11,最后一行的邏輯索引號
System.out.println(sheet.getPhysicalNumberOfRows());??????????? //11實際有數據的有多少行,所以是去掉了空行
這是sheet的幾個方法,看出來前兩個方法得到的都是邏輯行號,和數據結構的下標索引號一樣的道理
第三個方法,得出的是實際的有數據的行數,過濾掉了第11行這個空行,所以當你讀取Excel時遍歷的范圍最好不要用這個作為上界值,舉一個極端點的例子吧,假設12行有10行是空的,i<?sheet.getPhysicalNumberOfRows()+1也即是i<3,最終只會讀到前面3行,因此用i<sheet.getLastRowNum()+1?
3、row
我們拿第一行作為例子Row row = sheet.getRow(0);
其中第6列是空的,第7.8個單元格都有數據
System.out.println(row.getPhysicalNumberOfCells());???????? //7???一樣的,過濾掉了空的單元格,得出的是有數據的單元格數
System.out.println(row.getFirstCellNum());//0
System.out.println(row.getLastCellNum());//8??????
重點來了,對于每一行來說,遍歷每一行的單元格的時候要注意
row.getFirstCellNum()是一個不確定的數字,不是代表第一個cell的邏輯號是0(通常會這樣認為),他是指某一行中第一個不為空格的單元格的邏輯號(實際列號-1),同理,row.getLastCellNum()指最后一個不為空格的單元格的列號,這樣比較拗口
看如下例子:
第一行的數據??????????????????????????row.getFirstCellNum()??????? row.getLastCellNum()?????
1、2、3、4、5????????????????????????????????? 0?????????????????????????????????????????????????? 5
1、2、3、4、5??? 7、8??????????????????????0???????????????????????????????????????????????????8(第六個空格)
、2、3、4、5???????????????????????????????????1?????????????????????????????????????????????????? 5(第一個是空格)
遍歷行的時候大家喜歡這么寫,假設第一個單元格就是空的,那么直接就報NullPointer錯誤了
for (int i = 0; i < row.getLastCellNum(); i++) {
???System.out.println(row.getCell(i).getStringCellValue());
??}
所以,poi給出 row.getFirstCellNum() 這個方法考慮還是很周全的
以后遍歷的時候直接這么寫
for (int i = row.getFirstCellNum() ; i < row.getLastCellNum(); i++) {
System.out.println(row.getCell(i).getStringCellValue());
}
這樣可以去除所有你要的有數據的值
if(row.getCell(0)==null){
???System.out.println("第一個單元格為空!");?
??}
執行下這個,可以看到空指針錯誤是在調用getStringCellValue())發生的,因為取到的單元格對象為null
所以為了保證將Excel所有范圍內的單元格全部取到,最好是這么干
?總是從第0個索引下標開始
for(int i=0;i<sheet.getLastRowNum()+1;i++ ){
????Row row = sheet.getRow(i);
??? if ( row != null )??{
????????for(int j = 0; j< row.getLastCellNum(); j++){
?????????????Cell cell = row.getCell(j);???
????????????? if ( cell != null ){
????????????????????cell.getValue()…………………?????????????????????????????????????
??????????????}else{
???????????????????? “空單元格”
????????????????}
????????}
????}?else{
?????????? “空行”????????????
????????}?
}?
也不要用迭代器,迭代器會直接忽略空格和空行,除非你真的不需要記錄下空的數據?
轉載于:https://www.cnblogs.com/yb38156/p/9821959.html
總結
以上是生活随笔為你收集整理的第十八篇:java操作Excel要处理和分辨的几个概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习目标
- 下一篇: 2018-2019-1 20189221