Easyexcel(3-文件导出)

news/2025/3/6 16:37:22/文章来源:https://www.cnblogs.com/penggx/p/18755789

响应头设置

通过设置文件导出的响应头,可以自定义文件导出的名字信息等

//编码格式为UTF-8
response.setCharacterEncoding("UTF-8");//让服务器告诉浏览器它发送的数据属于excel文件类型
response.setContentType("application/vnd.ms-excel;charset=UTF-8");//描述内容在传输过程中的编码格式,BINARY可能不止包含非ASCII字符,还可能不是一个短行(超过1000字符)。
response.setHeader("Content-Transfer-Encoding", "binary");//must-revalidate:强制页面不缓存,post-check=0, pre-check=0:0秒后,在显示给用户之前,该对象被选中进行更新过
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");//表示响应可能是任何缓存的,即使它只是通常是非缓存或可缓存的仅在非共享缓存中
response.setHeader("Pragma", "public");//告诉浏览器这个文件的名字和类型,attachment:作为附件下载;inline:直接打开
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");

写入单个Sheet

一次性写入数据

指定导出内容所对应的对象信息,通过doWrite写入数据

注意:doWrite方法必须传入的是集合

@Data
public class User {@ExcelProperty(value = "用户Id")private Integer userId;@ExcelProperty(value = "姓名")private String name;@ExcelProperty(value = "手机")private String phone;@ExcelProperty(value = "邮箱")private String email;@ExcelProperty(value = "创建时间")private Date createTime;
}
@GetMapping("/download1")
public void download1(HttpServletResponse response) {try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");User user = new User();user.setUserId(123);user.setName("as");user.setPhone("15213");user.setEmail("5456");user.setCreateTime(new Date());EasyExcel.write(response.getOutputStream(), User.class).sheet("模板").doWrite(Arrays.asList(user));} catch (Exception e) {e.printStackTrace();}
}

分批写入数据

@GetMapping("/download2")
public void download2(HttpServletResponse response) {ExcelWriter excelWriter = null;try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");User user = new User();user.setUserId(123);user.setName("as");user.setPhone("15213");user.setEmail("5456");user.setCreateTime(new Date());excelWriter = EasyExcel.write(response.getOutputStream(), User.class).build();WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();// 业务逻辑处理,分页查询excelWriter.write(Arrays.asList(user), writeSheet);excelWriter.write(Arrays.asList(user), writeSheet);} catch (Exception e) {e.printStackTrace();} finally {if (excelWriter != null) {excelWriter.finish();}}
}

通过WriteSheet对象可以指定要写入的Sheet,通过上面方式我们可以手工控制流的关闭,这样我们就可以实现多次写。可以实现分页查询获取数据,然后将数据写入Excel中,避免一次性加载的数据过多,导致内存溢出

在使用excelWriter.write方式时务必保证至少执行一次write,这样是为了将sheet和表头写入excel,否则打开excel时会报错。write的第一个参数可以为null

导出表头自定义

使用注解的方式定义表头时不能动态控制,每次修改表头内容时只能重新修改代码,这时可以通过head方法动态传参自定义表头

注意:内容结构必须是List<List<T>>,如果使用List<T>会出现问题

@GetMapping("/download3")
public void download3(HttpServletResponse response) {ExcelWriter excelWriter = null;try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");User user = new User();user.setUserId(123);user.setName("as");user.setPhone("15213");user.setEmail("5456");user.setCreateTime(new Date());List<List<String>> heads = new ArrayList<>();heads.add(Arrays.asList("姓名"));heads.add(Arrays.asList("年龄"));heads.add(Arrays.asList("地址"));excelWriter = EasyExcel.write(response.getOutputStream()).head(heads).build();WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();excelWriter.write(Arrays.asList(user), writeSheet);} catch (Exception e) {e.printStackTrace();} finally {if (excelWriter != null) {excelWriter.finish();}}
}

导出内容自定义

当导出的内容不是某个固定的实体类时,希望导出不同的内容时可以通过List<List<String>>自定义要写入的内容

@GetMapping("/download5")
public void download5(HttpServletResponse response) {ExcelWriter excelWriter = null;try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");List<List<String>> heads = new ArrayList<>();heads.add(Arrays.asList("姓名"));heads.add(Arrays.asList("年龄"));heads.add(Arrays.asList("地址"));excelWriter = EasyExcel.write(response.getOutputStream()).head(heads).build();WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();List<List<String>> dataList = new ArrayList<>();dataList.add(Arrays.asList("张三", "18", "上海"));dataList.add(Arrays.asList("李四", "28"));excelWriter.write(dataList, writeSheet);} catch (Exception e) {e.printStackTrace();} finally {if (excelWriter != null) {excelWriter.finish();}}
}

写入多个表头

若业务需求要求在同一个Sheet中写多个表,就需要用到WriteTable了。只定义一个WriteSheet,有几个表就定义几个WriteTable即可

@GetMapping("/download4")
public void download4(HttpServletResponse response) {ExcelWriter excelWriter = null;try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");User user = new User();user.setUserId(123);user.setName("as");user.setPhone("15213");user.setEmail("5456");user.setCreateTime(new Date());excelWriter = EasyExcel.write(response.getOutputStream()).build();WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();List<List<String>> heads1 = new ArrayList<>();heads1.add(Arrays.asList("姓名"));heads1.add(Arrays.asList("年龄"));heads1.add(Arrays.asList("地址"));WriteTable writeTable1 = EasyExcel.writerTable(1).head(heads1).needHead(true).build();List<List<String>> heads2 = new ArrayList<>();heads2.add(Arrays.asList("姓名"));heads2.add(Arrays.asList("年龄"));heads2.add(Arrays.asList("地址"));heads2.add(Arrays.asList("出生日期"));WriteTable writeTable2 = EasyExcel.writerTable(2).head(heads2).needHead(true).build();excelWriter.write(Arrays.asList(user), writeSheet, writeTable1);excelWriter.write(Arrays.asList(user), writeSheet, writeTable2);} catch (Exception e) {e.printStackTrace();} finally {if (excelWriter != null) {excelWriter.finish();}}
}

