SpringBoot导出Word方式二:根据Word模板动态生成word(easypoi)

SpringBoot 项目使用easypoi实现导出word功能:
获取数据录入到固定的word模板,最后生成新的word文档。

查找多方资料,进行实践,使用easypoi实现了word的导出功能。对其实现做下整理。

easypoi官方文档:http://easypoi.mydoc.io/#category_49974

实现过程:

1.添加 easypoi 依赖
<!-- word导出  方式二:easypoi-->
<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.封装工具类
package com.example.mimiprogram.common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;

import cn.afterturn.easypoi.word.WordExportUtil;

/**
 * word工具类
 * easypoi官方文档:http://easypoi.mydoc.io/#category_49974
 */
public class WordUtil2 {

	 /**
     * 导出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<String, Object> 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.调用测试

1.word模板存放项目位置
SpringBoot导出Word方式二:根据Word模板动态生成word(easypoi)_第1张图片
2.确定临时生成文件的存放路径(下载到指定位置时需要此步)

String temDir="D:/mimi/"+File.separator+"file/word/"; ;//生成临时文件存放地址

3.创建controller进行调用

package com.example.mimiprogram.controller;


import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.deepoove.poi.data.PictureRenderData;
import com.example.mimiprogram.common.WordUtil;
import com.example.mimiprogram.common.WordUtil2;

import cn.afterturn.easypoi.word.entity.WordImageEntity;

/**
 * 导出Word
 * @author Administrator
 *
 */
@RequestMapping("/auth/exportWord/")
@RestController
public class ExportWordController {

	/**
	 * 用户信息导出word  --- easypoi
	 * @throws IOException 
	 */
	@RequestMapping("/exportUserWord2")
	public void exportUserWord2(HttpServletRequest request,HttpServletResponse response) throws IOException{
		Map<String, Object> params = new HashMap<>();
		/*//如果word模板地址放在 webapp下采用如下方式获取word模板路径:
		//表示到项目的根目录(webapp)下,要是想到目录下的子文件夹,修改"/"即可
		String path = request.getSession().getServletContext().getRealPath("/");*/
		
		//word模板地址放在src/main/resources/下,因为配置过静态资源映射,所以采用如下方式获取项目中的word模板地址:
		String templatePath ="static/template/user2.docx";//word模板地址
		
		// 渲染文本
		params.put("name", "张三");
		params.put("position", "开发工程师");
		params.put("entry_time", "2020-07-30");
		params.put("province", "江苏省");
		params.put("city", "南京市");
		
		// 渲染图片
		WordImageEntity image = new WordImageEntity();
        image.setHeight(120);
        image.setWidth(120);
        image.setUrl("D:\\cssTest\\square.png");
        image.setType(WordImageEntity.URL);
        params.put("picture", image);
		// TODO 渲染其他类型的数据请参考官方文档
        
		
		String temDir="D:/mimi/"+File.separator+"file/word/"; ;//生成临时文件存放地址
		
		//生成文件名
		Long time = new Date().getTime();
        // 生成的word格式
        String formatSuffix = ".docx";
        // 拼接后的文件名
        String fileName = time + formatSuffix;//文件名  带后缀
        //导出word
		WordUtil2.exportWord(templatePath, temDir, fileName, params, request, response);
	}
}

注意:图片格式需要特殊处理 与 poi-tl的处理区分开

// 渲染图片
		WordImageEntity image = new WordImageEntity();
        image.setHeight(120);
        image.setWidth(120);
        image.setUrl("D:\\cssTest\\square.png");
        image.setType(WordImageEntity.URL);
        params.put("picture", image);

4.新建一个word,编写word模板:
SpringBoot导出Word方式二:根据Word模板动态生成word(easypoi)_第2张图片
注意区分:
easypoi:word模板的文本格式填充项 是 {{}},图片也是 {{}}
poi-tl:word模板的文本格式填充项是{{}},而图片是 {{@}}

5.jsp部分代码:

<a href="#" onclick="doExport2();">导出</a>
function doExport2(){
window.location.href="<%=basePath%>/auth/exportWord/exportUserWord2";
}

6.导出结果:
SpringBoot导出Word方式二:根据Word模板动态生成word(easypoi)_第3张图片
资料:
https://www.freesion.com/article/5126592287/
https://www.jianshu.com/0a40b90cc72c/

你可能感兴趣的:(SpringBoot)