Java中导入、导出Excel

一、介绍
当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统) 。或者是:我们已经习惯用Excel打印 。这样在我们实际的开发中,很多时候需要实现导入、导出Excel的应用 。
目前,比较常用的实现Java导入、导出Excel的技术有两种 POI和
下面我就分别讲解一下如何使用这两个技术实现导入、导出Excel
二、使用 POI导入、导出Excel
POI 是一套用于访问微软格式文档的Java API 。POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟 。官方主页,API文档
2.1 环境配置2.1.1下载jar
官方下载:这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版 。
2.1.2加入jar包
将根目录下的poi-3.6-.jar和Lib目录下三个通用包 --1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下
2.2POI HSSF API组件
HSSF(用于操作Excel的组件)提供给用户使用的对象在rg..poi.hssf.包中,主要部分包括Excel对象,样式和格式,还有辅助操作 。有以下几种对象:
常用组件:
excel的文档对象
excel的表单
excel的行
excel的格子单元
excel字体
日期格式
sheet头
sheet尾(只有打印的时候才能看到效果)
样式:
cell样式
辅助操作包括:
日期
打印
错误信息表
2.3 基本操作步骤
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个(),一个可以有多个sheet()组成,一个sheet是由多个row()组成,一个row是由多个cell()组成 。
基本操作步骤:
1、用打开或者创建“Excel文件对象”
2、用对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写 。
下面来看一个动态生成Excel文件的例子:
//创建HSSFWorkbook对象HSSFWorkbook wb = new HSSFWorkbook();//创建HSSFSheet对象HSSFSheet sheet = wb.createSheet("sheet0");//创建HSSFRow对象HSSFRow row = sheet.createRow(0);//创建HSSFCell对象HSSFCell cell=row.createCell(0);//设置单元格的值cell.setCellValue("单元格中的中文");//输出Excel文件FileOutputStream output=new FileOutputStream("d:\\workbook.xls");wkb.write(output);output.flush();
HSSF读取文件同样还是使用这几个对象,只是把相应的方法变成了方法即可 。可见只要理解了其中原理,不管是读还是写亦或是特定格式都可以轻松实现,正所谓知其然更要知其所以然 。
2.4 导出Excel应用实例
在2.3中我们寥寥几行代码实际上就已经就是实现了导出Excel一个简单示例,下面我们在看如何实现导出如图所示的Excel表格?

Java中导入、导出Excel

文章插图
代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用 。这里直接写在控制层组件,如的doGet/方法或框架的方法中)
//创建HSSFWorkbook对象(excel的文档对象)HSSFWorkbook wb = new HSSFWorkbook();//建立新的sheet对象(excel的表单)HSSFSheet sheet=wkb.createSheet("成绩表");//在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个HSSFRow row1=sheet.createRow(0);//创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个HSSFCell cell=row1.createCell(0);//设置单元格内容cell.setCellValue("学员考试成绩一览表");//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列,截至列sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));//在sheet里创建第二行HSSFRow row2=sheet.createRow(1);//创建单元格并设置单元格内容row2.createCell(0).setCellValue("姓名");row2.createCell(1).setCellValue("班级");row2.createCell(2).setCellValue("笔试成绩");row2.createCell(3).setCellValue("机试成绩");//在sheet里创建第三行HSSFRow row3=sheet.createRow(2);row3.createCell(0).setCellValue("李明");row3.createCell(1).setCellValue("As178");row3.createCell(2).setCellValue(87);row3.createCell(3).setCellValue(78);//.....省略部分代码//输出Excel文件OutputStream output=response.getOutputStream();response.reset();response.setHeader("Content-disposition", "attachment; filename=details.xls");response.setContentType("application/msexcel");wkb.write(output);output.close();retrun null;