本篇文章演示文件下载代码的完整教程。
演示文件下载
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
<title>演示文件下载</title>
<script type="text/javascript">
$(function () {
//给"下载"按钮添加单击事件
$("#fileDownloadBtn").click(function () {
//发送文件下载的请求
window.location.href="workbench/activity/fileDownload.do";
});
});
</script>
</head>
<body>
<input type="button" value="下载" id="fileDownloadBtn">
</body>
</html>
演示文件下载Java代码(测试)
@RequestMapping("/workbench/activity/fileDownload.do")
public void fileDownload(HttpServletResponse response) throws Exception {
//1.设置响应类型
response.setContentType("application/octet-stream;charset=UTF-8");
//2.获取输出流
OutputStream out = response.getOutputStream();
//浏览器接收到响应信息之后,默认情况下,直接在显示窗口中打开响应信息;即使打不开,,也会调用应用程序打开,只有实在打不开,才会激活文件下载窗口
//可以设置响应头信息,使浏览器接收到响应信息之后,直接激活文件下载窗口,即使能打开也不打开
response.addHeader("Content-Disposition", "attachment;filename=mystudentList.xls");
//读取excel文件(inputStream),输出到浏览器(OutputStream)
FileInputStream is = new FileInputStream("D:\\Out\\studentList.xls");
byte[] buff = new byte[256];
int len = 0;
while ((len = is.read(buff)) != -1) {
out.write(buff, 0, len);
}
is.close();
out.flush();
}
FileInputStream is = new FileInputStream("D:\\Out\\studentList.xls");
//这部分模拟的是从后台服务器下载到自己的电脑上,注意:仅仅是模拟
使用apach-poi生成excel文件(测试)
package com.bjpowernode.crm.poi;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 使用apach-poi生成excel文件
*/
public class CreateExcelTest {
public static void main(String[] args) throws Exception{
//创建HSSFWorkbook对象,对应一个excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//使用wb创建HSSFSheet对象,对应wb文件中的一页
HSSFSheet sheet = wb.createSheet("学生列表");
//使用sheet创建
HSSFRow row = sheet.createRow(0);//行号:从0开始,依次增加
//使用row创建HSSFCell对象,对应row中的列
HSSFCell cell = row.createCell(0);//列得编号:从0开始,依次增加
cell.setCellValue("学号");
cell = row.createCell(1);//第1列
cell.setCellValue("姓名");
cell = row.createCell(1);//第2列
cell.setCellValue("姓名");
//生成HSSCellStyle对象,修饰
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
//循环
for (int i = 1; i <= 10; i++) {
row = sheet.createRow(1);
cell = row.createCell(0);//列得编号:从0开始,依次增加
cell.setCellValue(100+i);
cell = row.createCell(1);//第1列
cell.setCellValue("NAME" + i);
cell = row.createCell(1);//第2列
cell.setCellStyle(style);//居中
cell.setCellValue(20 + i);
}
//调用工具函数,生成excel文件
FileOutputStream fo = new FileOutputStream("D:\\Out\\studengList.xls");
wb.write(fo);
}
}
使用apach-poi生成excel文件并导出
@RequestMapping("/workbench/activity/exportAllActivitys.do")
public void exportAllActivitys(HttpServletResponse response) throws Exception {
//调用Service方法
List<Activity> activityList = activityService.queryAllActivitys();
//创建ecxel文件,并且把activiyList写入到excel文件中
//创建HSSFWorkbook对象,对应一个excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//使用wb创建HSSFSheet对象,对应wb文件中的一页
HSSFSheet sheet = wb.createSheet("市场活动");
//使用sheet创建
HSSFRow row = sheet.createRow(0);//行号:从0开始,依次增加
HSSFCell cell = row.createCell(0);//列得编号:从0开始,依次增加
cell.setCellValue("ID");
cell = row.createCell(1);
cell.setCellValue("所有者");
cell = row.createCell(2);
cell.setCellValue("名称");
cell = row.createCell(3);
cell.setCellValue("开始日期");
cell = row.createCell(4);
cell.setCellValue("结束日期");
cell = row.createCell(5);
cell.setCellValue("成本");
cell = row.createCell(6);
cell.setCellValue("描述");
cell = row.createCell(7);
cell.setCellValue("创建时间");
cell = row.createCell(8);
cell.setCellValue("创建者");
cell = row.createCell(9);
cell.setCellValue("修改时间");
cell = row.createCell(10);
cell.setCellValue("修改者");
//遍历List,创建HSSFRow对象
if (activityList != null && activityList.size() > 0) {
Activity activity = null;
for (int i = 0; i < activityList.size(); i++) {
activity = activityList.get(i);
//每遍历出一个activity,生成一行
row = sheet.createRow(i + 1);
cell = row.createCell(0);//列得编号:从0开始,依次增加
//每一行有11列,每一列的数据从activity中获取
cell.setCellValue(activity.getId());
cell = row.createCell(1);
cell.setCellValue(activity.getOwner());
cell = row.createCell(2);
cell.setCellValue(activity.getName());
cell = row.createCell(3);
cell.setCellValue(activity.getStartDate());
cell = row.createCell(4);
cell.setCellValue(activity.getEndDate());
cell = row.createCell(5);
cell.setCellValue(activity.getCost());
cell = row.createCell(6);
cell.setCellValue(activity.getDescription());
cell = row.createCell(7);
cell.setCellValue(activity.getCreateTime());
cell = row.createCell(8);
cell.setCellValue(activity.getCreateBy());
cell = row.createCell(9);
cell.setCellValue(activity.getEditTime());
cell = row.createCell(10);
cell.setCellValue(activity.getEditBy());
}
}
//根据wb对象,生成excel对象
/*FileOutputStream os = new FileOutputStream("D:\\Out\\activityList.xls");
wb.write(os);
os.close();
wb.close();*/
//把excel文件下载到客户端
//1.设置响应类型
response.setContentType("application/octet-stream;charset=UTF-8");
//浏览器接收到响应信息之后,默认情况下,直接在显示窗口中打开响应信息;即使打不开,,也会调用应用程序打开,只有实在打不开,才会激活文件下载窗口
//可以设置响应头信息,使浏览器接收到响应信息之后,直接激活文件下载窗口,即使能打开也不打开
response.addHeader("Content-Disposition", "attachment;filename=activityList.xls");
ServletOutputStream out = response.getOutputStream();
/*FileInputStream is = new FileInputStream("D:\\Out\\activityList.xls");
byte[] buff = new byte[256];
int len = 0;
while ((len = is.read(buff)) != -1) {
out.write(buff,0,len);
}
is.close();*/
wb.write(out);
wb.close();
out.flush();
}
在这里我们注释了如下代码:
为什么这么做呢?
如果我们使用被我们注释的代码,那么Excel文件的传输方式如上图,这样就会导致效率变低,我们优化代码,
ServletOutputStream out = response.getOutputStream();
//使用该代码,Excel文件的传输方式就是如下图,运行效率提高。