1.前言
在我们的日常开发中,经常会碰到注入导入Excel数据到系统中的需求,而在导入Excel数据时,一般的业务系统都会提供数据的Excel模板,只有提交的Excel数据满足业务系统要求的模板时,数据才能够正常的导入系统中。因此针对这种需求,一般我们会在系统中提供一个Excel模板的下载按钮,业务人员在使用时,可以先下载Excel模板,然后按照模板中的格式将数据填充,即可导入成功。本文主要总结目前在开发这类需求时碰到的问题。
2.解决方案
从需求上来看,目前有大致三种解决方案,针对数据文件的模板下载,分别是:
- 模板文件直接存放在前端,作为静态资源,前端直接可以发送请求进行下载
- 模板文件存服务器磁盘,提供接口下载
- 模板文件存储在项目jar包中,提供接口下载
2.1 作为静态资源直接下载
第一种方式是最简单的,将数据文件直接作为静态资源放在前端目录,前端通过请求即可进行下载
2.2 模板文件存储在服务器,提供接口下载
第二种也是我们经常使用的方法,开发人员将模板文件放在服务器中的某个目录下,通过在代码中配置存储目录的方式,并且提供下载接口,当前端发起接口请求时,服务端根据请求将文件写入到响应流中
示例代码如下:
@Value("${templateFile}")
String downloadFilePath;
@GetMapping("/download")
public void downloadExcel(HttpServletResponse response){
logger.info("下载Excel模板");
try {
File file=new File(downloadFilePath);
ServletUtil.write(response,file);
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
因为文件存储在磁盘中,并且通过Spring提供的@Value
注解将文件的位置在配置文件中进行配置,因此文件对象我们可以直接通过new File
的方式直接获取到文件,最终调用工具类ServletUtil
将该文件写入到HttpServletResponse
的流中去,实现下载的目录
2.3 模板文件存在在jar中,提供接口下载
通过上面的两种下载方式,我们基本已经能实现文件的下载,满足业务的需要,但有时候我也会思考,是否把数据模板文件直接放在Spring Boot的jar中,这种方式的优势:
- 防止模板文件存储在磁盘时被误删的操作发送
- 如果程序部署需要迁移服务器,能有效避免下载接口的容错,忘记迁移模板文件等情况会导致程序异常
- 和程序代码存储在一起更加完整
基于上面的优势,因此,针对数据模板文件,我认为应该和项目直接放在一起,这样对于程序部署等都是非常有利的。
一般,在Spring Boot的开发框架中,我们可以在resources
目录下建立文件夹,然后将相应的数据文件放入目录中,再提供接口读取该文件进行下载
目录结构如下:
|---project
|--------src/main/java
|--------src/main/resources
|------------data
# 模板文件
|--------------template.xlsx
因为我们将文件放在了resources
目录下,此时如果要读取该文件,我们需要利用到Spring提供的ClassPathResource
类进行读取,调用代码如下:
ClassPathResource classPathResource=new ClassPathResource("data/tag_data_template.xlsx");
此时,我们的下载接口代码如下:
@GetMapping("/download")
public void downloadExcel(HttpServletResponse response){
logger.info("下载Excel模板");
ClassPathResource classPathResource=new ClassPathResource("data/template.xlsx");
try {
//创建临时文件
File file=File.createTempFile("template",".xlsx")