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

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

      <!-- 解析xls文件 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.1</version>
        </dependency>
        <!-- poi库 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </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模板的代码,虽然这个实用价值不高,但是这里面涉及到文件在项目文件夹的保存,所以仍然有意义。

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

    }

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

上代码:

        

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

记得先生成一个

public class ProvideTemplate_xlsx_Util {}

工具类

如果大家还想知道后端如何将用户根据这个模板填写的excel文件接收下来并解析内容然后保存到数据库中,可以去看我的下一篇文章。
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值