前言
关于java控制Excel数据的操作是非常常见的,场景也是非常的多,这里我给大家分享一个通用基础的模板,方便大家自己去调试使用。
环境
springboot 2.2.7
jdk 1.8
导入工具
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
说明:
- hutool是一个开源的工具类,里面封装了很多常用的工具具体可以查看这个网站。
- poi-ooxml 是Apache旗下的一个开源项目,由Apache官方维护专门针对Excel做操作的组件
一、上传与解析Excel
1.准备一个Excel和对应的Bean对象
我们在F:\test文件夹中准备一个名叫abc.xlsx的Excel文件。文件内容如下:
在springboot中创建一个相对应的bean对象,get/set方法与toString方法请自己完成。
public class User {
private String name;
private Integer age;
private Date birthDate;
}
编写接受上传文件的接口
前端就请自己写个很简单的上传即可,vue,html的均可。
@Controller
@RequestMapping("/excel")
public class ExcelController {
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file){
// 判断文件是否为空,空则返回失败页面
if (file.isEmpty()) {
return "没有检测到上传的Excel文件。";
}
//获取Excel读取器
ExcelReader excelReader = null;
try {
excelReader = ExcelUtil.getReader(file.getInputStream(), 0);
} catch (IOException e) {
e.printStackTrace();
}
//设置是否忽略空行
excelReader.setIgnoreEmptyRow(true);
//配置别名
Map<String,String> aliasMap=new HashMap<>();
aliasMap.put("姓名","name");
aliasMap.put("年龄","age");
aliasMap.put("出生日期","birthDate");
excelReader.setHeaderAlias(aliasMap);
// 第一个参数是指表头所在行,第二个参数是指从哪一行开始读取
List<User> list= excelReader.read(0, 1, User.class);
for (User user:list){
System.out.println(user.toString());
}
return "上传解析成功!";
}
}
将之前准备的abc.xlsx进行上传
我们可以看到,系统已经把完整的数据读取出来了。
笔者在这里边写边给大家做教程的时候遇到一个问题,因为本人用的vue,前端报错了CORS的跨域问题,需要大家加个配置防止跨域即可,具体情况跨域参考本人另一篇博客,当然,大家也可以自行解决。
二、下载为Excel
准备数据
我们还是以刚刚的系统为基础,组装一份User对象的数据。
//组装List数据
private List<User> getList(){
List<User> list=new ArrayList<>();
list.add(new User("李一",22,new Date()));
list.add(new User("李二",27,new Date()));
list.add(new User("李三",33,new Date()));
list.add(new User("李四",55,new Date()));
list.add(new User("李五",76,new Date()));
return list;
}
编写Controller
@RequestMapping("/download")
public void download(HttpServletResponse response){
List<User> list=this.getList();
//参数ture代表导出为xlsx格式,false代表xls格式
ExcelWriter writer = ExcelUtil.getWriter(true);
//配置表头
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年龄");
writer.addHeaderAlias("birthDate", "出生日期");
//使用表头,只有存在表头配置的字段才会输出
writer.setOnlyAlias(true);
writer.write(list, true);
response.setHeader("content-Type", "application/vnd.ms-excel");
ServletOutputStream out=null;
try {
response.setHeader("Content-disposition", "attachment;fileName=" + URLEncoder.encode("S4C.xlsx", "UTF-8") + "");
response.setCharacterEncoding("UTF-8");
out = response.getOutputStream();
}catch (Exception e){
System.out.println(e.getMessage());
}
writer.flush(out, true);
writer.close();
IoUtil.close(out);
}
注意: 配置表头别名时,我们尽量不要使用writer.setHeaderAlias()
这个方法,这个虽然看似方便可以像上传解析一样直接放入一个Map,但是导出的数据标题顺序是不固定的。
请求该接口
打开该文件
总结
由此可见,使用Hutool工具可以很方便的进行Excel的上传与下载,当然该组件还支持其他自定义单元格的功能,大家可以通过这个网站去查看下