2012年10月8日 星期一

jexcelapi之寫入!

參考資料

如果你已經下載了他的API,可以在解壓縮的地方找到XXX/jexcelapi_2_6_12/jexcelapi/docs/index.html
裡面就是非看不可的參考文件javadoc

我用的版本是最新的2.6.10(不知道Andy先生多久沒更新了,但貌似是不能編輯xlsx檔的)
網路上的參考文件在此↓
http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html

閒言閒語


所謂不需要的東西就暫時不去研究嘛=   ="
因為我要開發的程式並不是要匯出excel檔,而是把excel檔拿去替代資料庫
所以xls檔本身已經存在,也不需要創建,
現在要傷腦筋的只有如何寫入與修改!

實驗記錄


經過我多次的實驗後發現,如果那一格裡面沒東西,jexcelapi會把那一格當作"無"
所以要先新增一個"cell"到那一格,才能把資料填入

大意就是:
找出要填入的格子(cell)的行列(rows、cols)
判斷此cell是空值或是已經有東西了
如果是空值:增加cell,填入資料
如果不是空值:以新資料取代

開始撰寫可以寫入格子的excel類別!

 

引數篇~~


public class excelwriter {

 public void writeFile(int sheetnumber,int rows, int cols, String inputstr, File originfile, File tmpfile){

以上是我撰寫的excelwriter.java的writeFile方法
需要的引數有
int型態的sheetnumber,需要第幾個工作表就填什麼,注意,起始值是0~~
int型態的rows、cols,需要編輯的格子的行列
String型態的inputstr,要填入格子的東東
File型態的originfile,是要編輯的xls檔的路徑,tmpfile當然就是要暫存的位置&檔名~

開始讀取、寫入、取代~~


  try{
   //開啟需要的檔案     
   Workbook wb=Workbook.getWorkbook(originfile);  
     
   //因為無法直接編輯,所以做出一個tmp檔   
   WritableWorkbook book = Workbook.createWorkbook(tmpfile,wb);     
   
   //取得需要編輯的工作表~~注意是從0開始
   WritableSheet sheet2 = book.getSheet(sheetnumber);
   
   //do something~~~~~~~~~~~
   WritableCell cell = sheet2.getWritableCell(rows, cols); 
    
    if(cell.getType() == CellType.EMPTY){
     System.out.println("增加新內容到EMPTY的格子裡!"); 
     sheet2.addCell(new Label(rows, cols, inputstr));
     
    }else if(cell.getType() == CellType.LABEL){
     System.out.println("Already have LABEL!");
     System.out.println("修改內容!");
      Label l = (Label) cell;
      l.setString(inputstr); 
    }
   
   //關閉資源
   book.write();   
   book.close(); 
  }

第一步當然就是開啟檔案,取得"Workbook"
再來,複製一份做為Temp檔,存到指定的地點

第二步,拿到想要編輯的工作表

一切準備就緒之後,就可以開始do something了~~

第三步,取得要編輯的那一格!
注意,也是從0開始數起
還要行列非常容易搞昏頭。。。
需要頭腦清晰時從不會弄錯XD

第四步,重頭戲!

    if(cell.getType() == CellType.EMPTY){
     System.out.println("增加新內容到EMPTY的格子裡!"); 
     sheet2.addCell(new Label(rows, cols, inputstr));
     
    }else if(cell.getType() == CellType.LABEL){
     System.out.println("Already have LABEL!");
     System.out.println("修改內容!");
      Label l = (Label) cell;
      l.setString(inputstr); 
    }
cell類別裡有個getType方法,回傳型態是CellType
而取得CellType後,查詢CellType這個類別,可以發現它裡面主要由各種Field組成

如果CellType是EMPTY的時候,顧名思義(?),格子沒東西
這時候就在工作表(sheet)裡增加一個cell,裡面直接用匿名的方式做出一個Label
就可以放入想要的資料啦!

如果CellType告訴你,裡面已經有東西了,就把它取代掉吧
也是製造一個Label,使用setString方法擺入文字

excel工作進行完畢後,別忘了。。。



   //關閉資源
   book.write();   
   book.close(); 

寫入這是一定要的啦!(忘了寫入就GG了,瞎忙一場......)
然後關閉資源是個好習慣(點頭)

=======================華麗麗的分割線===========================

處理檔案


jexcelapi功成身退後,該是處理檔案的時候了

畢竟咱們是在暫時的檔案裡做事,這時候要把真正修改的取代原本的檔案

catch(Exception e){
   System.out.println(e.toString());
  }finally{
   
   //覆蓋
   String filepath = originfile.getPath();
   
   if(originfile.delete()){
    System.out.println("已刪除原檔!");    
   }
   if(tmpfile.renameTo(new File(filepath))){
    System.out.println("tmp已取代原檔!");    
   }
      
  }
  
 }
 
}

很偷懶的只設了一個catch,所以的例外都print出來了解狀況就好

finally,真的是finally呀XD
首先取得原檔的路徑+檔名, 刪除原檔、再把暫存檔改成原檔的名字。。。

可能有更好的方法
這種爛方法是不得已的~bb
因為我沒發現更好的方法(攤手)

如此就完成囉!


最後,附上剛剛被N馬分屍的原始碼~~

package excel;

import java.io.*;  

import jxl.*;
import jxl.write.*;

public class excelwriter {

 public void writeFile(int sheetnumber,int rows, int cols, String inputstr, File originfile, File tmpfile){
  
  try{
   //開啟需要的檔案     
   Workbook wb=Workbook.getWorkbook(originfile);  
     
   //因為無法直接編輯,所以做出一個tmp檔   
   WritableWorkbook book = Workbook.createWorkbook(tmpfile,wb);     
   
   //取得需要編輯的工作表~~注意是從0開始
   WritableSheet sheet2 = book.getSheet(sheetnumber);
   
   //do something~~~~~~~~~~~
   WritableCell cell = sheet2.getWritableCell(rows, cols); 
    
    if(cell.getType() == CellType.EMPTY){
     System.out.println("增加新內容到EMPTY的格子裡!"); 
     sheet2.addCell(new Label(rows, cols, inputstr));
     
    }else if(cell.getType() == CellType.LABEL){
     System.out.println("Already have LABEL!");
     System.out.println("修改內容!");
      Label l = (Label) cell;
      l.setString(inputstr); 
    }
   
   //關閉資源
   book.write();   
   book.close(); 
   

  
  
  }catch(Exception e){
   System.out.println(e.toString());
  }finally{
   
   //覆蓋
   String filepath = originfile.getPath();
   
   if(originfile.delete()){
    System.out.println("已刪除原檔!");    
   }
   if(tmpfile.renameTo(new File(filepath))){
    System.out.println("tmp已取代原檔!");    
   }
      
  }
  
 }
 
}

沒有留言:

張貼留言