easypoi和freemarker导入导出word

一、easypoi 导出

1、WordUtil工具类

/**
     * 导出word
     * 

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

*

第二步下载生成的文件

*

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

* @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<String,Object> params, HttpServletRequest request, HttpServletResponse response){ Assert.notNull(templatePath,"模板路径不能为空"); Assert.notNull(temDir,"临时文件路径不能为空"); Assert.notNull(temDir,"导出文件名不能为空"); Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式"); FileOutputStream fos = null; OutputStream out = null; 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; fos = new FileOutputStream(tmpPath); doc.write(fos); //设置强制下载不打开 response.setContentType("application/force-download"); //设置文件名 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8")); response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Access-Control-Expose-Headers", "FileName"); out = response.getOutputStream(); doc.write(out); }catch (Exception e){ e.printStackTrace(); }finally { try { out.close(); fos.close(); delFileWord(temDir,fileName); } catch (IOException e) { e.printStackTrace(); } } } /** * 删除临时生成的文件 */ public static void delFileWord(String filePath,String fileName){ File file = new File(filePath + fileName); File file1 = new File(filePath); file.delete(); file1.delete(); } /** * 导出wps *

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

*

第二步将临时word文件内容复制到下载生成的wps文件中

*

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

* @param templatePath word模板地址 * @param temDir 生成临时文件存放地址 * @param fileName 文件名 * @param params 替换的参数 * @param request HttpServletRequest * @param response HttpServletResponse */
public static void exportWps(String templatePath, String temDir,String fileName,Map<String,Object> params, HttpServletRequest request, HttpServletResponse response){ FileOutputStream fos = null; InputStream input = null; BufferedInputStream bins=null; OutputStream outs = null; BufferedOutputStream bouts = null; 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; fos= new FileOutputStream(tmpPath); doc.write(fos); input = new FileInputStream(tmpPath); bins = new BufferedInputStream(input); outs = response.getOutputStream(); bouts = new BufferedOutputStream(outs); response.setContentType("application/x-download"); //设置文件名 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8")); response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Access-Control-Expose-Headers", "FileName"); int bytesRead=0; byte[] buffer = new byte[8192]; while((bytesRead = bins.read(buffer,0,8192))!=-1){ bouts.write(buffer,0,bytesRead); } bouts.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try{ bouts.close(); outs.close(); bins.close(); input.close(); fos.close(); delFileWord(temDir,fileName); }catch (Exception e){ e.printStackTrace(); } } }
2、测试controller
    /**
     * 导出报审文书word
     */
    @PostMapping("/writ/exportWord")
    public void writExport(String writHead, Long incidentId, HttpServletRequest request, HttpServletResponse response){
        try {
        ReportExportDTO dto = incidentService.writExport(writHead, incidentId);
        if(StringUtils.isEmpty(dto)){
            throw  new GlobalException(400,"导出异常");
        }
     
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("writHead", dto.getWritHead());
        dataMap.put("reportUserName", dto.getReportUserName());
        dataMap.put("reportTime", dto.getReportTime());
        dataMap.put("opinion", dto.getOpinion());
        dataMap.put("approveUserName", dto.getApproveUserName());
        dataMap.put("approveTime", dto.getApproveTime());
        dataMap.put("content","  "+dto.getContent());
            String millis = String.valueOf(System.currentTimeMillis());
            WordUtil.exportWord("/templates/report.docx","templates/", millis+".docx", dataMap,request,response);
//            WordUtil.exportWps("/templates/report.docx","templates/", millis+".wps", dataMap,request,response);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
3、word模板

easypoi和freemarker导入导出word_第1张图片

4、目录结构

easypoi和freemarker导入导出word_第2张图片

注意 .doc后缀不要手动改成.docx的后缀

二、freemarker 导入word到指定路径

1、导入pom
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
2、ftl模板

easypoi和freemarker导入导出word_第3张图片

3、测试controller
import freemarker.template.Configuration;
import freemarker.template.Template;
  /**
    * @param outFilePath 导入word的存放路径
    **/
    @PostMapping("doc")
    @ResponseBody
    public ResponseData exportDoc(String outFilePath) throws IOException {
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
        Template template = configuration.getTemplate("test.ftl");
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("username","houli");
//        dataMap.put("id","02201");
//        dataMap.put("code","251525v");
//        dataMap.put("pwd","root");
//        dataMap.put("tel","08583552");
        ;
        File outFile = new File(outFilePath+LocalDateTime.now()+".doc");
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
        try {
            template.process(dataMap,out);
            out.flush();
            out.close();
        } catch (TemplateException | freemarker.template.TemplateException e) {
            e.printStackTrace();
        }
        return ResponseData.ofSuccess("导出成功",null);
    }

注意 不要手动去改.doc文件的后缀名

三、easypoi 导入word到指定目录

1、WordUtil工具类

import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
/**
 * @author hl
 */
public class WordUtil {
    /**
     * 导出word
     * 

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

*

第二步下载生成的文件

*

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

* 模版变量中变量格式:{{foo}} * @param templatePath word模板地址 * @param temDir 生成临时文件存放地址 * @param fileName 文件名 * @param params 替换的参数 */
public static String exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params) { 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"); }*/ fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); String tmpPath = temDir + fileName; System.out.println(templatePath); FileOutputStream fos = new FileOutputStream(tmpPath); doc.write(fos); doc.close(); fos.close(); return templatePath; // 设置强制下载不打开 // 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 { // delAllFile(temDir);//这一步看具体需求,要不要删 } return null ; } }
2、测试controller
  @RequestMapping("/demo/export")
    public void export(){
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("name", "事件名称");
        dataMap.put("time", LocalDateTime.now());
        dataMap.put("username", "houli");
        dataMap.put("content", "啊实打实犯得上翻跟斗风格和鬼画符鬼画符撒发射点发射点打发士大夫");

        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Date date1 = DateUtils.parseDate(format, new String[] { "yyyy'-'MM'-'dd HH':'mm':'ss" });
  // D:/test/为导入word的存放路径
        WordUtil.exportWord("templates/1.docx","D:/test/",date1.getTime()+".docx",dataMap);
    }
3、word模板

easypoi和freemarker导入导出word_第4张图片

4、目录结构easypoi和freemarker导入导出word_第5张图片

注意 .doc后缀不要手动改成.docx的后缀

你可能感兴趣的:(freemarker,poi)