springboot根据模板导出word【可进行拓展】

转自:https://www.jianshu.com/p/0a40b90cc72c

转这篇文章,一来是给自己做个笔记。二来是进行补充,让更多人更好的受益。

1、导入maven

       
            cn.afterturn
            easypoi-base
            3.0.3
        
        
            cn.afterturn
            easypoi-web
            3.0.3
        
        
            cn.afterturn
            easypoi-annotation
            3.0.3
        

2、封装utils

package com.xdx97.party.common.utils.word;

import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;

public class ExportWordUtils {
    /**
     * 导出word
     * 

第一步生成替换后的word文件,只支持docx

*

第二步下载生成的文件

*

第三步删除生成的临时文件

* 模版变量中变量格式:{{foo}} * @param templatePath word模板地址 * @param temDir 生成临时文件存放地址 * @param fileName 文件名 * @param params 替换的参数 * @param request HttpServletRequest * @param response HttpServletResponse */ public static void exportWord(String templatePath, String temDir, String fileName, Map params, HttpServletRequest request, HttpServletResponse response) { Assert.notNull(templatePath,"模板路径不能为空"); Assert.notNull(temDir,"临时文件路径不能为空"); Assert.notNull(fileName,"导出文件名不能为空"); Assert.isTrue(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"); } XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); String tmpPath = temDir + fileName; FileOutputStream fos = new FileOutputStream(tmpPath); doc.write(fos); // 设置强制下载不打开 response.setContentType("application/force-download"); // 设置文件名 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、创建word模板

springboot根据模板导出word【可进行拓展】_第1张图片

4、测试代码

package com.xdx97.party.service.api.common;

import com.xdx97.party.common.utils.word.ExportWordUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@Controller
public class Demo {

    @RequestMapping("/demo/export")
    public void export(HttpServletRequest request, HttpServletResponse response){
        Map params = new HashMap<>();
        params.put("title","这是标题");
        params.put("name","李四");
        //这里是我说的一行代码
        ExportWordUtils.exportWord("word/export.docx","F:/test","aaa.docx",params,request,response);
    }
}

测试代码和word模板相对位置
springboot根据模板导出word【可进行拓展】_第2张图片

测试结果

springboot根据模板导出word【可进行拓展】_第3张图片
springboot根据模板导出word【可进行拓展】_第4张图片
注:我的请求地址的api是我设置的前缀,你的没有

如果你还想设置导出字体样式看这里:java根据模板导出word设置字体样式【springboot+poi】

你可能感兴趣的:(#,SpringBoot,JavaEE)