java操作Excel

来源:互联网 发布:淘宝注册企业名称 编辑:程序博客网 时间:2024/05/17 11:04

利用 JAVA 操作 EXCEL 文件

 

java Excel 是一开放源码项目,通过它 Java 开发人员可以读取Excel 文件的内容、创建新的 Excel 文件、更新已经存在的 Excel 文件。使用该 API Windows 操作系统也可以通过纯 Java 应用来处理 Excel 数据表。

 

应用示例

1 Excel 文件读取数据表

Java Excel API 既可以从本地文件系统的一个文件 (.xls),也可以从输入流中读取 Excel 数据表。读取 Excel 数据表的第一步是创建 Workbook(工作薄 )

代码片段:

InputStream is = new FileInputStream(sourcefile);

jxl.Workbookrwb = Workbook.getWorkbook(is);

一旦创建了 Workbook,我们就可以通过它来访问 Excel Sheet(工作表 )

代码片段:

// 获取第一张 Sheet

 Sheet rs = rwb.getSheet(0);

访问 Excel Sheet既可以通过 Sheet 的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一点是下标从 0 开始

 

一旦得到了 Sheet,我们就可以通过它来访问 Excel Cell(单元格 )

代码片段:

// 获取第一行,第一列的值

 Cellc00 = rs.getCell(0, 0);

 String strc00 = c00.getContents();

 // 获取第一行,第二列的值

 Cellc10 = rs.getCell(1, 0);

 String strc10 = c10.getContents();

 // 获取第二行,第二列的值

 Cellc11 = rs.getCell(1, 1);

 String strc11 = c11.getContents();

 

如果仅仅是取得 Cell 的值,我们可以方便地通过 getContents() 方法,它可以将任何类型的 Cell 值都作为一个字符串返回

 

如果有需要知道 Cell 内容的确切类型,API 也提供了一系列的方法

CellType.LABEL CellType.NUMBER    CellType.DATE

 

 

在得到 Cell 对象后,通过 getType() 方法可以获得该单元格的类型,然后与 API 提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值方法 getXXX(),就可以得到确定类型的值。

 

当你完成对 Excel 电子表格数据的处理后,一定要使用 close() 方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要

rwb.close();

 

Workbook 类提供的方法

1. int getNumberOfSheets()

获得工作薄(Workbook)中工作表(Sheet)的个数,示例:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 intsheets = rwb.getNumberOfSheets();

 

 

2. Sheet[] getSheets()

返回工作薄(Workbook)中工作表(Sheet)对象数组,示例:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 Sheet[] sheets = rwb.getSheets();

 

Sheet 接口提供的方法

 

1) String getName()

获取 Sheet 的名称,示例:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 jxl.Sheet rs = rwb.getSheet(0);

 String sheetName = rs.getName();

 

 

2) int getColumns()

获取 Sheet 表中所包含的总列数,示例:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 jxl.Sheet rs = rwb.getSheet(0);

 intrsColumns = rs.getColumns();

 

 

3) Cell[] getColumn(int column)

获取某一列的所有单元格,返回的是单元格对象数组,示例:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 jxl.Sheet rs = rwb.getSheet(0);

 Cell[] cell = rs.getColumn(0);

 

 

4) int getRows()

获取 Sheet 表中所包含的总行数,示例:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 jxl.Sheet rs = rwb.getSheet(0);

 intrsRows = rs.getRows();

 

 

5) Cell[] getRow(int row)

获取某一行的所有单元格,返回的是单元格对象数组,示例子:

 

 jxl.Workbook rwb =jxl.Workbook.getWorkbook(new File(sourcefile));

 jxl.Sheet rs = rwb.getSheet(0);

 Cell[] cell = rs.getRow(0);

 

 

6) Cell getCell(int column, int row)

获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同。

 

 jxl.Workbook rwb = jxl.Workbook.getWorkbook(newFile(sourcefile));

 jxl.Sheet rs = rwb.getSheet(0);

 Cellcell = rs.getCell(0, 0);

 

 

2 生成新的 Excel 工作薄

与读取 Excel 工作表相似,首先要使用 Workbook 类的工厂方法创建一个可写入的工作薄 (Workbook) 对象,这里要注意的是,只能通过 API 提供的工厂方法来创建 Workbook,而不能使用 WritableWorkbook 的构造函数,因为类 WritableWorkbook 的构造函数为 protected 类型。

 

 

 

Java Excel API(JXL)是一个成熟开源的Java类库,用来操作Excel电子表格,支持读取,修改,写入等操作。这个项目基于GPL发布,poi比较,对中文有很好的支持。而且支持PNG格式图片以及各种数字类型。

当然poi除了可以生成excel格式文件外,还支持pdfdoc等。

 

该项目网址是http://www.andykhan.com/jexcelapi/

 

https://sourceforge.net/projects/jexcelapi/

 

下面以此为例进行简单说明。

 

