在实际的项目中,使用java实现excel的读取和导出数据是很常见的技术。本文简单实现java导出excel并下载的功能。其中,java导出excel使用的是Apache poi技术,使用之前需要在项目中引入相关的jar包。poi相关技术之前有过探讨,在此不再赘述。
关于下载的功能实现,一种是通过超链接指向文件路径的方式实现下载,使用这种方式常见于文件上传之后的下载实现。当然,本例使用上述方式也能实现,分为2步:第一步是将文件导出到服务器相关目录,详见之前poi文章中的相关实现,相当于缓存文件;第二步,是使用超链接指向文件的路径。上述实现较为简单,本文不再赘述,本文讨论的是使用servlet实现excel文件的导出下载功能。
具体思路:
1.response通过设置Header和ContentType可以实现Excel文件的下载,具体设置如下:
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes(),"iso8859-1")+".xls");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
2. 使用poi可以将需要导出的数据写入OutputStream,而OutputStream可以由esponse.getOutputStream()提供,相关代码如下:
//excel写入输出流
wb.write(response.getOutputStream());
3.java实现excel的导出和下载的源代码如下:
package com.company.servlet;
import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
/**
* Excel导出并下载
* <p>Title:DownloadServlet </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author code legend
* @date 2016-10-31 下午9:10:17
*/
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建工作簿
HSSFWorkbook wb = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = wb.createSheet("new sheet");
for(int i=0;i<3;i++){
//设置列宽
sheet.setColumnWidth(i, 3000);
}
//创建行
HSSFRow row = sheet.createRow(0);
row.setHeightInPoints(30);//设置行高
//创建单元格
HSSFCell cell = row.createCell(0);
cell.setCellValue("用户信息表");
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
//创建行
HSSFRow row1 = sheet.createRow(1);
//标题信息
String[] titles = {"ID","用户名","密码"};
for(int i=0;i<3;i++){
//创建单元格
HSSFCell cell1 = row1.createCell(i);
cell1.setCellValue(titles[i]);
}
//模拟数据,实际情况下String[]多为实体bean
List<String[]> list = new ArrayList<String[]>();
list.add(new String[]{"1","zhangsan","111"});
list.add(new String[]{"2","lisi","222"});
list.add(new String[]{"3","wangwu","333"});
//循环赋值
for(int i=0;i<list.size();i++){
//创建行
HSSFRow row2 = sheet.createRow(i+2);
//创建单元格
HSSFCell cell1 = row2.createCell(0);
cell1.setCellValue(list.get(i)[0]);
//创建单元格
HSSFCell cell2 = row2.createCell(1);
cell2.setCellValue(list.get(i)[1]);
//创建单元格
HSSFCell cell3 = row2.createCell(2);
cell3.setCellValue(list.get(i)[2]);
}
String filename = "用户信息表";
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes(),"iso8859-1")+".xls");
//excel写入输出流
wb.write(response.getOutputStream());
OutputStream toClient = new BufferedOutputStream(
response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=utf-8");
toClient.flush();
toClient.close();
}
}
4.servlet在web.xml中的相关配置
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>com.company.servlet.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
5.访问测试
部署项目到Tomcat,启动Tomcat,访问http://localhost:8080/Chat/DownloadServlet
6.查看下载的excel文件
关于poi的相关知识可以查看我之前的文章《java导出excel之使用poi》,本例还可以不断完善。