jxl 是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是


POI,一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好,API是纯Java的


, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是


,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
下载地址以及文档请参考: http://www.andykhan.com/jexcelapi/
将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。
Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更


新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为


是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。
提供以下功能:
从Excel 95、97、2000等格式的文件中读取数据;
读取Excel公式(可以读取Excel 97以后的公式);
生成Excel数据表(格式为Excel 97);
支持字体、数字、日期的格式化;
支持单元格的阴影操作,以及颜色操作;
修改已经存在的数据表;
能够读取图表信息
1.应用示例:
首先从网上面下一个jxl.jar包,把它放在工程所在的目录内。然后把它的路径给工程的库:工程属性-


Libraries-Add External JARS…-选择jxl.jar所在的目录,再选中它。
包括从Excel读取数据,生成新的Excel,以及修改Excel

package common.util; 
 
 import jxl.*; 
 
 import jxl.format.UnderlineStyle; 
 
 import jxl.write.*; 
 
 import jxl.write.Number; 
 
 import jxl.write.Boolean; 
 
 import java.io.*; 
 
 public class ExcelHandle 
 
 { 
 
 public ExcelHandle() 
 
 { 
 
 } 
 
 /** 
 
 * 读取Excel 
 
 * @param filePath 
 
 */ 
 
 public static void readExcel(String filePath) 
 
 { 
 
 try 
 
 { 
 
 InputStream is = new FileInputStream(filePath); 
 
 Workbook rwb = Workbook.getWorkbook(is); 
 
 //Sheet st = rwb.getSheet("0")这里有两种方法获取sheet表,1为名字,而为下标,从0开始 
 
 Sheet st = rwb.getSheet(0); 
 
 // getCell的方法行在后面,列在前面。如getCell(列,行) 
 
 //列数: 
 
 int myCol=st.getColumns(); 
 
 //行数: 
 
 int myR=st.getRows(); 
 
 Cell c00 = st.getCell(0,0); 
 
 //通用的获取cell值的方式,返回字符串 
 
 String strc00 = c00.getContents(); 
 
 //获得cell具体类型值的方式 
 
 if(c00.getType() == CellType.LABEL) 
 
 { 
 
 LabelCell labelc00 = (LabelCell)c00; 
 
 strc00 = labelc00.getString(); 
 
 } 
 
 //输出 
 
 System.out.println(strc00); 
 
 //关闭 
 
 rwb.close(); 
 
 } 
 
 catch(Exception e) 
 
 { 
 
 e.printStackTrace(); 
 
 } 
 
 } 
 
 /** 
 
 * 输出Excel 
 
 * 
 
 * @param os 
 
 */ 
 
 public static void writeExcel(OutputStream os) 
 
 { 
 
 try 
 
 { 
 
 /** 
 
 * 只能通过API提供的工厂方法来创建Workbook,而不能使用WritableWorkbook的构造函数, 
 
 * 因为类WritableWorkbook的构造函数为protected类型 
 
 * method(1)直接从目标文件中读取WritableWorkbook wwb = Workbook.createWorkbook(new File 
 

  (targetfile)); 
 
 * method(2)如下实例所示 将WritableWorkbook直接写入到输出流 
 
 */ 
 
 WritableWorkbook wwb = Workbook.createWorkbook(os); 
 
 //创建Excel工作表 指定名称和位置 
 
 WritableSheet ws = wwb.createSheet("Test Sheet 1",0); 
 
 //**************往工作表中添加数据***************** 
 
 //1.添加Label对象 
 
 Label label = new Label(0,0,"this is a label test"); 
 
 ws.addCell(label); 
 
 //添加带有字型Formatting对象 
 
 WritableFont wf = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true); 
 
 WritableCellFormat wcf = new WritableCellFormat(wf); 
 
 Label labelcf = new Label(1,0,"this is a label test",wcf); 
 
 ws.addCell(labelcf); 
 
 //添加带有字体颜色的Formatting对象 
 
 WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false, 
 
 UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.RED); 
 
 WritableCellFormat wcfFC = new WritableCellFormat(wfc); 
 
 Label labelCF = new Label(1,0,"This is a Label Cell",wcfFC); 
 
 ws.addCell(labelCF); 
 
 //2.添加Number对象 
 
 Number labelN = new Number(0,1,3.1415926); 
 
 ws.addCell(labelN); 
 
 //添加带有formatting的Number对象 
 
 NumberFormat nf = new NumberFormat("#.##"); 
 
 WritableCellFormat wcfN = new WritableCellFormat(nf); 
 
 Number labelNF = new jxl.write.Number(1,1,3.1415926,wcfN); 
 
 ws.addCell(labelNF); 
 
 //3.添加Boolean对象 
 
 Boolean labelB = new jxl.write.Boolean(0,2,false); 
 
 ws.addCell(labelB); 
 
 //4.添加DateTime对象 
 
 jxl.write.DateTime labelDT = new jxl.write.DateTime(0,3,new java.util.Date()); 
 
 ws.addCell(labelDT); 
 
 //添加带有formatting的DateFormat对象 
 
 DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss"); 
 
 WritableCellFormat wcfDF = new WritableCellFormat(df); 
 
 DateTime labelDTF = new DateTime(1,3,new java.util.Date(),wcfDF); 
 
 ws.addCell(labelDTF); 
 
 //添加图片对象,jxl只支持png格式图片 
 
 File image = new File("f://2.png"); 
 
 WritableImage wimage = new WritableImage(0,1,2,2,image);//0,1分别代表x,y.2,2代表宽和高占的单 
 

  元格数 
 
 ws.addImage(wimage); 
 
 //写入工作表 
 
 wwb.write(); 
 
 wwb.close(); 
 
 } 
 
 catch(Exception e) 
 
 { 
 
 e.printStackTrace(); 
 
 } 
 
 } 
 
 /** 
 
 * 拷贝后,进行修改,其中file1为被copy对象,file2为修改后创建的对象 
 
 * 尽单元格原有的格式化修饰是不能去掉的,我们还是可以将新的单元格修饰加上去, 
 
 * 以使单元格的内容以不同的形式表现 
 
 * @param file1 
 
 * @param file2 
 
 */ 
 
 public static void modifyExcel(File file1,File file2) 
 
 { 
 
 try 
 
 { 
 
 Workbook rwb = Workbook.getWorkbook(file1); 
 
 WritableWorkbook wwb = Workbook.createWorkbook(file2,rwb);//copy 
 
 WritableSheet ws = wwb.getSheet(0); 
 
 WritableCell wc = ws.getWritableCell(0,0); 
 
 //判断单元格的类型,做出相应的转换 
 
 if(wc.getType == CellType.LABEL) 
 
 { 
 
 Label label = (Label)wc; 
 
 label.setString("The value has been modified"); 
 
 } 
 
 wwb.write(); 
 
 wwb.close(); 
 
 rwb.close(); 
 
 } 
 
 catch(Exception e) 
 
 { 
 
 e.printStackTrace(); 
 
 } 
 
 } 
 
 //测试 
 
 public static void main(String[] args) 
 
 { 
 
 try 
 
 { 
 
 //读Excel 
 
 ExcelHandle.readExcel("f:/testRead.xls"); 
 
 //输出Excel 
 
 File fileWrite = new File("f:/testWrite.xls"); 
 
 fileWrite.createNewFile(); 
 
 OutputStream os = new FileOutputStream(fileWrite); 
 
 ExcelHandle.writeExcel(os); 
 
 //修改Excel 
 
 ExcelHandle.modifyExcel(new file(""),new File("")); 
 
 } 
 
 catch(Exception e) 
 
 { 
 
 e.printStackTrace(); 
 
 } 
 
 } 
 
 } 
 
 2.在jsp中做相关测试,创建一个writeExcel.jsp 
 
 <% 
 
 response.reset();//清除Buffer 
 
 response.setContentType("application/vnd.ms-excel"); 
 
 File fileWrite = new File("f:/testWrite.xls"); 
 
 fileWrite.createNewFile(); 
 
 new FileOutputStream(fileWrite); 
 
 ExcelHandle.writeExcel(new FileOutputStream(fileWrite)); 
 
 %> 
 
 在IE中浏览writeExcel.jsp就可以动态生成Excel文档了,其中response.setContentType 
 

  ("application/vnd.ms-excel");语句必须要,才能确保不乱码,在jsp中输入< 
 %@page 

 

  contentType="application/vnd.ms-excel;charset=GBK"%>不行。 
 
 POI操作Excel: 
 
 示例1程序如下: 
 
 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
 
 import org.apache.poi.hssf.usermodel.HSSFSheet; 
 
 import org.apache.poi.hssf.usermodel.HSSFRow; 
 
 import org.apache.poi.hssf.usermodel.HSSFCell; 
 
 import java.io.FileOutputStream; 
 
 public class CreateXL { 
 
 /** Excel 文件要存放的位置,假定在D盘JTest目录下*/ 
 
 public static String outputFile="D:/JTest/ gongye.xls"; 
 
 public static void main(String argv[]) 
 
 { 
 
 try 
 
 { 
 
 // 创建新的Excel 工作簿 
 
 HSSFWorkbook workbook = new HSSFWorkbook(); 
 
 // 在Excel工作簿中建一工作表,其名为缺省值 
 
 // 如要新建一名为"效益指标"的工作表,其语句为: 
 
 // HSSFSheet sheet = workbook.createSheet("效益指标"); 
 
 HSSFSheet sheet = workbook.createSheet(); 
 
 // 在索引0的位置创建行(最顶端的行) 
 
 HSSFRow row = sheet.createRow((short)0); 
 
 //在索引0的位置创建单元格(左上端) 
 
 HSSFCell cell = row.createCell((short) 0); 
 
 // 定义单元格为字符串类型 
 
 cell.setCellType(HSSFCell.CELL_TYPE_STRING); 
 
 // 在单元格中输入一些内容 
 
 cell.setCellValue("增加值"); 
 
 // 新建一输出文件流 
 
 FileOutputStream fOut = new FileOutputStream(outputFile); 
 
 // 把相应的Excel 工作簿存盘 
 
 workbook.write(fOut); 
 
 fOut.flush(); 
 
 // 操作结束,关闭文件 
 
 fOut.close(); 
 
 System.out.println("文件生成..."); 
 
 }catch(Exception e) { 
 
 System.out.println("已运行 xlCreate() : " + e ); 
 
 } 
 
 } 
 
 } 
 
 读取Excel文档中的数据 
 
 示例2将演示如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为gongye.xls的Excel文 
 

  件。 
 
 示例2程序如下: 
 
 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
 
 import org.apache.poi.hssf.usermodel.HSSFSheet; 
 
 import org.apache.poi.hssf.usermodel.HSSFRow; 
 
 import org.apache.poi.hssf.usermodel.HSSFCell; 
 
 import java.io.FileInputStream; 
 
 public class ReadXL { 
 
 /** Excel文件的存放位置。注意是正斜线*/ 
 
 public static String fileToBeRead="D:/JTest/ gongye.xls"; 
 
 public static void main(String argv[]){ 
 
 try{ 
 
 // 创建对Excel工作簿文件的引用 
 
 HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead)); 
 
 // 创建对工作表的引用。 
 
 // 本例是按名引用(让我们假定那张表有着缺省名"Sheet1") 
 
 HSSFSheet sheet = workbook.getSheet("Sheet1"); 
 
 // 也可用getSheetAt(int index)按索引引用, 
 
 // 在Excel文档中,第一张工作表的缺省索引是0, 
 
 // 其语句为:HSSFSheet sheet = workbook.getSheetAt(0); 
 
 // 读取左上端单元 
 
 HSSFRow row = sheet.getRow(0); 
 
 HSSFCell cell = row.getCell((short)0); 
 
 // 输出单元内容,cell.getStringCellValue()就是取所在单元的值 
 
 System.out.println("左上端单元是: " + cell.getStringCellValue()); 
 
 }catch(Exception e) { 
 
 System.out.println("已运行xlRead() : " + e ); 
 
 } 
 
 }


}
设置单元格格式
在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。在Java


