2012年10月11日 星期四

jexcelapi之讀取!

閒言閒語


喔呵,終於來到讀取篇了~~

其實讀取比寫入要簡單多了!

所以呢,要給自己找點事做

就做了個"角色搜尋"的程式,這也是以後要用到的~


程式架構


兩個java檔+一個xls設定檔
點擊可以放大(應該吧。。。)





  • FindMyRole.java裡面有主要程式
    • main方法:只有呼叫myFrame();這樣而已。。。 
    • myFrame方法:GUI介面,含有一個搜尋框、按鈕、最後可以跑出結果的JLabel
    • search_role方法:比對使用者輸入的字串有沒有在角色名單裡出現,需要呼叫RoleList.java裡的findrole_str方法
  • RoleList.java裡面有findrole_str方法,可傳回二維的字串陣列,裡面有角色流水號以及名字
自爆↓
好吧,其實上這個架構圖是程式寫好後才畫的
事先先畫更好,會更有概念,不會忘記自己要幹嘛=   ="


咱們的excel檔



連自己要把什麼挖出來都不知道也太瞎了吧,快來看看角色列表

[不知道這些人名哪來的或心有疑惑或單純無聊的人請按這裡]
(預定放上小說管理器計畫↑)


捲袖子,操傢伙,上吧!


 jexcelapi再度登場~~


首先,我們要取出xls檔裡的東東~
不然空有資料就只能乾瞪眼啦QQ



public static String[][] findrole_str(File myWorkBook){

我們的filerole_str方法會傳回一個字串二維陣列,
需要的引數是File,也就是xls檔的資源


         Workbook myxls = Workbook.getWorkbook(myWorkBook);
            Sheet mysheet = myxls.getSheet(0);
            
            int columns = mysheet.getColumns();
            int rows = (mysheet.getRows())-1; 
            //減一的原因是因為excel檔裡最後一行是防止陣列錯誤的,無意義

首先,取得xls,然後再得到工作表1(sheet1),因為getSheet(int index)是從0開始算的,所以填0

getCloumns()、getRows()可取得行列數

下方的註解 "//減一的原因是因為excel檔裡最後一行是防止陣列錯誤的,無意義"
到時候會再寫一篇文章講這個傻瓜暴力解決BUG法(誤) 敬請期待(再誤)

            String[] name1 = new String[rows]; //取出第一名稱的值
            Cell[] name1cell = mysheet.getColumn(0);
            
            
            String[] role_sn = new String[rows]; //取出流水號
            Cell[] role_sn_cell = mysheet.getColumn(4);

再來,宣告一個叫做name1的字串陣列,準備拿來裝第一名稱的值
宣告Cell(儲存格)物件陣列,利用Sheet裡面的getColumn方法取得這一行的所有儲存格

流水號也一樣~~

。。。。。。。。。。。咦,等等,那為什麼流水號不弄成數字格式呢?
A:因為我不會~~
JAVA規定傳回值只能有一個,只能用字串陣列。。。
聽說有別的方法──Collection(集合)還是泛型的可以辦到
可是我那邊沒學好,一頭霧水

所以既然字串也可以裝數字,就將就吧(被打)
等我把這個洞補起來後再重寫~~=   =

            
            for(int i=0; i<rows; i++){
             if(i==0){
              continue;
             }
             
             name1[i] = name1cell[i].getContents()
取出第一名稱(因為一定要有,所以不可能為空) role_sn[i] = role_sn_cell[i].getContents(); //輸入流水號到陣列裡 } String[][] returns = {name1,role_sn}; myxls.close(); return returns;

再等等!!為什麼不放入第一行的內容呢~~

             
             if(i==0){
              continue;
             }


請看VCR。。。呃,不是,是xls檔~~

因為第一行是程式設計師自己對表格內容的註解,
也就是HTML裡表格的<th>標籤

所以continue跳過這次迴圈,刪除,out!


 再來就是用Cell裡的getContents方法把資料丟進準備好的陣列裡

從for迴圈出來之後,再變一個陣列出來,把名字陣列跟流水號陣列塞進去
 如此就完成一個二維陣列囉~~

最後別忘了回傳
      return returns;
 

於是,大功告成!

以後只要輸入檔案路徑,
就會自動把流水號與角色陣列丟過來囉!


下一篇跟jexcelapi沒關係了,
只是做簡單的搜尋功能,

[GUI介面簡單搜尋功能(續:jexcelapi之讀取!)]

沒有留言:

張貼留言