spring boot +word 模板下载

1.导入poi坐标

  <!-- word -->
        <dependency>

            <groupId>cn.afterturn</groupId>

            <artifactId>easypoi-base</artifactId>

            <version>3.0.3</version>

        </dependency>

        <dependency>

            <groupId>cn.afterturn</groupId>

            <artifactId>easypoi-web</artifactId>

            <version>3.0.3</version>

        </dependency>

        <dependency>

            <groupId>cn.afterturn</groupId>

            <artifactId>easypoi-annotation</artifactId>

            <version>3.0.3</version>

        </dependency>

2.创建导出word 工具类(可自行修改导出工具类,我这里就将临时文件注释掉了)。注意这里一定要设置,不然会报其他异常。 response.setContentType(“application/msword”);//导出word格式

`public class ExportWordUtils {
    /**

     * 导出word

     * <p>第一步生成替换后的word文件,只支持docx</p>

     * <p>第二步下载生成的文件</p>

     * <p>第三步删除生成的临时文件</p>

     * 模版变量中变量格式:{<!-- -->{foo}}

     * @param templatePath word模板地址

     * @param temDir 生成临时文件存放地址

     * @param fileName 文件名

     * @param params 替换的参数

     * @param request HttpServletRequest

     * @param response HttpServletResponse

     */

    public static void exportWord(InputStream templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {

      // AssertUtil.isNotNull(templatePath,"模板路径不能为空");

        AssertUtil.isNotNull(temDir,"临时文件路径不能为空");

        AssertUtil.isNotNull(fileName,"导出文件名不能为空");

        AssertUtil.isNotTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");

        if (!temDir.endsWith("/")){

            temDir = temDir + File.separator;

        }

        File dir = new File(temDir);

        if (!dir.exists()) {

            dir.mkdirs();

        }

        try {

            String userAgent = request.getHeader("user-agent").toLowerCase();

            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {

                fileName = URLEncoder.encode(fileName, "UTF-8");

            } else {

                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");

            }
            MyXWPFDocument doc = new MyXWPFDocument(templatePath);
            WordExportUtil.exportWord07(doc, params);
            //XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            // 临时文件暂时注释掉
         /*   String tmpPath = temDir + fileName;

            FileOutputStream fos = new FileOutputStream(tmpPath);

            doc.write(fos);*/

            // 设置强制下载不打开
            request.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");//导出word格式
            //response.setContentType("application/force-download");
            response.addHeader("Content-Disposition", "attachment;filename=" +
                    new String((fileName).getBytes(),
                            "UTF-8"));
            // 设置文件名

           // response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);

            OutputStream out = response.getOutputStream();

            doc.write(out);

            out.close();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            delFileWord(temDir,fileName);//这一步看具体需求,要不要删

        }

    }

    /**

     * 删除零时生成的文件

     */

    public static void delFileWord(String filePath, String fileName){

        File file =new File(filePath+fileName);

        File file1 =new File(filePath);

        file.delete();

        file1.delete();

    }
}

3.将模板引入到项目中,注意存放的位置,一般都是在resources底下。
模板有两种方式,一种是直接放在项目中,另一种是读取服务器中的地址,该案例演示的是放在项目中。
读取服务器的话需要将下载工具类路径改为String 类型。然后修改下载demo中的filePath为文件所在路径。
在这里插入图片描述
4.创建测试类,进行接口测试;注意模板路径一定要在word前加上/,这样才能找到模板,不让路径会报空指针异常。

    @ApiOperation(value = "word模板下载", notes = "word模板下载")
    @GetMapping("/word/demo/export")
    public void wordExport(HttpServletRequest request, HttpServletResponse response) throws IOException {

        Map<String,Object> params = new HashMap<>();

        params.put("title","这是标题");

        params.put("name","张三");
        //模板路径
       // String filePath = "C:\\Users\\DELL\\Desktop\\demo.docx";

        String filePath = "/word/demo.docx";
        InputStream is = this.getClass().getResourceAsStream(filePath);

        //这里是我说的一行代码
        ExportWordUtils.exportWord(is,"D:/test","aaa.docx",params,request,response);

    }

5.后记:实际下载中的问题,在测试的时候导出的文件一直是response,后来才发现要在pom 文件中加入不编译的功能。
在这里插入图片描述

  <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                        <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                        <nonFilteredFileExtension>docx</nonFilteredFileExtension>
   </nonFilteredFileExtensions>

以上整体word下载基本功能完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值