POI与JXL在研究生选课系统的研究与应用

时间:2022-07-07 11:22:07

POI与JXL在研究生选课系统的研究与应用

摘要:介绍了POI与JXL在广州中医药大学研究生选择系统中导出Excel报表中的应用,并分析了各自的优劣,最后详细阐述在系统中采用POI与JXL导出Excel报表的实现步骤。

关键词:POI;JXL;研究生选课系统;Excel

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2010)22-6342-03

Research and Application of POI & JXL in Graduate Course Selection System

HUANG Ji-sheng

(Guangzhou University of Chinese Medicine, Guangzhou 510006, China)

Abstract: This paper describes the application of POI and JXL in exporting Excel reports in Graduate Course Selection System of Guangzhou University of Chinese Medicine, and analysis of the pros and cons of each other. Eventually, the implementation steps of exporting Excel reports with the use of POI and JXL.

Key words: POI; JXL; graduate course selection system; Excel

广州中医药大学研究生选课系统是根据学校具体的办学特色而开发的一个选课系统,要求在学生选课之后,能够根据课程名称或者学号导出课程成绩册或者学生个人成绩单[1],同时还要考虑研究生处教师的工作习惯,因此利用Java程序导出成绩报表。

1 POI与JXL概述

Java编辑Excel文件主要有两大开源工具:Jakarta POI和Java Excel API(简称JXL)。Apache Jakarta POI是Apache软件基金会的开放源码函数库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI项目实现的Microsoft Excel文件格式称为HSSF,HSSF是Horrible SpreadSheet Format的缩写。通过HSSF,你可以用纯Java代码来读取、写入、修改Microsoft Excel格式档案。[2]Java Excel是一开放源码项目,通过它可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。[3]使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。

Jakarta 的 POI Project 与 Java Excel API 的应用都十分广泛,但各有千秋。POI在某些细节有些小Bug并且不支持写入图片;而JXL提供了对图片的支持(但是仅仅支持png格式的图片),只是对公式支持不是很好。而在对内存等资源的消耗方面,JXL 使用资源少,在大数据量的情况下POI使用资源明显高于JXL。项目可以根据实际的运用来进行选择。

在广州中医药大学研究生选课系统中,需用导出Excel报表的包括导出所有选课成绩表,以及针对每一门课程的课程成绩册以及学生个人的成绩单。对于所有选课成绩表,由于只需要导出数据,并且不常用,也不要求生成图片,因此我们选择 POI 工具。对于课程成绩册和个人生成单,需要对报表外观进行设置,并可能需要导出图片,系统采用JXL实现。

2 利用POI导出成绩表

2.1 利用POI导出成绩表概述

利用POI的HSSF来操作Excel,需要了解HSSF读取操作的两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。usermodel主要有org.apache.poi.hssf.usermodel和org.apache.poi.hssf.eventusermodel包实现。usermodel包把Excel文件映射成我们熟悉的结构,诸如Workbook、Sheet、Row、Cell等,它把整个结构以一组对象的形式保存在内存之中,比较简单易用。eventusermodel要求用户熟悉文件格式的底层结构,它的操作风格类似于XML的SAX API和AWT的事件模型(这就是eventusermodel名称的起源),使用较为复杂,但运行效率较高。另外,eventusermodel的API只提供读取文件的功能,也就是说不能用这个API来修改文件。

在研究生选课系统导出Excel报表的实现中,我们只需要生成符合定制格式的成绩表或者成绩单即可,因此在程序实现时我们采用用户模型的org.apache.poi.hssf.usermodel包,因此在JSP实现时需要加入导入包语句。

在生成课程成绩表或者个人成绩单的过程当中,主要是通过usermodel写入文件,其中涉及到的Excel表单结构包括以下几个方面:HSSFWorkbook表示Excel文档对象,相当一个工作簿、HSSFSheet表示Excel的电子表、HSSFRow表示Excel的行、HSSFCell表示Excel的单元格、HSSFFont 表示Excel中单元格字体、HSSFName表示单元格名称、HSSFDataFormat表示日期格式。

2.2 利用POI导出成绩表实现步骤

1)定义成绩表头字段,并创建ArrayList数组用以存放各个字段的数据集。关键代码如下。

java.util.ArrayList []xkxx = new java.util.ArrayList[len];//len为字段数目

for(int i=0;i

xkxx[i] = new java.util.ArrayList(); xkxx[i].clear();

}

String title[] = {"学号","姓名","类别","学院","课号","课程名","成绩"};

for(int i=0;i

2)根据查询语句生成数据集并存入ArrayList数组。具体程序如下。

String sql = request.getParameter("sql");//自定义查询语句

String tabName = request.getParameter("tabName");//自定义工作簿名

tabName = enCode(tabName)+".xls";