一、解压

 

  将下载后的文件(如jexcelapi_2_6_10.zip)解压,里面有好多目录,包括例子、文档和源码,其中对项目有用的只有jxl.jar,把它引入或放入项目的classpath目录。

 

二、新建测试类,创建excel文件

 

import java.io.*;

import jxl.*;

import jxl.write.*;

 

public class WriteExcel {

 

 /**

  *written by http://www.sunleap.com

  */

 public static void main(String[] args) {

  try

   {

   //下面创建Excel文件

  WritableWorkbook book=Workbook.createWorkbook(newFile("c://test.xls"));

 

   //下面生成名为"第一页"的工作表Sheet,参数0表示这是第一页

  WritableSheet sheet=book.createSheet("第一页",0); 

 

   //下面使用Label对象在单元格第1行第1(0,0)构造一个标签,内容为"网址"

  jxl.write.Label label1=new jxl.write.Label(0,0,"网址");

   //将定义好的单元格(0,0)添加到工作表中

  sheet.addCell(label1);

 

   //下面使用Label对象在单元格第1行第2(1,0)构造一个标签,内容为"站长"

  jxl.write.Label label2=new jxl.write.Label(1,0,"站长");

   //将定义好的单元格(1,0)添加到工作表中

  sheet.addCell(label2);

 

   //下面使用Label对象在单元格第1行第3(2,0)构造一个标签,内容为"访问量"

  jxl.write.Label label3=new jxl.write.Label(2,0,"访问量");

   //将定义好的单元格(2,0)添加到工作表中

  sheet.addCell(label3);

  

   //下面向文件中插入两行记录

  sheet.addCell(new jxl.write.Label(0,1,"http://www.sunleap.com"));

  sheet.addCell(new jxl.write.Label(1,1,"sunleap"));

  sheet.addCell(new jxl.write.Number(2,1,1000));

 

  sheet.addCell(newjxl.write.Label(0,2,"http://www.isosee.cn"));

  sheet.addCell(new jxl.write.Label(1,2,"isosee"));

  sheet.addCell(new jxl.write.Number(2,2,1189));

 

   //向文件写入数据并关闭文件

  book.write();

  book.close();

 

   }catch(Exception e)

    {

    System.out.println(e);

    }

   System.out.println("操作结束!");

 }

 

}

执行后,会在C盘生成一个名称为”test.xsl”的Excel文件。

 

三、读取文件

 

下面代码读取刚才生成的Excel文件,代码如下:

import java.io.*;

import jxl.*;

 

public class ReadExcel {

 

 /**

  *written by http://www.sunleap.com

  */

 public static void main(String[] args) {

 try{

  Workbook book=Workbook.getWorkbook(newFile("c://test.xls")); 

   //获得第一个工作表对象

  Sheet sheet=book.getSheet(0);

   //得到第2行第1列的单元格

  Cell cell1=sheet.getCell(0,1);

  String result=cell1.getContents();

  System.out.println(result);

  book.close();

 }catch(Exception e){

  System.out.println(e);

  }

 }

}

 

程序执行结果:http://www.sunleap.com

 

四、修改文件

 

修改文件代码如下:

 

import java.io.*;

import jxl.*;

import jxl.write.*;

 

public class UpdateExcel {

 

 /**

  *written by http://www.sunleap.com

  */

 public static void main(String[] args) {

 try  {

   //获得Excel文件

  Workbook wb=Workbook.getWorkbook(newFile("c://test.xls")); 

   //打开一个文件的副本,并且指定数据写回到原文件

  WritableWorkbook book=

  Workbook.createWorkbook(new File("c://test.xls"),wb); 

   //添加一个工作表eet,在第一行第一列填写内容

  WritableSheet sheet=book.createSheet("第二页",1);

  sheet.addCell(new Label(0,0,"http://www.sunleap.com")); 

  book.write();

  book.close();

 }catch(Exception e){

  System.out.println(e);

  }

 System.out.println("操作结束!");

 

 }

}

 

执行结果是在原有文件中加入了一个新的工作表

 

 

Excel文件往往有多行多列,可以进行循环读写,下面例子是循环读取excel文件的参考代码:

Workbook book=Workbook.getWorkbook(newFile("c://test.xls")); 

//获得第一个工作表

Sheet sheet=book.getSheet(0);

//得到行列数

int columnum=sheet.getColumns();

int rownum=sheet.getRows();/

for(int i=0;i< rownum {

  for(int j=0;j<columnum{

    Cell cell1=sheet.getCell(j,i);

       String result=cell1.getContents();

       System.out.print(result);

       System.out.print("/t");

   }

  System.out.println();

}

book.close();

 

 

高级操作

 

一、数据格式化

 

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

 

1 字串格式化

 

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

 

 

WritableFont font1=

newWritableFont(WritableFont.TIMES,16,WritableFont.BOLD);

 

WritableCellFormat format1=newWritableCellFormat(font1);

 

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

 

其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPIjava-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,intp,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,intwidth);