jxl 操作Excel表格之Workbook
阿新 • • 發佈:2019-02-19
本篇文章主要講jxl 中非常重要的一個抽象類Workbook,該類是一切操作Excel表格的開始。可以通過該類得到工作簿,也可以建立一個新的可寫工作簿。下面就讓我們一起來看看怎樣使用該類。
得到已存在Excel表格的工作簿 Workbook.getWorkbook:
import java.io.*; import jxl.Workbook; import jxl.WorkbookSettings; import jxl.read.biff.BiffException; public class Tgetworkbook { public static void main(String args[]) { try { //檔案已經存在,得到工作簿 File file = new File("D://JEtest/測試.xls"); Workbook book1 = Workbook.getWorkbook(file); System.out.println("sheet's number: " + book1.getNumberOfSheets()); book1.close(); //WorkbookSettings 是使應用程式可以使用各種高階工作簿屬性設定,若不使用則相關屬性會是預設值 WorkbookSettings ws = new WorkbookSettings(); Workbook book2 = Workbook.getWorkbook(file,ws); System.out.println("sheet's number: " + book2.getNumberOfSheets()); book2.close(); //以輸入流的方式得到工作簿 InputStream is = new FileInputStream(file); Workbook book3 = Workbook.getWorkbook(is); System.out.println("sheet's number: " + book3.getNumberOfSheets()); book3.close(); is.close(); //輸入流和WorkbookSettings 相結合 InputStream is2 = new FileInputStream(file); Workbook book4 = Workbook.getWorkbook(is2, ws); System.out.println("sheet's number: " + book4.getNumberOfSheets()); book4.close(); is2.close(); }catch (IOException | BiffException e) { System.out.println("Exception: " + e); } } }
以這種方式得到的工作簿的前題是Excel表格已存在。其中有一個WorkbookSettings 類,該類是設定工作簿相關的高階屬性,包括工作簿的字符集、字元編碼等屬性,有一個方法 public voidsetGCDisabled(boolean disabled) 在Web相關工作時,可能回影響效率,需要把垃圾回收屬性設定為禁止,true 為禁止垃圾回收。有興趣可以看看API 瞭解更多設定。
建立可寫工作簿 Workbook.createWorkbook :
import java.io.*; import jxl.*; import jxl.read.biff.BiffException; import jxl.write.*; public class TCreateWorkbook2 { public static void main(String args[]) throws IOException, WriteException, BiffException { try { File file = new File("D://JEtest/測試1.xls"); //建立一個可寫的工作簿 //若檔案 測試1.xls 存在,則以這種方式建立,原檔案的資料將會失去。 WritableWorkbook wb1 = Workbook.createWorkbook(file); System.out.println("sheet numbers: " + wb1.getNumberOfSheets()); WritableSheet wsheet1 = wb1.createSheet("sheet1", 0); System.out.println("sheet numbers: " + wb1.getNumberOfSheets()); //注意一定要用write()函式寫回去 wb1.write(); wb1.close(); //檔案存在,更新原始檔,或者複製原始檔到另一個檔案中,在進行修改。 //測試2.xls 檔案是存在的。 //得到的wb2 是對book 的複製 File file2 = new File("D://JEtest/測試2.xls"); //更新 測試2.xls Workbook book = Workbook.getWorkbook(file2); WritableWorkbook wb2 = Workbook.createWorkbook(file2, book); //這種方式是把file2 的資料複製到file3裡 //File file3 = new File("D://JEtest/測試3.xls"); //WritableWorkbook wb3 = Workbook.createWorkbook(file3, book); System.out.println("sheet numbers: " + wb2.getNumberOfSheets()); //注意一定要用write()函式寫回去 wb2.write(); wb2.close(); //建立帶有WorkbookSettings 高階設定的可寫工作簿 File file4 = new File("D://JEtest/測試4.xls"); WorkbookSettings ws = new WorkbookSettings(); WritableWorkbook wb4 = Workbook.createWorkbook(file4, ws); WritableSheet wsheet4 = wb4.createSheet("sheet2", 0); System.out.println("sheet2 numbers: " + wb4.getNumberOfSheets()); wb4.write(); wb4.close(); //public static WritableWorkbook createWorkbook(java.io.File file,Workbook in,WorkbookSettings ws) WritableWorkbook wb5 = Workbook.createWorkbook(file2, book, ws); wb5.write(); wb5.close(); }catch (IOException | WriteException | BiffException e) { System.out.println("Exception: " + e); throw e; } } }
也可以以輸出流的方式建立:
public static WritableWorkbook createWorkbook(java.io.OutputStream os)
public static WritableWorkbook createWorkbook(java.io.OutputStream os, WorkbookSettings ws)
public static WritableWorkbook createWorkbook(java.io.OutputStream os, Workbook in)
這裡需要注意的是以 public static WritableWorkbook
Workbook其他的方法:
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import jxl.Workbook;
import jxl.Sheet;
import jxl.Cell;
import jxl.Range;
import jxl.read.biff.BiffException;
public class Tworkbook {
public static void main(String args[]) throws IOException, BiffException {
try {
//檔案 測試.xls 存在
File file = new File("D://JEtest/測試.xls");
Workbook wb = Workbook.getWorkbook(file);
//判斷表是否受到保護
System.out.println("Is the sheet protect? result: " + wb.isProtected());
//在Excel表中可以選定多個單元格,給他們起一個名字,這裡的range就代表的是一個你選定命名的那些單元格。
//!!!!!!!!!!!!!!!!
//注意不要用wps 操作選定一部分單元格給其命名,這樣jxl用該函式會出現錯誤,返回的結果不正確。
//!!!!!!!!!!!!!!!!
//該方法返回所有你命名range的名字的字串陣列
String [] rangeNameList = wb.getRangeNames();
System.out.println("the range[]: " + Arrays.toString(rangeNameList));
//有引數名,得到range[] 陣列。 ????range的名字是唯一的,為什麼返回是陣列呢????
Range[] ranges;
ranges = wb.findByName("name");
System.out.println("the ranges[] length: " + ranges.length);
//該方法返回名為"name" 的cell或range 的左上單元格。
Cell cell = wb.findCellByName("name");
System.out.println("cell 或 range的左上單元格的內容: " + cell.getContents());
//獲取指定單元格, 引數格式為"sheet1!A1"
Cell cellA1 = wb.getCell("第一頁!A3");
System.out.println("第一頁裡A1的內容: " + cellA1.getContents());
//返回工作簿中工作表個數
int sheetnumber = wb.getNumberOfSheets();
System.out.println("工作表個數為: " + sheetnumber);
//得到指定的表,根據索引值,從零開始。 不要做不必要的呼叫,因為每次呼叫都要重讀工作表,
//此外客戶端也不要持有不必要的表的引用,這回阻止垃圾回收器釋放記憶體。
Sheet sheet0 = wb.getSheet(0);
System.out.println("第一個表的名字是: " + sheet0.getName());
//這種方式是根據工作表的名稱來得到工作表的。
Sheet sheet1 = wb.getSheet("第一頁");
//得到工作表陣列
Sheet [] sheetlist;
sheetlist = wb.getSheets();
System.out.println("工作表個數為: " + sheetlist.length);
//得到工作簿中所有的工作表名稱,以字串陣列儲存。
String [] sheetnamelist = wb.getSheetNames();
System.out.println("工作表個數:" + sheetnamelist.length + " 工作表名稱: " + Arrays.toString(sheetnamelist));
//得到jxl版本號
String version = wb.getVersion();
System.out.println(version);
wb.close();
}catch (IOException | BiffException | IndexOutOfBoundsException e) {
System.out.println("Exception: " + e);
throw e;
}
}
}
以上就是類Workbook 的所有方法,下一篇將會一起來學Sheet 的相關方法。