基于Java的Excel文件操作

时间:2022-09-15 12:03:24

基于Java的Excel文件操作

摘要:随着Excel电子表格的使用,通过Web来操作Excel文件的需求越来越强烈,通过JXL.JAR文件,我们可以很轻松的做到对Excel的创建和读写,主要论述了JXL对于Excel的操作,深入分析其操作过程和调用说明。

关键词:Java;Excel文件;创建;保存;更新

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)12-21730-02

Excel File Operation Based on Java

LIU Juan1, YANG Li-jun2

(1.Xinjiang Urumqi Adult Education Institute, Xinjiang 830002, China;2.Xinjiang Industry College, Xinjiang 830091, China)

Abstract:Along with the using of Excel file, the requirement of operating Excel file through WEB is more and more intense. By the file JXL.JAR, we can easily create, read and write Excel file through Web. The paper mainly discuss the operation to the Excel file with JXL and far-research the operating process and the transfer explanation.

Key words:JAVA; Excel file; create; write; update

1 引言

在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet中创建一个CSV(comma separated values)文件,并将这个文件以MIME text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件。这样做只是可以访问到Excel文件,但还不能真正的操纵Excel文件,本文将向大家介绍一个开放源码的API调用函数Java Excel API(JXL.JAR),使用它大家就可以方便地操纵Excel文件了。

JXL.JAR是一开放源码Java公用方法文件,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表,因为它是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。

2 通过Java从Excel文件中读取数据表的方法

2.1 创建Workbook(工作薄)

JXL.JAR既可以从本地文件系统的一个Excel文件,也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook,下面的代码片段说明了应该如何操作:

InputStream is = new FileInputStream(sourcefile);

jxl.Workbook readBook = Workbook.getWorkbook(is);

2.2 访问Excel Sheet(工作表)

一旦创建了Workbook,我们就可以通过它来访问Excel Sheet。如下面的代码片段:

//获取第一张工作表

Sheet readSheet = readBook.getSheet(0);

我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的是下标从0开始,就像数组一样。获得Sheet后,我们就可以通过它来访问Excel Cell(单元格)。如下面的代码片段:

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

Cell c00 = readSheet.getCell(0,0);

String Str00 = c00.getContents();

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

Cell c10 = readSheet.getCell(1,0);

String Str10 = c10.getContents();

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

Cell c11= readSheet.getCell(1,1);

String str11 = c11.getContents();

如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。Cell中的数组标示为(列,行),从上面的示例的注释我们可以很明确的看到具体的表示说明。

如果需要知道Cell内容的确切类型,API也提供了一系列的方法,如:CellType.LABEL。在得到Cell对象后,通过getType()方法可以获得该单元格的类型,然后与API提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值方法getXXX(),就可以得到确定类型的值。API提供了以下基本类型,与Excel的数据格式相对应,如下图所示:

每种类型的具体意义,可以参见Java Excel API Document。

2.3 释放读取数据表的过程中所占用的内存空间

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

//操作完毕,关闭对象,释放占用内存空间

readBook.close();

jxl.jar提供了许多访问Excel数据表的方法,在这里我们只简单的介绍常用的Workbook类和Sheet接口的一些常用方法。

3 通过Java生成新的Excel工作薄的方法

通过Java我们可以创建新的Excel工作薄,被创建新的Excel工作薄单元格的内容是不带任何修饰的(如:字体,颜色等等),所有的内容都作为字符串写入。

3.1 创建一个可写入的工作薄(Workbook)对象

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

//方法一:创建可以写入的Excel工作薄

jxl.write WritableWorkbook writeBook = Workbook.creatWorkbook(new File(file));

//方法二:将writeBook写入输出流

OutputStram os = new FileOutputStream(file);

jxl.write.WritableWorkbook writeBook = Workbook.createWorkbook(os);

API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名带相对路径,缺省的文件会定位在当前目录,如果文件名带有完整路径,则生成的Excel文件则会定位在相应的目录。另外一种是将Excel对象直接写入到输出流。例如,用户通过浏览器来访问Web服务器,如果HTTP头设置正确,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。

3.2 创建工作表

创建工作表的方法与创建工作薄的方法几乎一样,同样是通过工厂模式方法获得相应的对象,该方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置,参考下面的代码片段:

//创建Excel工作表

jxl.write.WritableSheet writeSheet = writeBook.creatSheet("First Sheet",0);

创建工作表完成后,紧接着要做的是实例化API所提供的Excel基本数据类型,并将它们添加到工作表中,可以参考下面的代码片段:

