导出excel为字节流

@Controller  ///controller层
@RequestMapping("/export") ///Request请求url
public class ExportController {
@ResponseBody  ///Response响应
@GetMapping("build/{project_id}") ///get请求url
public Object build(@PathVariable Integer project_id,HttpServletResponse re) {  ///声明传参和 http 请求

	///new ExcelWriter(InputStream in, boolean xls) 声明 excel 模板,模板是 xls格式 ,boolean 为 true;模板不是 xls 格式,boolean 为 false ,此处模板格式为 xlsx ,所以 boolean 为false 。
	///模板位置:sts 中,src/main/java 中存 java 文件,src/main/resources 中存资源文件,excel模板存在资源文件中 ,存的位置是/static/template/buildExport.xlsx
	///Class.getResourceAsStream(String name) 方法读取 src/main/resources 中的文件,并返回为 InputStream
	ExcelWriter ex = new ExcelWriter(ExportController.class.getResourceAsStream("/static/template/buildExport.xlsx"),false);
	Map<String, Object> infos = new HashMap<>();
	infos.put("tablename", "excel导出"); ///声明 excel 表头名称
	List<Excel> excelist = getByProject(project_id);
	List<Map<String,Object>> maplist = new LinkedList<>();   ///将 excelist 中相关参数 按需求进行格式转化,添加到 maplist 中
	if(excelist .size() > 0) {
		excelist .forEach(b -> {  ///将 build 中相关参数格式化后添加到 bmap
			Map<String,Object> bmap = new HashMap<>();
			maplist.add(bmap);  ///bmap添加到maplist
			bmap.put("name", b.getName());
			bmap.put("created_at", b.getCreated_at());
			bmap.put("ordernumber", "Build_" + b.getOrdernumber());
		});
	}
	infos.put("excellist", maplist);
	ex.setMarker(infos);
	byte[] bytes = ex.getBytes();
	// 设置http协议头部
	HttpHeaders headers = new HttpHeaders();
	// 设置文件名
	String fileName = "";
	try {
		fileName = new String((proservice.getById(project_id).getName() + "导出.xlsx").getBytes("UTF-8"), "iso-8859-1");// 为了解决中文名称乱码问题
	} catch (Exception e) {
		e.printStackTrace();
	}
	///设置http协议头部信息
	headers.setContentDispositionFormData("attachment", fileName);
	headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
	re.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
	return bytes; ///返回字节流
}

posted @ 2020-12-16 14:31  来一杯coffee  阅读(724)  评论(0)    收藏  举报