1. 程式人生 > >jxl 操作Excel表格之Workbook

jxl 操作Excel表格之Workbook

        本篇文章主要講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

createWorkbook(java.io.OutputStream os, Workbook in)   方式建立可寫工作簿,在寫入時一直報錯,目前沒有搞明白是什麼原因。希望大神能留言告訴我。

      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 的相關方法。