经典:利用Java进行Excel的数据导入导出_第1页
经典:利用Java进行Excel的数据导入导出_第2页
经典:利用Java进行Excel的数据导入导出_第3页
经典:利用Java进行Excel的数据导入导出_第4页
经典:利用Java进行Excel的数据导入导出_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 引言MS 的电子表格(Excel)是Office 的重要成员,是保存统计数据的一种常用格式。在一个Java 应用中,将一部分数12021/8/6据生成Excel 格式,是与其他系统无缝连接的重要手段。在远程网络教学系统中,利用Excel 表格统计学生的作业考试情况信息,便于老师了22021/8/6解学生的学习情况,分析教学效果,制定教学计划。所以,用Java 操作Excel 表格,导出相关的信息对于远程网络教育系统有着的很重要32021/8/6的意义。在开源世界中,有两套比较有影响的API 提供Excel 数据导入导出的功能,一个是POI,一个是jExcelAPI。本文结合42021/8

2、/6基于J2EE 开发的多媒体教学系统中提供的将学生作业信息导出到Excel 表格中的实例,详细阐述了利用JAVA 开发的jExcelAPI52021/8/6操作excel 的方法。2. Jxl 简介2.1 Java 语言简介Java 语言具有面向对象、与平台无关、安全、稳定和多线程62021/8/6等优良特性,是目前软件设计中极为强大的编程语言1。它具有以下一些特点2:简单,面向对象,分布式,解释执行,鲁棒,安全,体系结72021/8/6构中立,可移植,高性能,多线程以及动态性。2.2 什么是JxlJava Excel 是一开放源码项目,通过它Java 开发人员可以读82021/8/6取Ex

3、cel 文件的内容、创建新的Excel 文件、更新已经存在的Excel 文件。使用该 API 非Windows 操作系统也可以通92021/8/6过纯Java 应用来处理Excel 数据表。因为是使用Java 编写的,所以我们在Web 应用中可以通过JSP、 Servlet 来调102021/8/6用API 实现对Excel 数据表的访问。Jxl 发布的稳定版本是V2.0,提供以下功能:从 Excel 95、97、2000 等格112021/8/6式的文件中读取数据3;读取 Excel 公式(可以读取Excel 97 以后的公式)3;生成Excel 数据表(格式为Excel122021/8/6

4、97)3;支持字体、数字、日期的格式化3;支持单元格的阴影操作,以及颜色操作3;修改已经存在的数据表。2.3132021/8/6代码举例2.3.1 从Excel 文件读取数据表Java Excel API 既可以从本地文件系统的一个文件(.xls),也可以从输142021/8/6入流中读取Excel数据表。读取Excel 数据表的第一步是创建Workbook(术语:工作薄),相关文献中给出了部分事例介绍4152021/8/6,下面的代码片段举例说明了应该如何操作:import java.io.*;import jxl.*; try162021/8/6/构建Workbook 对象, 只读Work

5、book 对象/直接从本地文件创建Workbook/从输入流创建Workbo172021/8/6okInputStream is=new FileInputStream(sourcefile);jxl.Workbook rwb=182021/8/6Workbook.getWorkbook(is);catch (Exception e)e.printStackTrace(192021/8/6);一旦创建了 Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。代码如下:/获取第一张She202021/8/6et 表Sheet rs=rwb.getSheet(0);我们既

6、可能通过Sheet 的名称来访问它,也可以通过下标来访问它。如果通过212021/8/6下标来访问的话,要注意的一点是下标从0 开始,就像数组一样。一旦得到了 Sheet,我们就可以通过它来访问Excel Cell(术语222021/8/6:单元格)。代码如下:/获取第一行,第一列的值Cell c00=rs.getCell(0, 0);String strc00=232021/8/6c00.getContents();/获取第一行,第二列的值Cell c10=rs.getCell(1, 0);String242021/8/6strc10=c10.getContents();/获取第二行,第二列

7、的值Cell c11=rs.getCell(1, 1);St252021/8/6ring strc11=c11.getContents();如果仅仅是取得Cell 的值,我们可以方便地通过getContents()方262021/8/6法,它可以将任何类型的Cell 值都作为一个字符串返回。示例代码中 Cell(0, 0)是文本型,Cell(1, 0)是数字型,Ce272021/8/6ll(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。当完成对 Excel 电子表格数据的处理后,一定要使282021/8/6用close()方法来关闭先前创建的对象,以释放读取数据

8、表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。/操作完成时,关292021/8/6闭对象,释放占用的内存空间rwb.close();2.3.2 生成新的Excel 工作薄与读取 Excel 工作表相似,首先要使302021/8/6用Workbook 类的工厂方法创建一个可写入的工作薄(Workbook)对象,相关文献中给出了事例介绍4,具体代码如下:try312021/8/6/构建Workbook 对象, 只读Workbook 对象/Method 1:创建可写入的Excel 工作薄jxl.w322021/8/6rite.WritableWorkbook wwb=Workbook.c

9、reateWorkbook(new File(targetfile)332021/8/6);/Method 2:将WritableWorkbook 直接写入到输出流catch (Exception e)e.342021/8/6printStackTrace();/创建Excel 工作表jxl.write.WritableSheet ws=wwb.cre352021/8/6ateSheet(Test Sheet 1, 0);/1.添加Label 对象jxl.write.Label labelC=n362021/8/6ew jxl.write.Label(0, 0, This is a Label

10、 cell);ws.addCell(labelC);372021/8/6/添加带有字型Formatting 的对象jxl.write.WritableFont wf=new jxl.write.Writab382021/8/6leFont(WritableFont.TIMES,18,WritableFont.BOLD, true);jxl.write.Wr392021/8/6itableCellFormat wcfF=new jxl.write.WritableCellFormat(wf);jxl.write402021/8/6.Label labelCF=new jxl.write.Labe

11、l(1, 0, This is a Label Cell, wcfF)412021/8/6;ws.addCell(labelCF);2.3.3 单元格操作1)合并单元格WritableSheet.mergeCell422021/8/6s(int m,int n,int p,int q);作用是从(m,n)到(p,q)的单元格全部合并,比如:WritableShee432021/8/6t sheet=book.createSheet(“第一页”,0) 5;/合并第一列第一行到第六列第一行的所有单元格sheet442021/8/6.mergeCells(0,0,5,0);合并既可以是横向的,也可以

