JAVA WEB导出Excel和PDF

本文详细介绍了在JAVAWEB项目中如何实现文件的导出功能,包括使用ajax进行文件下载的限制,利用location.href进行Excel导出的方法,以及通过itext和itext-asian库解决中文乱码问题的PDF导出策略,还涵盖了将多个PDF文件打包成zip压缩包的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值