关于JAVA WEB的导出
1、网页的导出不能直接使用ajax进行,因为ajax是网页异步进行的JS和XML,只能进行字符流的传输,而文件流需要的是字节流,需要在js中使用location.href = url来提交文件下载请求
2、前一条当中的url如果需要在请求下载的同时提交参数,则需要进行一个url的拼接,但是这么有一个弊端:这个url会直接暴露在用户的浏览器中,如果需要隐藏这个参数则需要使用隐藏form表单的手段(暂时未实现,老师使用后端redirect进行网页转发)
1、导出Excel
在项目当中,有这么一条代码来根据选中的作业Id和班级Id来导出学生成绩Excel
var str = contextPath + "/searchExerciseScore/exportClassExerciseExcel/"
+ exeId + "/" + classId;
location.href = str;
在后端使用RequestMapping来映射获取url请求并进行数据处理后将结果返回流提交给前端
@RequestMapping("/exportClassExerciseExcel/{exeId}/{classId}")
在项目中,使用了poi的Excel文件管理来进行Excel方面的操作,在service中获取数据并将数据写入HSSFWorkbook wb对象中,并将对象返回给controller,并将wb写入返回流response的输出流OutputStream中,最后不要忘记将输出流和wb对象关闭!
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=student.xls");
OutputStream outputStream = response.getOutputStream();
wb.write(outputStream);
outputStream.flush();
wb.close();
outputStream.close();
2、导出单个PDF
在进行导出PDF前需要进行jar包的准备工作:itext-asian和itextpdf,两个jar需要版本一直才可使用,itext-asian是为了解决中文乱码的
在controller中:
//获得PDF文档的监听输出流
ByteArrayOutputStream baos = exportExercisePDFService.exportExercisePDF(exerciseScore, singleQuestions, multiQuestions, judgeQuestions, student);
//设置请求返回类型
response.setContentType("application/pdf");
//设置PDF文件名字,解决中文乱码问题
response.setHeader("Content-Disposition",
"attachment; filename=" + java.net.URLEncoder.encode(exerciseScore.getExeName() + "-" + student.getUserRealname() + ".pdf", "UTF-8"));
response.setContentLength(baos.size());
OutputStream out = response.getOutputStream();
//将监听输出流写到页面请求输出流中
baos.writeTo(out);
out.flush();
out.close();
在service中先将document写入到监听输出流ByteArrayOutputStream baos当中,然后再返回给controller,不要忘记在service的最后将document关闭了
Rectangle rectPageSize = new Rectangle(PageSize.A4);// A4纸张
Document document = new Document(rectPageSize, 40, 40, 40, 40);// 上、下、左、右间距
//监听输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
//PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:/Users/WTW/Desktop/dest.pdf"));
// 打开文档
document.open();
………………此处省略代码
// 关闭文档
document.close();
return baos;
3、导出多个PDF为一个zip压缩包
service可以同导出单个PDF的service一致,因为是在controller进行service返回的多个ByteArrayOutputStream的压缩工作
//设置请求返回类型
response.setContentType("application/zip");
//设置PDF文件名字,解决中文乱码问题
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(exerciseScores.get(0).getExeName() + ".zip", "UTF-8"));
ZipOutputStream zipOutput = new ZipOutputStream(response.getOutputStream());
……………………此处省略代码
//获得PDF文档的监听输出流
baos = exportExercisePDFService.exportExercisePDF(exerciseScore, singleQuestions, multiQuestions, judgeQuestions, student);
//在输出流中写入多个pdf文档
zipOutput.putNextEntry(new ZipEntry(exerciseScore.getStuName() + ".pdf"));
zipOutput.write(baos.toByteArray());
//清空list
singleQuestions.clear();
multiQuestions.clear();
judgeQuestions.clear();
//清空输出流缓存
baos.reset();