12、是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。2452021/8/6)行高和列宽WritableSheet.setRowView(int i,int height);作用是指定第i+1 行的高度,比如462021/8/6:/将第一行的高度设为2005sheet.setRowView(0,200);WritableSheet.setColum472021/8/6nView(int i,int width);作用是指定第i+1 列的宽度,比如:/将第一列的宽度设为305sheet.s482021/8/6etColumnView(0,30);3. 应用实例本文所举的实例为网上多媒体教学系

13、统中对于学生作业导出信息的实现。3.1 系统492021/8/6界面及导出表实例下图 1 为导出功能的入口:点击导出此次作业的成绩按钮,就会触发相应的动作,进行数据表的导出3.2 实现代码导出502021/8/6之前首先要定义一个 SingleTaskScoreExportInfo 对象,用来存放从数据库中查询出来的导出表需要的相关字段的信息。它512021/8/6是作业接收者对象的一个子集,只包含了作业接收者对象中学号,姓名,班级,作业标题,完成时间,分数,查看次数等信息。为数据导出按钮连接消522021/8/6息处理函数:函数主要包括生成工作表,调用方法从数据库中将对应某次作业的作业接收者

14、的信息查找出来, 并用相关的属性初始化SingleT532021/8/6askScoreExportInfo 对象,放在结果集中,构造循环将查询到的结果集中的对象写入到Excel 表格中。以下是实现的主要代码542021/8/6:/定义表格名称为作业成绩,创建工作薄String filename=作业成绩;response.setHeader(C552021/8/6ontent-Disposition ,attachment;filename=+newString(filename.getBy562021/8/6tes(),iso8859-1)+.xls);OutputStream os=re

15、sponse.getOutputStream(572021/8/6);WritableWorkbook wwb=Workbook.createWorkbook(os);/创建工作表,并写入相应的表582021/8/6头字段WritableSheet sheet=wwb.createSheet(所有成绩, 0);String title=学592021/8/6号,班级,姓名,作业标题,完成时间,分数,次数;for (int j=0; j title.length602021/8/6; j+) / 在sheet 中写标题栏sheet.addCell(new Label(j, 0, titlej,

16、arial612021/8/612format);/查询需要的数据,放在List 结果集中List s622021/8/6cores =studyManager.getSingleTaskScoresByCourse(courseId,taskId);/632021/8/6/将相关的信息写入到工作表SingleTaskScoreExportInfo item;int row=1;for (it=sc642021/8/6ores.iterator(); it.hasNext();) item=(SingleTaskScoreExportInfo) it652021/8/6.next();if(!

17、.equals(item.getStudentNum()&null!=item.getStudentNu662021/8/6m()/添加学号Label label=new Label(0, row, item.getStudentNum();s672021/8/6heet.setColumnView(0, 20);sheet.addCell(label);/添加班级label=new L682021/8/6abel(1, row, item.getClassGroupName();sheet.setColumnView(1, 50);692021/8/6sheet.addCell(la

18、bel);/添加姓名label=new Label(2,row,item.getStudentNa702021/8/6me();sheet.setColumnView(2, 10);sheet.addCell(label);/添加作业标题712021/8/6label=new Label(3,row,item.getTaskTitle();sheet.setColumnView(3, 30722021/8/6);sheet.addCell(label);/ 添加完成时间SimpleDateFormat sdf=new SimpleD732021/8/6ateFormat(yyyy-MM-dd

19、HH:mm:ss);WritableCellFormat wc=new WritableC742021/8/6ellFormat();wc.setAlignment(Alignment.CENTRE);sheet.setColumnView(4,752021/8/630);if(item.getFinishTime()!=null)String newdate=sdf.format(item.762021/8/6getFinishTime();label=new Label(4,row,newdate,wc);sheet.addCell(l772021/8/6abel); elselabel=

20、new Label(4,row,未查看此次作业,wc);sheet.addCell(label782021/8/6);/添加分数Number score=new Number(5, row, item.getScore(), wcf);d792021/8/6ouble score_temp=score.getValue();if(0score_temp&score_temp0.6)802021/8/6 sheet.addCell(new Number(5, row, score_temp*100, redFormat); els812021/8/6e if (item.getFinishTime()=null)sheet.addCell(new Number(5, row, -1,822021/8/6redFormat);else if(item.getFinishTime()!=null&(score_temp=0|832021/8/6.equals(item.getScore()sh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论