//String sql = "select xkxx.xh,xm,lb,xy,xkxx.kch,kcm,cj from xkxx,kcxx,xsxx where xkxx.kch = kcxx.kch and xkxx.xh = xsxx.xh order by xkxx.kch";//程序设定查询语句

rs = smt.executeQuery(sql);

while(rs.next()){

//填充xkxx数组xkxx[0].add(rs.getString(1));

}

3)通过HSSF创建HSSFWorkbook实例,并把ArrayList数组里的数据集填充在工作表中。其相关实现程序如下。

HSSFWorkbook wb= newHSSFWorkbook();//创建一个HSSFWorkbook实例

HSSFSheet sheet=wb.createSheet( " sheet1 " ); //创建工作表

HSSFSheet sheet=wb.createSheet( " sheet1 " );

int rowCount = xkxx[0].size();//行数

HSSFRow row[] = new HSSFRow[rowCount];

HSSFCell cell[] = new HSSFCell[len];

for(int i = 0; i < rowCount; i++){//创建所有行,包括标题

row[i] = sheet.createRow((short)i);

for(int j=0;j

cell[j] = row[i].createCell((short)j);

if(i == 0){//title

cell[j].setCellType(1);//字符型

cell[j].setCellValue((String)xkxx[j].get(i));//获取单元格的值

}else{ //判断并设置单元格类型 }

}

}

4)把生成的工作簿保存在服务器指定的位置,并返回导出的记录数。其实现相关代码如下。

String filename=application.getRealPath("/")+"\\excel\\"+tabName;

//String filename = request.getRealPath("")+"\\excel\\xsxx.xls";

FileOutputStream fo=new FileOutputStream(filename);

wb.write(fo);

out.println("导出成功,共导出"+(rowCount-1)+"条记录!");

3 利用JXL导出成绩册和成绩单

3.1 利用JXL导出Excel成绩表概述

JXL通过java操作excel表格的工具类库,支持Excel 95-2002的所有版本,能够生成Excel 2002标准格式,支持字体、数字、日期操作,能够修饰单元格属性,支持图像和图表,因此能够满足研究生选课系统导出课程成绩册和个人成绩单的需要。

3.2 JXL生成个性化Excel报表步骤

利用JXL导出成绩册和成绩单的步骤跟POI导出成绩表类似,下面以导出个人成绩单为例,给出利用JXL生成个性化Excel报表的具体过程。

1)导入实现程序需要用到的相关包,执行语句如下。

2)创建工作簿和工作表

String filename=application.getRealPath("/")+"\\excel\\"+tabName;

WritableWorkbook book=Workbook.createWorkbook(new File(filename));

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

3)合并单元格,并格式化数据

sheet.mergeCells(0,0,4,0);//5列

WritableFont titleFont=new WritableFont(WritableFont.createFont("黑体"),15,WritableFont.BOLD );

WritableFont contentFont=new WritableFont(WritableFont.createFont("楷体 _GB2312"),12, WritableFont.NO_BOLD );

WritableCellFormat titleFormat=new WritableCellFormat(titleFont);

WritableCellFormat contentFormat = new WritableCellFormat(contentFont);

contentFormat.setBorder(Border.ALL,BorderLineStyle.THIN, Colour.BLACK);

Label label=new Label(0,0,"广州中医药大学硕士成绩单",titleFormat);

titleFormat.setAlignment(jxl.format.Alignment.CENTRE);

4)将定义好的单元格添加到工作表中,并保存文件。

sheet.addCell(label);

if(rowCount>0){

for(int i = 0; i < rowCount; i++){

sheet.addCell(new Label(0,i+1,(String)xkxx[5].get(i),contentFormat));

sheet.addCell(new jxl.write.Number(1,i+1,Float.parseFloat(xkxx[6].get(i).toString()),contentFormat));

}

}

sheet.setColumnView(0, 12); sheet.setColumnView(1, 25);

sheet.setColumnView(3, 12); sheet.setColumnView(4, 25);

book.write(); book.close(); //写入数据并关闭文件

out.println("导出成功,共导出"+(rowCount-1)+"条记录!");

4 结论

本文根据广州中医药大学研究生教学的实际需求,详细介绍POI Project 与 Java Excel API两个在Excel成绩报表导出功能的研究与应用。系统中成绩报表导出功能的实现,把学生选课、教师登记成绩以及导出各种所需的成绩报表有机的统一起来,减少了重复劳动,大大提高研究生教学管理效率。

参考文献:

[1] 黄纪盛,王珍,陈素,等.基于中医院校特色的研究生选课系统研究与实现[J].中国中医药咨讯,2009(6):11.

[2] 李东.批量数据处理系统的设计与实现[J].电脑知识与技术,2005(8):12-13.

[3] 刘娟,杨丽君.基于Java的Excel文件操作[J].电脑知识与技术,2007,2(12).

上一篇:校园网络防雷系统的设计与实现 下一篇:图像识别的技术现状和发展趋势