赞
踩
我是使用的hutool类库中的ExcelWriter和ExcelReader类,所以我们需要添加hutool依赖,添加依赖代码如下
- <dependency>
- <groupId>cn.hutool</groupId>
- <artifactId>hutool-all</artifactId>
- <version>5.7.20</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-ooxml</artifactId>
- <version>4.1.2</version>
- </dependency>
- </dependencies>
导出功能的实现分为以下七个步骤:
(1)数据查询
(2)选择写出到磁盘或者在浏览器操作
(3)自定义表头名
(4)写出
(5)设置浏览器响应格式
(6)获取输出流并将数据刷新到输出流
(7)关闭输出流和write
代码如下:
-
- //导出
- @GetMapping("/export")
- public void export(HttpServletResponse response) throws Exception{
- List<User> list=userService.list();//数据查询
- /* ExcelWriter writer = ExcelUtil.getWriter("/");*///写出到磁盘
- ExcelWriter writer = ExcelUtil.getWriter(true);//在浏览器操作
- writer.addHeaderAlias("id","工号");
- writer.addHeaderAlias("username","职称");
- writer.addHeaderAlias("password","密码");
- writer.addHeaderAlias("nickname","姓名");
- writer.addHeaderAlias("email","邮箱");
- writer.addHeaderAlias("phone","电话");
- writer.addHeaderAlias("address","地址");
- writer.addHeaderAlias("createTime","修改时间"); //自定义表头名
-
- writer.write(list,true);//一次性写出list到write
- //浏览器响应设置
- response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
- String fileName= URLEncoder.encode("员工信息","UTF-8");//设置文件名并编码
- response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
-
- ServletOutputStream out=response.getOutputStream();//获取输出流
- writer.flush(out,true);//将数据写入输出流
- out.close();//关闭输出流
- writer.close();//关闭writer
-
- }
运行结果:
代码如下:
- //导入
- @PostMapping("/import")
- public void imp(MultipartFile file) throws Exception{
- InputStream inputStream=file.getInputStream();
- ExcelReader reader=ExcelUtil.getReader(inputStream);//获取流
- List<User> list=reader.readAll(User.class);//读取流,注意一定要指定范形,否则默认是objec类型,会保错
- System.out.println(list);
- }
运行结果:
我这里是用的apifox的api测试接口进行测试
导出的excel有的列显示的是#,像这样
导致这种情况是因为列宽太小,解决方案
(1)拖一下就好
(2)用ExcelWriter里的setColumnWidth方法,第一个参数为指定列(-1为全部列),第二个参数为列宽
writer.setColumnWidth(-1,18);
(3)用ExcelWriter里的autoSizeColumnAll方法,可以自适应列宽,但是此方法的列宽标准是第一行,如果下面的行字符数量比第一行多,则会导致下面行显示为#号
writer.autoSizeColumnAll();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。