Java操作Excel之理解JXL---讀取Excel

ivy 14年前發布 | 4K 次閱讀 LimeSurvey JavaScript Tengine
關鍵字: java工具之使用
JXL(Java Excel API)是一個用來動態讀寫Excel文件的開源框架,利用它可以在任何支持Java的操作系統上動態讀寫Excel文件。JXL的主頁是:http://www.andykhan.com/jexcelapi/,可以在這里下載到它的最新的版本。

你可以分別通過如下命令

java -jar jxl.jar -xml test.xls
java -jar jxl.jar -cvs test.xls

以xml和cvs格式查看test.xls,這是因為JXL作者實現了一個用來演示的jxl.demo.Demo的類。

當然我們使用JXL主要是用它來動態讀寫Excel文件。現在就來看看JXL在對Excel的讀和寫上都提供了那些支持。

先來看看Excel文件中都有寫上面對象

1 文件對象 2工作簿對象 3 單元格對象。

相應的在JXL中就有Workbook,Sheet ,Cell 。通過這三個對象我們就可以實現Excel文件的讀取工作。

我們先想想一下讀取步驟,不管是什么樣的Excel操作框架必定都要經歷

1選取Excel文件,2選擇工作簿,3選擇Cell,4讀取信息。

那么現在就可以看看JXL中這四步驟如何體現:

//通過Workbook的靜態方法getWorkbook選取Excel文件

Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));

//通過Workbook的getSheet方法選擇第一個工作簿(從0開始)

Sheet sheet = workbook.getSheet(0);

//通過Sheet方法的getCell方法選擇位置為C2的單元格(兩個參數都從0開始)

Cell c2 = sheet.getCell(2,1);

//通過Cell的getContents方法把單元格中的信息以字符的形式讀取出來

String stringc2 = c2.getContents();

可以看到正是剛才所說的四個步驟。

我們都知道Excel單元格是有格式的,那么這些信息如何取得。

Cell提供了一個getType方法能夠返回單元格的類型信息,同時JXL提供了一個CellType類用來預設Excel中的類型信息,而且JXL提供了一些Cell類的子類用來分別用來表示各種類型的單元格,如LabelCell,NumberCell,DateCell分別表示字符、數值、日期類型的單元格。所以我們可以這樣寫:

if (c2.getType() == CellType.NUMBER)
{
NumberCell nc = (NumberCell) c2;
numberb2 = nc.getValue();
}

最后不要忘記關閉workbook以釋放資源:

workbook.close();

現在總結一下:三個對象,四個步驟,注意格式。就可以輕松的從Excel文件中讀取數據.

例子請見

Java代碼
import java.io.*;   
<BR>import jxl.*;  
<BR>class ReadExcel{   
<BR>    public void readExcel(String sourcefile){  
<BR>    try{   
<BR>        //構建Workbook對象, 只讀Workbook對象   
<BR>        //直接從本地文件創建Workbook   
<BR>        //從輸入流創建  
<BR>        Workbook InputStream is = new FileInputStream(sourcefile);   
<BR>        Workbook rwb = Workbook.getWorkbook(is);   
<BR>    }catch (Exception e){   
<BR>        e.printStackTrace();   
<BR>    }   
<BR>    //獲取第一張Sheet表   
<BR>    Sheet rs = rwb.getSheet(0);   
<BR>    //一旦得到了Sheet,就可以訪問Excel Cell(術語:單元格)   
<BR>    //獲取第一行,第一列的值   
<BR>    Cell c00 = rs.getCell(0, 0);   
<BR>    String strc00 = c00.getContents();   
<BR>    //獲取第一行,第二列的值   
<BR>    Cell c10 = rs.getCell(1, 0);   
<BR>    String strc10 = c10.getContents();   
<BR>    //獲取第二行,第二列的值   
<BR>    Cell c11 = rs.getCell(1, 1);   
<BR>    String strc11 = c11.getContents();   
<BR>    System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());   
<BR>    System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());   
<BR>    System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());   
<BR>    //操作完成時,關閉對象,釋放占用的內存空間   
<BR>    rwb.close();   
<BR>      
<BR>    }  
<BR>} 

import java.io.*;
import jxl.*;
class ReadExcel{
    public void readExcel(String sourcefile){
try{
//構建Workbook對象, 只讀Workbook對象
//直接從本地文件創建Workbook
//從輸入流創建
Workbook InputStream is = new FileInputStream(sourcefile);
Workbook rwb = Workbook.getWorkbook(is);
}catch (Exception e){
e.printStackTrace();
}
//獲取第一張Sheet表
Sheet rs = rwb.getSheet(0);
//一旦得到了Sheet,就可以訪問Excel Cell(術語:單元格)
//獲取第一行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();
//獲取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
//獲取第二行,第二列的值
Cell c11 = rs.getCell(1, 1);
String strc11 = c11.getContents();
System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
//操作完成時,關閉對象,釋放占用的內存空間
rwb.close();

    }
}    如果僅僅是取得Cell的值,可以通過getContents()方法,它將任何類型的Cell值都作為一個字符串返回。如果有需要知道Cell內容的確切類型,API也提供了一系列的方法。代碼片段如下:

String strc00 = null;
  double strc10 = 0.00;
  Date strc11 = null;
  Cell c00 = rs.getCell(0, 0);
  Cell c10 = rs.getCell(1, 0);
  Cell c11 = rs.getCell(1, 1);
  if (c00.getType() == CellType.LABEL) {
   LabelCell labelc00 = (LabelCell) c00;
   strc00 = labelc00.getString();
  }
  if (c10.getType() == CellType.NUMBER) {
   NmberCell numc10 = (NumberCell) c10;
   strc10 = numc10.getValue();
  }
  if (c11.getType() == CellType.DATE) {
   DateCell datec11 = (DateCell) c11;
   strc11 = datec11.getDate();
  }
  System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : "
    + c00.getType());
  System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : "
    + c10.getType());
  System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : "
    + c11.getType());
 
 本文由用戶 ivy 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!