中,第一步要做的就是创建和设置字体和单元格的格式,然后再应用这些格式:
1、创建字体,设置其为红色、粗体:
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
2、创建格式
HSSFCellStyle cellStyle= workbook.createCellStyle();
cellStyle.setFont(font);
3、应用格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("标题 ")
 


其他操作


 一、 数据格式化


 在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。


 1、 字串格式化


 字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和
 WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,
 为方便叙述,我们为每一行命令加了编号:
WritableFont font1 =
  new  WritableFont(WritableFont.TIMES, 16 ,WritableFont.BOLD); ①


 WritableCellFormat format1 = new  WritableCellFormat(font1); ②


 Label label = new  Label( 0 , 0 ,”data  4  test”,format1) ③


  其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的
 构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。


 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种
 属性,后面的单元格格式化中会有更多描述。


 ③处使用了Label类的构造子,指定了字串被赋予那种格式。


 在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们
 上面的实例,可以指定:
  // 把水平对齐方式指定为居中
 format1.setAlignment(jxl.format.Alignment.CENTRE);


  // 把垂直对齐方式指定为居中
 format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);


二、单元格操作


 Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI
 提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。


 1、 合并单元格
 WritableSheet.mergeCells( int  m, int  n, int  p, int  q); 


  // 作用是从(m,n)到(p,q)的单元格全部合并,比如:
 WritableSheet sheet = book.createSheet(“第一页”, 0 );


  // 合并第一列第一行到第六列第一行的所有单元格
 sheet.mergeCells( 0 , 0 , 5 , 0 );


 合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。


 2、 行高和列宽
 WritableSheet.setRowView( int  i, int  height);


  // 作用是指定第i+1行的高度,比如:


  // 将第一行的高度设为200
 sheet.setRowView( 0 , 200 );


 WritableSheet.setColumnView( int  i, int  width);


  // 作用是指定第i+1列的宽度,比如:


  // 将第一列的宽度设为30
 sheet.setColumnView( 0 , 30 );


 jExcelAPI还有其他的一些功能,比如插入图片等,这里就不再一一介绍,读者可以自己探索。


其中:如果读一个excel,需要知道它有多少行和多少列,如下操作:



Workbook book 


=  Workbook.getWorkbook( new  File( " 测试1.xls " )); 
 
          //  获得第一个工作表对象 
 
         Sheet sheet  =  book.getSheet( 0 ); 
 
          //  得到第一列第一行的单元格 
 
          int  columnum  =  sheet.getColumns(); //  得到列数 
 
          int  rownum  =  sheet.getRows(); //  得到行数 
 
         System.out.println(columnum); 
 
         System.out.println(rownum); 
 
          for  ( int  i  =   0 ; i  <  rownum; i ++ ) //  循环进行读写 
 
          { 
 
              for  ( int  j  =   0 ; j  <  columnum; j ++ )  { 
 
                 Cell cell1  =  sheet.getCell(j, i); 
 
                 String result  =  cell1.getContents(); 
 
                 System.out.print(result); 
 
                 System.out.print( " /t " ); 
 
             } 
 
             System.out.println(); 
 
         } 
 
         book.close();