基于Java的Excel文件操作

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:hejizhou
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:随着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研究组织. http://www.javaresearch.org.
  “本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”
其他文献
摘要:对分形压缩编码进行了研究,提出了基于9-7整数小波零树的改进的分形算法。它首先对图像整数小波分解,然后对于分形编码,针对小波高频系数无直流分量的特点 ,通过加入误差校正矩阵,减少了误差累积现象。实验结果表明相对于经典的分形和零树混合编码方式,在图像比特率方面和压缩比上,都有很大的提高。  关键词:分形图像编码;整数小波;零树   中图分类号:TP391 文献标识码:A文章编号:1009-30
期刊
摘要:介绍了运用TMS320F2812的SCI模块以及调用VC++6.0中的MSComm控件实现TMS320F2812 DSP与PC机串口通信的方法。在自行研究设计的基于TMS320F2812的轮式移动机器人平台上,通过串口通信软硬件的设计,实现了移动机器人中心处理器PC104与底层运动控制器DSP之间控制信息及速度数据的准确收发。  关键词:DSP;PC104;串口通信;VC++6.0;MSCo
期刊
摘要:该文提出了一种低电压、高稳定性低压差(LDO)线性稳压器,该LDO线性稳压器可输出6种可调电压(2.0V、1.8V、1.6V、1.4V、1.2V、1.0V)。LDO的基本功能是优化便携设备的电池使用寿命,并且为电路系统提供稳定的输出电压。芯片设计基于CSMC公司的0.18微米CMOS混合信号模型。仿真结果表明,该稳压器的线性调整和负载调整的典型值分别为0.7mV和5mV;输出的最大电流为90
期刊
摘要:本文介绍一套用Microsoft Excel作题库,随机选题组卷的方案。  关键词:题库;随机选题;组卷;Excel  中图分类号:TP317文献标识码:A文章编号:1009-3044(2007)12-21732-02    Producing Test Papers by Excel    LI Ming  (Guangdong Shuichan School, Guangzhou 510
期刊
摘要:本文简要介绍了MATLAB Web Server及其相关技术,以杨氏双缝干涉实验为例,介绍了运用MATLAB Web Server相结合建立光学网络虚拟实验平台的过程,并通过计算机模拟观察实验结果。  关键词:MATLAB Web Server;杨氏双缝干涉;虚拟实验;仿真  中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)12-21720-02    Const
期刊
摘要:本文主要论述了VI设计理论及其发展现状,同时结合实际项目“《多媒体技术》网络课程”的开发,重点对VI设计理论的实际应用过程进行了阐述,最后在文中也给出了在此过程中出现的问题及参考解决方法。  关键词:VI;VI设计;网络课程  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)12-21718-02    Application of VI Design Theor
期刊
摘要:C语言作为国际上广泛流行的计算机语言,多年以来一直是大家喜欢学习又难于学习的计算机语言。本文在简要介绍C语言的内容的基础上,结合笔者多年学习C语言的体会,分析了学好C语言及参加计算机等级考试的技巧。  关键词:C语言;C语言学习;C语言技巧  中图分类号:TP312文献标识码:A文章编号:1009-3044(2007)12-21713-03    Shallowly Discusses th
期刊
摘要:通过Photoshop这门课程的教学,不仅要使学生掌握图像处理的操作方法,还要注重自学能力和创新能力的培养。从“备课、课堂教学、实践教学与辅导及考核方式”等教学环节中论述了如何培养学生的学习兴趣和创新意识,充分发挥学生自主学习的积极性和创造力,从而提高本课程的教学质量。  关键词:Photoshop;教学方法;自主学习;能力培养  中图分类号:G642文献标识码:A文章编号:1009-304
期刊
摘要:通过将matlab引入普通物理理论教学和实验教学,可推动普通物理教学方法的现代化,提高学生的学习兴趣和学习效果。  关键词:matlab;普通物理学;理论教学;实验教学  中图分类号:TP319文献标识码:A文章编号:1009-3044(2007)12-21763-02    The Application of Matlab Language in General Physics Teac
期刊
摘要:各类考试的准考证发放工作比较繁杂,为了减少考务工作人员的工作量和节省考生的时间,在B/S模式下,利用PHP+MYSQL进行开发准考证网上打印系统,并在一些考试过程中应用,收到良好效果。  关键词:B/S模式;PHP+MYSQL;准考证;打印  中图分类号:G642文献标识码:A文章编号:1009-3044(2007)12-21722-01    Prints the System Based
期刊