数据导入导出的研究与应用王晶晶北京邮电大学网络教育学院(100088)E-mail:bolalisi_double@126.com摘要:Excel能够通过功能强大的工具将杂乱的数据组织成有用的信息,然后分析、交流和共享所得到的结果。很多系统由于存在着大量需要处理的数据,Excel本身强大的功能使得它成为处理分析这些数据首选的工具。随着Java语言成为越来越多系统的开发语言,利用Java进行Excel的数据导入导出在很多系统中都发挥着重要的作用,本文主要介绍了JxlAPI的主要功能,并结合实例探讨了利用JxlAPI操作Excel数据的导入和导出。关键字:Java;Excel;JxlAPI;数据导入导出中图分类号:TP312文献标识码:A1.引言MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。在远程网络教学系统中,利用Excel表格统计学生的作业考试情况信息,便于老师了解学生的学习情况,分析教学效果,制定教学计划。所以,用Java操作Excel表格,导出相关的信息对于远程网络教育系统有着的很重要的意义。在开源世界中,有两套比较有影响的API提供Excel数据导入导出的功能,一个是POI,一个是jExcelAPI。本文结合基于J2EE开发的多媒体教学系统中提供的将学生作业信息导出到Excel表格中的实例,详细阐述了利用JAVA开发的jExcelAPI操作excel的方法。2.Jxl简介2.1Java语言简介Java语言具有面向对象、与平台无关、安全、稳定和多线程等优良特性,是目前软件设计中极为强大的编程语言[1]。它具有以下一些特点[2]:简单,面向对象,分布式,解释执行,鲁棒,安全,体系结构中立,可移植,高性能,多线程以及动态性。2.2什么是JxlJavaExcel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。Jxl发布的稳定版本是V2.0,提供以下功能:从Excel95、97、2000等格式的文件中读取数据[3];读取Excel公式(可以读取Excel97以后的公式)[3];数据表(格式为Excel97)[3];支持字体、数字、日期的格式化[3];支持单元格的阴影操作,以及颜色操作[3];修改已经存在的数据表。2.3代码举例2.3.1从Excel文件读取数据表JavaExcelAPI既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语:工作薄),相关文献中给出了部分事例介绍[4],下面的代码片段举例说明了应该如何操作:importjava.io.*;importjxl.*;…………try{//构建Workbook对象,只读Workbook对象//直接从本地文件创建Workbook//从输入流创建WorkbookInputStreamis=newFileInputStream(sourcefile);jxl.Workbookrwb=Workbook.getWorkbook(is);}catch(Exceptione){e.printStackTrace();}一旦创建了Workbook,我们就可以通过它来访问ExcelSheet(术语:工作表)。代码如下://获取第一张Sheet表Sheetrs=rwb.getSheet(0);我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。一旦得到了Sheet,我们就可以通过它来访问ExcelCell(术语:单元格)。代码如下://获取第一行,第一列的值Cellc00=rs.getCell(0,0);Stringstrc00=c00.getContents();//获取第一行,第二列的值Cellc10=rs.getCell(1,0);Stringstrc10=c10.getContents();获取第二行,第二列的值Cellc11=rs.getCell(1,1);Stringstrc11=c11.getContents();如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell(0,0)是文本型,Cell(1,0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。当完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。//操作完成时,关闭对象,释放占用的内存空间rwb.close();2.3.2生成新的Excel工作薄与读取Excel工作表相似,首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象,相关文献中给出了事例介绍[4],具体代码如下:try{//构建Workbook对象,只读Workbook对象//Method1:创建可写入的Excel工作薄jxl.write.WritableWorkbookwwb=Workbook.createWorkbook(newFile(targetfile));//Method2:将WritableWorkbook直接写入到输出流/*OutputStreamos=newFileOutputStream(targetfile);jxl.write.WritableWorkbookwwb=Workbook.createWorkbook(os);*/}catch(Exceptione){e.printStackTrace();}//创建Excel工作表jxl.write.WritableSheetws=wwb.createSheet(TestSheet1,0);//1.添加Label对象jxl.write.LabellabelC=newjxl.write.Label(0,0,ThisisaLabelcell);ws.addCell(labelC);添加带有字型Formatting的对象jxl.write.WritableFontwf=newjxl.write.WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);jxl.write.WritableCellFormatwcfF=newjxl.write.WritableCellFormat(wf);jxl.write.LabellabelCF=newjxl.write.Label(1,0,ThisisaLabelCell,wcfF);ws.addCell(labelCF);2.3.3单元格操作1)合并单元格WritableSheet.mergeCells(intm,intn,intp,intq);作用是从(m,n)到(p,q)的单元格全部合并,比如:WritableSheetsheet=book.createSheet(“第一页”,0)[5];//合并第一列第一行到第六列第一行的所有单元格sheet.mergeCells(0,0,5,0);合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。2)行高和列宽WritableSheet.setRowView(inti,intheight);作用是指定第i+1行的高度,比如://将第一行的高度设为200[5]sheet.setRowView(0,200);WritableSheet.setColumnView(inti,intwidth);作用是指定第i+1列的宽度,比如://将第一列的宽度设为30[5]sheet.setColumnView(0,30);3.应用实例本文所举的实例为网上多媒体教学系统中对于学生作业导出信息的实现。3.1系统界面及导出表实例下图1为导出功能的入口:点击导出此次作业的成绩按钮,就会触发相应的动作,进行数据表的导出对象,用来存放从数据库中查询出来的导出表需要的相关字段的信息。它是作业接收者对象的一个子集,只包含了作业接收者对象中学号,姓名,班级,作业标题,完成时间,分数,查看次数等信息。为数据导出按钮连接消息处理函数:函数主要包括生成工作表,调用方法从数据库中将对应某次作业的作业接收者的信息查找出来,并用相关的属性初始化SingleTaskScoreExportInfo对象,放在结果集中,构造循环将查询到的结果集中的对象写入到Excel表格中。以下是实现的主要代码://定义表格名称为作业成绩,创建工作薄Stringfilename=作业成绩;response.setHeader(Content-Disposition,attachment;filename=+newString(filename.getBytes(),iso8859-1)+.xls);OutputStreamos=response.getOutputStream();WritableWorkbookwwb=Workbook.createWorkbook(os);//创建工作表,并写入相应的表头字段=wwb.createSheet(所有成绩,0);String[]title={学号,班级,姓名,作业标题,完成时间,分数,次数};for(intj=0;jtitle.length;j++){//在sheet中写标题栏sheet.addCell(newLabel(j,0,title[j],arial12format));}//查询需要的数据,放在List结果集中ListSingleTaskScoreExportInfoscores=studyManager.getSingleTaskScoresByCourse(courseId,taskId);//将相关的信息写入到工作表SingleTaskScoreExportInfoitem;introw=1;for(it=scores.iterator();it.hasNext();){item=(SingleTaskScoreExportInfo)it.next();if(!.equals(item.getStudentNum())&&null!=item.getStudentNum()){//添加学号Labellabel=newLabel(0,row,item.getStudentNum());sheet.setColumnView(0,20);sheet.addCell(label);//添加班级label=newLabel(1,row,item.getClassGroupName());sheet.setColumnView(1,50);sheet.addCell(label);//添加姓名label=newLabel(2,row,item.g