点击上方 "编程技术圈"关注, 星标或置顶一起成长
后台回复“大礼包”有惊喜礼包!
每日英文
The best way to escape from the past is not to avoid or forget it, but to accept and forgive it.
摆脱过去并不是逃避或者忘记,只是学着去承受和宽恕。
每日掏心话
我多么希望,有一个门口,早晨,阳光照在草上。我们站着,扶着自己的门窗,门很低,但太阳是明亮的。草在结它的种子,风在摇它的叶子,我们站着,不说话,就十分美好。
责编:乐乐 | 来自:白面小生链接:blog.csdn.net/qq_40437152/article/details/111411364
编程技术圈(ID:study_tech)第 1229 次推文
往日回顾:我差点信了......
正文
前言文件下载的场景很多(还不是需求丰富嘛~),那么什么是动态生成文件呢,就是用户选择文件内容,服务器端根据选择的数据生成某个格式的文件然后下载到客户端。单个嘛直接下载,多个打包下载咯!
项目场景项目中有个数据导出excel的需求,而且是批量,那么就要打包咯
解决步骤基本实现如下:
生成文件保存到临时目录 || 缓存到内存中将文件打包下载我不想废话了,上代码:
直接把文件输出流放到压缩流ZipOutputStream
List<String> fields = new ArrayList<>();
fields.add("字段1");
fields.add("字段2");
fields.add("字段3");
HSSFWorkbook workbook = excelUtil.getNewExcel("压缩文件测试", fields);
try {
response.setContentType("application/zip; charset=UTF-8");
//返回客户端浏览器的版本号、类型
String agent = request.getHeader("USER-AGENT");
String downloadName = "压缩文件测试.zip";
//针对IE或者以IE为内核的浏览器:
if (agent.contains("MSIE") || agent.contains("Trident")) {
downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
} else {
downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-disposition", "attachment;filename=" + downloadName);
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
//多个从这里就可遍历了
// --start
ZipEntry entry = new ZipEntry("第一个文件名.xls");
zipOutputStream.putNextEntry(entry);
ByteOutputStream byteOutputStream = new ByteOutputStream();
workbook.write(byteOutputStream);
byteOutputStream.writeTo(zipOutputStream);
// zipOutputStream.write(workbook.getBytes());
byteOutputStream.close();
zipOutputStream.closeEntry();
// --end
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
生成excel文件也贴一下,如下:
在公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。
public static HSSFWorkbook getNewExcel(String formName, List<String> fields) {
//新建excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
//新建工作表
HSSFSheet sheet = workbook.createSheet(formName);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth((short) 20);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
//字体应用到当前样式
style.setFont(font);
//创建表格行
HSSFRow row = sheet.createRow(0);
//设置表单名称
row.createCell(0).setCellValue(formName);
if (fields.size() - 1 > 0) {
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fields.size() - 1));
}
HSSFRow row1 = sheet.createRow(sheet.getLastRowNum() + 1);
//设置列标题行
for (int i = 0; i < fields.size(); i++) {
row1.createCell(i).setCellValue(fields.get(i));
}
return workbook;
}
一些实践总结,欢迎指正!
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
欢迎加入后端架构师交流群,在后台回复“学习”即可。
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。
别找了,想获取史上最简单的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
一个漂亮妹子的美团面试经历,4轮2小时,成功拿到Offer
永别了,91网站!宣布永久关闭
12 个非常适合做外包项目的开源后台管理系统
嘿,你在看吗?