添加Lable对象

jxl.write.Label label = new jxl.write.Label(0,0,"Label cell");

writeSheet(label);

添加带有字型Formatting的对象

jxl.write.WritableFont font = new jxl.write.WritableFont(WritableFont.TIMES,18, WritableFont.BOLD,true);

jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);

jxl.write.Label labelCF = new jxl.write.Label(1,0,"This is a Label Cell",wcfF);

writeSheet.addCell(labelCF);

添加Number对象

jxl.write.Number labelN = new jxl.write.Number(0,1,3.1415926);

ws.addCell(labelN);

添加Boolean对象

jxl.write.Boolean labelB = new jxl.write.Boolean(0,2,false);

ws.addCell(labelB);

添加DateTime对象

jxl.write.DateTime labelDT = new jxl.write.DateTime(0,3,new java.util.Date());

ws.addCell(labelDT);

添加带有formatting的DateFormat对象

jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");

jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);

jxl.write.DateTime labelDTF = new jxl.write.DateTime(1,3,new java.util.Date(),wcfDF);

ws.addCell(labelDTF);

注意:第一,在构造单元格时,单元格在工作表中的位置就已经确定了,一旦创建后,单元格的位置是不能够变更的,但单元格的内容是可以改变的。第二,单元格是按照(列,行)的格式定位,而且下标都是从0开始。同时在JXL.JAR文件中还有很多类似这样添加不同对象的方法,读者可以自己研究。

3.3 关闭打开的Excel工作薄对象,以释放占用的内存

最后,还是要提醒大家不要忘记关闭打开的Excel工作薄对象,以释放占用的内存,如下面的代码片段:

//写入Exel工作表

writeBook.write();

//关闭Excel工作薄对象

writeBook.close();

这与读取Excel文件的操作稍有不同,在关闭Excel对象之前,你必须要先调用write()方法,因为先前的操作都是存储在缓存中的,所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象,那么只能得到一张空的工作薄了。

4 通过Java更新Excel工作薄的方法

通过Java我们更新一个已经存在的工作薄,主要是下面二步操作。第一步是构造只读的Excel工作薄。第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄。

参考下面的代码片段:

//创建只读的Excel工作薄的对象

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

//创建可写入的Excel工作薄对象

jxl.write.WritableWorkbook writeBook = Workbook.createWorkbook(new File(targetfile),rw); //读取第一张工作表

jxl.write.WritableSheet ws = writeBook .getSheet(0);

//获得第一个单元格对象

jxl.write.WritableCell wc = ws.getWritableCell(0,0);

//判断单元格的类型,做出相应的转化

if(wc.getType() == CellType.LABEL){

Label l = (Label)wc;

l.setString("The value has been modified.");}

//写入Excel对象

writeBook.write();//关闭可写入的Excel对象

writeBook.close();//关闭只读的Excel对象

rw.close();

使用这种方式构建Excel对象,完全是因为要提高效率。为了提高性能,在读取工作表时,与数据相关的一些输出信息,所有的格式信息,如:字体、颜色等等,是不被处理的,因为我们的目的是获得行数据的值,既使没有了修饰,也不会对行数据的值产生什么影响。唯一的不利之处就是,在内存中会同时保存两个同样的工作表,这样当工作表体积比较大时,会占用相当大的内存。

一旦获得了可写入的工作表对象,我们就可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()方法,因为单元格已经在工作表当中,所以我们只需要调用相应的setXXX()方法,就可以完成更新的操作了。单元格原有的格式化修饰是不能去掉的,但是可以将新的单元格修饰加上去,以使单元格的内容以不同的形式表现。

新生成的工作表对象是可写入的,我们除了更新原有的单元格外,还可以添加新的单元格到工作表中。最后,不要忘记调用write()方法,将更新的内容写入到文件中,然后关闭工作薄对象,这里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的。

5 结束语

通过上述示例的描述,我们可以很容易的对Excel文件进行创建和读取以及修改的操作,具体的代码开发可以视具体的需求进行编写,也可以参照Java Excel API Document的说明定制相应的内容。

参考文献:

[1]Java Excel API Document.

[2]林邦杰Java程序设计入门教程[M]. 北京:中国青年出版社,2001.

[3]H.M.Deitel,P.J.Deitel(美). Java程序设计教程[M]. 清华大学出版社,2004.

[4]Java研究组织. .

“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”

上一篇:计算机美术的发展和传统美术的关系 下一篇:浅谈应用计算机多媒体教学