參考資料
如果你已經下載了他的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已取代原檔!"); } } } }
沒有留言:
張貼留言