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());