JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java Tools  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 使用POI讀excel時的問題?
jianns





發文: 69
積分: 0
於 2009-02-07 01:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我有一個excel檔,有14個column,但同樣在第12個column裡,在不同的row中有的有值(文字),有的沒有值,當我用POI的HSSF中要by row讀進excel時,當讀到空的cell時,就會有"java.lang.NullPointerException"的例外產生,然後程式就當了,是不是POI沒有辦法讀空的cell?

reply to postreply to post
作者 Re:使用POI讀excel時的問題? [Re:jianns]
yoyoma1022





發文: 3
積分: 0
於 2009-02-08 02:38 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
用 exception去控制,如果null point 就是這欄位沒有東西

reply to postreply to post
作者 Re:使用POI讀excel時的問題? [Re:jianns]
jianns





發文: 69
積分: 0
於 2009-02-08 23:09 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我是用雙迴圈去讀進每一個cell,可是依據POI API Document對使用HSSFCell.getRichTextString()的說明

public HSSFRichTextString getRichStringCellValue()

get the value of the cell as a string - for numeric cells we throw an exception. For blank cells we return an empty string. For formulaCells that are not string Formulas, we return empty String

它可以處理空值,而且說明中也沒有說會產生exception。


reply to postreply to post
作者 Re:使用POI讀excel時的問題? [Re:jianns]
koji

秒速5センチメートル

站長

發文: 8420
積分: 19
於 2009-02-09 00:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
for numeric cells we throw an exception
所以他把它當作數值了?

那你看看是不是格子設定是數值呢?
先確認一下是不是自己搞錯了
不然就在exception內在呼叫
getNumericCellValue
看看他可不可以過?

koji


reply to postreply to post
JCConf Taiwan 2015 開始售票了!!
Facebook上的TWJUG社團,歡迎加入
作者 Re:使用POI讀excel時的問題? [Re:jianns]
jianns





發文: 69
積分: 0
於 2009-02-09 23:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我有用Excel將儲存格的格式設為文字,一樣產生問題,

然後我再試著用HSSFCell.getCellType(),想要看看儲存格的格式是文字還是數字,也一樣有問題,也就是連讀Cell的格式都會讀不到耶!

然後我再用HSSFRow.getPhysicalNumberOfCells(),想看看一個Row裡有幾個cell,結果如果每個cell裡都有值的話,假設是14,那如果有一個cell裡沒有值,結果就是13。


reply to postreply to post
作者 Re:使用POI讀excel時的問題? [Re:jianns]
shikua





發文: 62
積分: 0
於 2009-02-10 18:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近也碰到相同的問題
不過是發現怎麼改在EXCEL下改格式一樣沒用
所以上網找了一下
改成自己判斷型態方式去做就沒有這種問題了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    /**
     * 把傳入的cell欄位值抓出來
     * @param cell
     * @return
     */
public static String getCellValue(HSSFRow row ,int cell_index){
    HSSFCell cell = row.getCell(cell_index);
    String result = "";
    if (cell == null)
        return result;
 
    int ctype = cell.getCellType();
    if (ctype == HSSFCell.CELL_TYPE_STRING)
        result = cell.getRichStringCellValue().getString();
    else if (ctype == HSSFCell.CELL_TYPE_NUMERIC){
        if (HSSFDateUtil.isCellDateFormatted(cell)) { // 是否為日期型
          result = dateToString(cell.getDateCellValue(), "yyyy-MM-dd");
        }else { // 是否為數值型
          double d = cell.getNumericCellValue();
          if (d-(int)d < Double.MIN_VALUE) { // 是否為int型
            result = Integer.toString((int)d);
          } else { // 是否為double型
            result = Double.toString(cell.getNumericCellValue());
          }
        }
    }else if (ctype == HSSFCell.CELL_TYPE_BOOLEAN)
        result = String.valueOf(cell.getBooleanCellValue());
    else
        result = cell.toString();
 
    return result;
}


reply to postreply to post
作者 Re:使用POI讀excel時的問題? [Re:jianns]
jianns





發文: 69
積分: 0
於 2009-02-10 21:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝你的提示,問題已經解決。

我的方法是每謮一個cell時,就判斷是不是null,如果是null,就設定為預設值,如果不是,就讀取cell的值。

不過和你不同的是,我為每一個可能為null的cell都寫一個判斷,因為我有些是數值,我不想在副程式先將數值轉成String,再在主程式再轉回數值,因而降低程式效率。

以下是程式片斷,大家參考看看!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    for(int i=firstRowNum+1;i<=lastRowNum;++i){
      
      row = rawDataSheet.getRow(i);
      rawDataItem = new RawDataItem();
      
      rawDataItem.trDate = row.getCell(0).getDateCellValue();//trDate
      rawDataItem.projectName = row.getCell(1).getRichStringCellValue().getString();//projectName;
      rawDataItem.trialQty = row.getCell(2).getNumericCellValue();//trialQty;
      rawDataItem.fgItem = row.getCell(3).getRichStringCellValue().getString();//fgItem;
      rawDataItem.type = row.getCell(4).getRichStringCellValue().getString();//type;
      rawDataItem.trForm = row.getCell(5).getRichStringCellValue().getString();//trForm;
      rawDataItem.bomLh1 = row.getCell(6).getRichStringCellValue().getString();//bomLh1;
      rawDataItem.item = row.getCell(7).getRichStringCellValue().getString();//item;
      
      if(row.getCell(8) == null){
        rawDataItem.description = "";
      }
      else{
        rawDataItem.description = row.getCell(8).getRichStringCellValue().getString();//description;
      }
      
      if(row.getCell(9) == null){
        rawDataItem.lifeCyclePhase = "";
      }
      else{
        rawDataItem.lifeCyclePhase = row.getCell(9).getRichStringCellValue().getString();//lifeCyclePhase;
      }
      
      rawDataItem.qtyUnit = row.getCell(10).getNumericCellValue();//qtyUnit;
            
      if(row.getCell(11) == null){
        rawDataItem.status="";
      }
      else{
        rawDataItem.status = row.getCell(11).getRichStringCellValue().getString();
      }      
      
      rawDataItem.MRP = row.getCell(12).getNumericCellValue();//MRP;
      rawDataItem.showMCL = row.getCell(13).getNumericCellValue();//showMCL;
      
      rawDataItem.useQty = rawDataItem.trialQty * rawDataItem.qtyUnit;//useQty
      rawDataItem.shortage = rawDataItem.useQty;//shortage  
      
      rawDataVector.add(rawDataItem);    
    }


jianns edited on 2009-02-10 21:31
reply to postreply to post
» JWorld@TW »  Java Tools

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8