写入多个Sheet

通过EasyExcel.writerSheet创建对应的sheet,然后在写入sheet时指定对应的WriteSheet即可,同时可指定每个Sheet对应的对象

@GetMapping("/download6")
public void download6(HttpServletResponse response) {ExcelWriter excelWriter = null;try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");List<List<String>> heads = new ArrayList<>();heads.add(Arrays.asList("姓名"));heads.add(Arrays.asList("年龄"));heads.add(Arrays.asList("地址"));excelWriter = EasyExcel.write(response.getOutputStream()).head(heads).build();WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "测试1").build();WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "测试2").build();User user = new User();user.setUserId(123);user.setName("as");user.setPhone("15213");user.setEmail("5456");user.setCreateTime(new Date());excelWriter.write(Arrays.asList(user), writeSheet1);excelWriter.write(Arrays.asList(user), writeSheet2);} catch (Exception e) {e.printStackTrace();} finally {if (excelWriter != null) {excelWriter.finish();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/894691.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天嵌通途xczu15eg学习笔记——PL端DDR4的MIG IP核配置及测试过程

首先这是PL端的DDR4芯片,型号为MT40A256M16GE-075E,256Mx16,即512MB,由于不能上传附件,所以PDF还请大家自行上网搜索下载。DDR4参数的获取参考了以下两个CSDN的博客。 https://ztzhang.blog.csdn.net/article/details/142444632 https://blog.csdn.net/apple_53311083/art…

ThingsPanel与ThingsBoard:深度对比与选型剖析

在物联网平台领域,ThingsPanel和ThingsBoard各有千秋,为助大家明晰二者差异、精准选型,以下将从多个核心维度展开深度解读:ThingsPanelThingsBoard一、开源协议与版本模式开源协议: ThingsPanel遵循AGPLv3.0协议。 ThingsBoard采用Apache2.0协议。 版本提供:二者均配备社…

2025 年开源替代方案为何正在取代 OutSystems?技术自由度与成本优势深度解析

2025 年企业为何转向开源?揭秘 OutSystems 四大痛点,推荐 NocoBase、Appsmith、Budibase 等开源方案,帮助你的团队实现技术自由+成本优势双赢。原文链接:https://www.nocobase.com/cn/blog/outsystems-open-source-alternatives OutSystems 的隐藏成本不只是金钱 OutSystem…

rocketmq引入版本不对的问题

原因是,公司电脑可以正常启动,自己的电脑启动报错,报错是缺少了这个类 之后查看版本发现对不上,公司的事4.9.7,自己上面的居然是5.1.4 然后去除版本指定版本,不知道是否有问题,反正启动没问题了,不过部署还是用公司电脑吧,怕出问题<dependency><groupId>o…

navicat如何导出数据?附navicat15安装包

前言 大家好,我是小徐啊。navicat是我们常用的数据库连接工具,其功能十分强大。可以说是我使用过的各个连接工具中,最强大的工具。今天,小徐就来介绍下如何在navicat里面导出数据。文末附navicat15获取方式。 如何导出数据 首先,打开navicat,然后连接我们要导出的数据库。…

城市犯罪大数据时空分析与预测系统

随着城市化进程的加快,城市犯罪问题日益突出,对社会稳定和居民安全构成严重威胁。为了有效预防和打击犯罪,提升城市管理水平,构建城市犯罪大数据时空分析与预测系统显得尤为重要。本文将从系统建设内容的角度,探讨如何利用大数据和遥感技术,为城市安全保驾护航。一、系统…

华为云昇腾专区重磅上线!带你入门昇腾AI技术与DeepSeek实践

华为云昇腾专区重磅上线!专区围绕DeepSeek对话、互动式课程体系、业界主流大模型、免费实践环境四大核心能力,打造“体验—学习—应用”闭环,助力开发者实现AI转型“零门槛”跃迁。摘要:专区围绕DeepSeek对话、互动式课程体系、业界主流大模型、免费实践环境四大核心能力,…

基因测序芯片(Flowcell)加工工艺 -原子能和替代能源委员会生物梅里埃公司

一、公司简介: 原子能和替代能源委员会生物梅里埃公司 二、主流产品三、专利检索 ★专利检索1: ★专利: US8647465B2-Method of bonding microstructured substrates-2003 ★测序芯片(Flowcell)类型: 纳米孔FC ★加工工艺 1、一种含有微结构(5-50um)的基板的胶水粘接方…

React18 04 JSX底层渲染机制--创建虚拟DOM与真实DOM

关于JSX底层处理机制 1)首先,编写的JSX语法,编译为虚拟DOM对象(virtualDOM) 虚拟DOM对象:框架内部构建的一套对象体系(对象的相关成员都是React内部规定的),基于这些属性描述出所构建视图中的DOM节点的相关特征。 a. 基于babel-preset-react-app,把JSX编译为React.cr…

欢迎加入ARM64技术手册知识库

本文来自博客园,作者:dolinux,未经同意,禁止转载

基因测序芯片(Flowcell)加工工艺 -赛陆医疗

一、公司简介: 赛陆医疗是一家测序和空间组学平台开发商,公司专注于开发自主知识产权的上游测序平台,并基于其上构建了全球领先的超分辨空间组学平台,实现基因组学和空间组学产品的自主开发及科研临床端转化。公司创立于2020年,由美国知名大学教授和三位深圳市孔雀人才联合…