这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/12790904.html
本次使用的是easypoi框架
官方教程:https://opensource.afterturn.cn/doc/easypoi.html
gitee地址:https://gitee.com/tianj/easypoi
引入maven依赖
<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>3.3.0</version> </dependency> <!--注意:word中要使用循环等标签必须单独导入以下依赖--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.1</version> </dependency>
word模板内容
参数说明:$fe:jobs(jobs:java代码中集合名称),t.属性名(t表示集合中单个对象)
EasyPoi 模板 表达式支持
- 空格分割
- 三目运算 {{test ? obj:obj2}}
- n: 表示 这个cell是数值类型 {{n:}}
- le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
- fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
- fn: 格式化数字 {{fn:(obj;###.00)}}
- fe: 遍历数据,创建row
- !fe: 遍历数据不创建row
- $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
- !if: 删除当前列 {{!if:(test)}}
- 单引号表示常量值 \'\' 比如\'1\' 那么输出的就是 1
- &NULL& 控制
- ]] 换行符
工具类
WordUtil.java
package com.example.demo.utils; import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Map; public class WordUtil { /** * 导出word(2007版本docx) * * @param templateWordPath * @param dataMap * @return * @throws Exception */ public static byte[] exportWord(String templateWordPath, Map<String, Object> dataMap) throws Exception { File tf = new File(templateWordPath); if (!tf.exists() || !tf.isFile()) { throw new RuntimeException("File [" + templateWordPath + "] Not Found Or Not File."); } XWPFDocument document = WordExportUtil.exportWord07(templateWordPath, dataMap); ByteArrayOutputStream bos = new ByteArrayOutputStream(); document.write(bos); return bos.toByteArray(); } }
控制器方法
package com.example.demo.controller; import cn.afterturn.easypoi.word.entity.WordImageEntity; import com.example.demo.utils.WordUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller public class TestController { @RequestMapping(value = "/export") public void export(HttpServletResponse response){ try { // Map<String, Object> dataMap = new HashMap<>();
//导出单个数据
dataMap.put("title","我是导出文档的标题");
//导出对象 Map<String, String> user = new HashMap<>(); user.put("name", "姓名"); user.put("age", "443"); user.put("address", "地址"); user.put("other", "我不知道"); dataMap.put("user", user); //导出图片 WordImageEntity image = new WordImageEntity(); //设置图片尺寸 image.setHeight(500); image.setWidth(500); //图片地址,需要是本地项目中图片,如果是第三方的需要把图片先下载下来 image.setUrl("C:\\Users\\Fr\\Pictures\\11163144hqk4.JPG"); image.setType(WordImageEntity.URL); dataMap.put("images", image); List<Map<String, Object>> jobs = new ArrayList<>(); //导出列表 Map<String, Object> job; for (int i = 0; i < 5; i++) { job = new HashMap<>(); job.put("id", "ID-" + i); job.put("name", "姓名:" + i); jobs.add(job); } dataMap.put("jobs", jobs); // “D:/word-template-test.docx”是word模板所在位置 byte[] doc = WordUtil.exportWord("D:/word-template-test.docx", dataMap); response.setContentType("application/vnd.ms-word;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=\"" + new String("word文档导出".getBytes("gb2312"), "ISO8859-1")+".docx"); //文件名中文需进行格式转换,不然可能出现乱码 OutputStream out = response.getOutputStream(); out.write(doc); out.flush(); } catch (Exception e) { e.printStackTrace(); } } }
导出效果