页面是jsp做的,后台的controller如下所示,为什么我点击前端还是实现不了下载呢?
@RequestMapping(value = "regionInfoDload",method = RequestMethod.GET)
public void infoDownLoad(Integer regionLevel, HttpServletRequest request, HttpServletResponse response, Model model) {
System.out.println("从前台获得的regionLevel: " + regionLevel);
List<TljsjkAjlj15> listTest = tljsjkAjlj15Service.conditionDownload(regionLevel, null,null);
System.out.println("测试下载查询的数据总量: " + listTest.size());
//1.创建excel的文档对象
HSSFWorkbook wb = new HSSFWorkbook();
//2.创建excel的表单
HSSFSheet sheet = wb.createSheet("性别");
//设置行的高度
//sheet.setColumnWidth(i, 256*18);
//3.excel字体
HSSFFont font = wb.createFont();
//4.excel样式
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中对齐
HSSFRow row = sheet.createRow(1);
HSSFCell cell = row.createCell(1);
cell.setCellValue("姓名");
cell = row.createCell(2);
cell.setCellValue("身高预测值");
System.out.println("======================100================");
for(int i =2;i<listTest.size() + 1;i++) {
row = sheet.createRow(i);
cell = row.createCell(1);
cell.setCellValue(listTest.get(i - 2).getJh() == null ? "":listTest.get(i - 2).getJh());
cell = row.createCell(2);
cell.setCellValue(listTest.get(i - 2).getYlmbqYc() == null ? 0: listTest.get(i - 2).getYlmbqYc());
}
System.out.println("======================200================");
try {
String fileName = new String("运营数据.xls".getBytes("utf-8"),"utf-8");
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("======================300================");
OutputStream os = null;
try {
os = response.getOutputStream();
wb.write(os);
os.flush();
Thread.sleep(10000);
System.out.println("======================400================");
} catch (Exception e) {
e.printStackTrace();
}finally {
if(os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
从前端发送请求,controller中的的代码执行到:System.out.println("======================400================");这一句,为什么还是实现不了?
大家知道我出错了在哪里吗?抑或大家有什么别的解决方案吗?望请各位路过的大咖不吝赐教。跪谢!
粗略看了下,,看着累,我贴上我的你分析下你的吧,架构SSM
首先前端,自己搞个单击事件就O啦
<a href="/employee/print" class="easyui-linkbutton" iconCls="icon-print" plain="true" data-cmd="print">导出</a>
Controller层
@RequestMapping("/print")
@ResponseBody
public void print( HttpServletResponse response) throws IOException {
// 获取到所有的客服资源池对像
EmployeeQuery employeeQuery = new EmployeeQuery();
employeeQuery.setRows(Integer.MAX_VALUE);//设置为最大
List<Employee> list = employeeService.findPageByQuery(employeeQuery).getRows();//getRows()中的rows是easyui的规定的一个参数也就是获取数据
// 创建一个Excl表格对象
HSSFWorkbook wb = new HSSFWorkbook();
// 建立新的sheet对象(excel的表单)
HSSFSheet sheet = wb.createSheet("员工Excl表格");
// 在sheet里创建第二行
HSSFRow row1 = sheet.createRow(0);
// 创建第一行设置单元格内容
row1.createCell(0).setCellValue("员工姓名");
row1.createCell(1).setCellValue("员工密码");
row1.createCell(2).setCellValue("职位");
row1.createCell(3).setCellValue("手机");
row1.createCell(4).setCellValue("邮件");
row1.createCell(5).setCellValue("部门");
row1.createCell(6).setCellValue("入职时间");
row1.createCell(7).setCellValue("状态");
row1.createCell(8).setCellValue("性别");
for (int i = 0; i < list.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
Employee employee = list.get(i);
// 创建单元格并设置单元格内容
row.createCell(0).setCellValue(employee.getUsername());//员工姓名
row.createCell(1).setCellValue(employee.getPassword());//员工密码
row.createCell(2).setCellValue(employee.getPosition());//职位
row.createCell(3).setCellValue(employee.getPhone());//手机
row.createCell(4).setCellValue(employee.getEmail());//邮箱
//部门
String name = "";
try {
name = employee.getDepartment().getName();
} catch (Exception e) {
}
row.createCell(5).setCellValue(name);
//入职时间
String time = "";
try {
Date inputTime = employee.getInputTime();
time = DateUtils.formatDateToString(inputTime, DateUtils.DATE_FORMAT_YMD);// DateUtils是我自己封装的一个时间工具类
} catch (Exception e) {
}
row.createCell(6).setCellValue(time);
//状态
String status = "";
try {
int num = employee.getStatus();
if (num == 1) {
status = "在职";
} else if (num == 2) {
status = "离职";
}
} catch (Exception e) {
}
row.createCell(7).setCellValue(status);
//性别
String sex = "";
try {
int num = employee.getSex();
if (num == 1) {
sex = "男";
} else if (num == 2) {
sex = "女";
}
} catch (Exception e) {
}
row.createCell(8).setCellValue(sex);
}
// 输出Excel文件
ServletOutputStream outputStream = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename=details.xls");
response.setContentType("application/msexcel");
wb.write(outputStream);
outputStream.flush();
outputStream.close();
}
代码的思路看上去没有问题
建议你,一个是去掉try catch调试,看看有没有丢出异常
一个是,简化你的excel导出的代码,导出一个空白表,或者只有一个单元格的,看行不行
还有就是一开始不要用中文,看看是不是中文编码的问题
最后,看下你浏览器有没有问题,是不是拦截了下载或者弹窗,特别是国产山寨垃圾浏览器,360、百度、腾讯一类的。
这个可以抓包看下。服务器返回数据了没有
可以尝试一下将生成的excel先到服务器找个临时地址存起来,再通过excel下载,调试的时候,只要生成的excel存在的话,下载就不是什么难事了。
XSSFWorkbook workbookXSSF = new XSSFWorkbook();
//生成excel文档
workbookXSSF.write(new FileOutputStream(ecxelPath));
一步一步的调试,不要着急,这个不难。
要得急直接在网上找个工具类。
前端不是ajax,是打开一个新页面window.location.href=url
假设你后台写的对,前端要用url不能用ajax,如果需要传参就window.location.href="regionInfoDload?regionLevel=“+regionLevel;
如果后台不对的话,可以参考Controller :https://github.com/815129099/bookManager/blob/master/src/main/java/com/smart/controller/book/UserController.java 的 exportAllege方法
工具类:https://github.com/815129099/bookManager/blob/master/src/main/java/com/smart/redis/ExcelParam.java
和 https://github.com/815129099/bookManager/blob/master/src/main/java/com/smart/redis/ExcelUtil.java
看着是真的累啊,你这个什么东西都放在一个方法里面