当前位置:   article > 正文

在springboot中如何实现生成excel模板并保存到项目的静态资源目录,以及实现将项目静态资源目录下的excel文件发送到前端。_spring boot excel模板路径

spring boot excel模板路径

记得先导个maven依赖,不然没法操作excel文件:

  1. <!-- 解析xls文件 -->
  2. <dependency>
  3. <groupId>org.apache.poi</groupId>
  4. <artifactId>poi</artifactId>
  5. <version>4.1.1</version>
  6. </dependency>
  7. <!-- poi库 -->
  8. <dependency>
  9. <groupId>org.apache.poi</groupId>
  10. <artifactId>poi-ooxml</artifactId>
  11. <version>4.1.1</version>
  12. </dependency>

分三步:

                1.生成一个excel

                2.填写excel

                3.把文件发送给前端        

        其实就是后端自己生成一个excel,然后填写模板信息,最后发送给前端即可。但是这里需要考虑一个问题,其实我们没有必要每接收一个请求就完成一次1、2步骤,所以我们完全可以自己写一个模板,然后保存在服务器中,用户请求我们把文件发给他即可。

        重要!必看!

        接下来就是代码部分了。代码应该在controller类的ProvideTemplate_xlsx方法中完成这三步。但是考虑到需要完成的代码多。所以我将它写到了Util包下,作为一个工具类使用,其中包含了两个方法,一个用来用代码生成excel模板(但其实这个没啥用,因为我们完全可以手动去写一个excel......)另外一个用来发送excel到前端。

        难点在于我们需要把excel保存到项目文件中resouces/static目录下,如何获取该路径是个问题。        

我们可以使用:

String s1 = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\templateFiles\\";

这样可以拿到我们想要保存文件

的那个目录,接下来只需要拼接上文件名即可,比如

String fileName1 = s1+ "123.xlsx";

 这样就拿到了文件完整路径。

接下来我们直接上用代码生成excel模板的代码,虽然这个实用价值不高,但是这里面涉及到文件在项目文件夹的保存,所以仍然有意义。

  1. //创建模板文件,一般不用创建,一份就够,如果要创建需要改内容
  2. //content数组是excel模板中标题行的内容,比如:content=[用户名,用户密码,用户身份,用户性别]
  3. //fileName是想要把模板叫成什么名字。因为我们生成的模板肯定希望有一个规范的名字,而不是用UUID去生成一个没有意义的文件名字。
  4. public void create(String[] content, String fileName) throws IOException {
  5. //初始化
  6. // 创建Excel文件
  7. XSSFWorkbook wk = new XSSFWorkbook();
  8. // 创建一张工作表
  9. XSSFSheet sheet = wk.createSheet("info");
  10. // 设置列宽
  11. sheet.setColumnWidth(0, 5000);
  12. // 创建一行(表头),行是从0开始的
  13. XSSFRow row = sheet.createRow(0);
  14. // 获取User类中成员变量的个数,以方便确认有几列
  15. Field[] fields = User.class.getDeclaredFields();
  16. int length = fields.length;//拿到循环次数,每次循环写一个列名称。
  17. // 定义首部行内容
  18. // String [] content={"用户名","用户密码","用户身份","用户性别"};
  19. // String fileName = "用户信息模板.xlsx";
  20. // 创建第一行的首部单元格
  21. for (int i = 0; i < length; i++) {
  22. row.createCell((short) i).setCellValue(content[i]);//写入列名词,每次循环写一个
  23. }
  24. //拿到路径
  25. String s1 = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\templateFiles\\";
  26. //文件输出流,要求把文件写入s1 + fileName上。
  27. FileOutputStream out = new FileOutputStream(new File(s1 + fileName));
  28. //记得关闭流
  29. wk.write(out);
  30. out.close();
  31. wk.close();
  32. }

接下来完成第三步,也就是发送excel到前端,这就很简单了,我们只需要在工具类中继续去定义一个方法发送文件,而路径就是我们刚刚保存的路径。

上代码:

        

  1. //fileName是该模板的名字。
  2. public void send(HttpServletRequest request, HttpServletResponse response, String fileName) throws IOException {
  3. //拿到模板所在的文件路径
  4. String address = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\templateFiles\\";
  5. //拿到完整的路径
  6. String fileNameAddress = address + fileName;
  7. //String fileName = "用户信息模板.xlsx";
  8. File file = new File(fileNameAddress);
  9. //把文件写到输入流
  10. InputStream inputStream = new FileInputStream(file);
  11. //交给一个新创建的excel工作簿,内容为输入流的内容,也就是和要传输的模板内容一样
  12. XSSFWorkbook xwb = new XSSFWorkbook(inputStream);
  13. //3.将Excel文件通过Response输出到前端
  14. OutputStream outputStream = response.getOutputStream();
  15. // 清空response
  16. response.reset();
  17. //设置响应头
  18. response.setContentType("application/msexcel;charset=UTF-8");
  19. response.setCharacterEncoding("UTF-8"); //将服务器编码集设置为UTF-8
  20. //一定要设置文件名是UTF-8,否则前端下载下来的文件名是乱码。
  21. fileName = URLEncoder.encode(fileName, "UTF-8");
  22. response.setHeader("Content-disposition", "attachment; filename=" + fileName);
  23. String origin = request.getHeader("Origin");
  24. response.addHeader("Access-Control-Allow-Origin", origin);
  25. //写出
  26. xwb.write(outputStream);
  27. }

记得先生成一个

public class ProvideTemplate_xlsx_Util {}

工具类

如果大家还想知道后端如何将用户根据这个模板填写的excel文件接收下来并解析内容然后保存到数据库中,可以去看我的下一篇文章。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/815895
推荐阅读
相关标签
  

闽ICP备14008679号