流程:拿到word模板 转为ftl格式并填充占位符参数,调用java代码填充参数即可
(文末附word打开图片显示异常,wps打开却显示正常的解决方案)

(文末附Jpeg格式图片获取为null解决方案)

1:拿到需要展示的Word文档,填充默认值

2:填充完毕后:

${}为单一参数    ${aList.a}为list参数  后续会展示如何设置ftl模板中的list格式

注:若图片存在,则不要将图片删除也不要转为${}形式 后续会展示如何设置图片

3:将docx类型的文档转为xml格式存储 方式:点击文档左上角:文件:另存为: 存为xml格式

4:转为xml后即可把xml中的图片base64删除 改为${picture} 并将宽高度也替换为${}

5:再将xml格式转为ftl格式 右击文件 重命名 改为abc.ftl  然后拖入idea工程 格式化一下数据 (ctrl+alt+L)  注:idea中文件名不支持中文

6:格式化后 将list标签存入模板 找到${aList.name}的标签<w:tr> 用<#list cl as cList>将其包起来 </#list>

as前面的值为之后存入map里的key as后的值 为你的list在ftl中的key 及${cList.name} 中的cList

7:至此 模板大功告成 剩下就是java代码了 复制粘贴即可

pom文件先引入freemarker依赖

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version>
</dependency>

util工具类及controller代码  注:需用浏览器发起get请求 postman调用 下载的文件中文名称会乱码


import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;@Component
public class WordUtil {private static Configuration configuration = null;//生成文件下载的主方法public void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");//此处getclass为默认resources目录configuration.setClassForTemplateLoading(this.getClass(), "/ftl");        Template freemarkerTemplate = configuration.getTemplate(ftlFile);File file = null;InputStream fin = null;ServletOutputStream out = null;try {// 调用工具类的createDoc方法生成Word文档file = createDoc(map, freemarkerTemplate);fin = new FileInputStream(file);response.setCharacterEncoding("utf-8");response.setContentType("application/msword");// 设置浏览器以下载的方式,处理该文件名  ps:docx格式office可能存在打不开等问题String fileName = title  + ".doc";fileName = URLEncoder.encode(fileName, "utf-8");response.setHeader("Content-Disposition","attachment;filename="+fileName);out = response.getOutputStream();byte[] buffer = new byte[512];int bytesToRead = -1;// 通过循环将读入的Word文件的内容输出到浏览器中while ((bytesToRead = fin.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}} finally {if (fin != null) fin.close();if (out != null) out.close();    //关闭对应流if (file != null) file.delete(); // 删除临时文件}}//私有代码 无需关注private File createDoc(Map<?, ?> dataMap, Template template) {String name = "sellPlan.doc";File f = new File(name);Template t = template;try {// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}return f;}//将服务器url地址转为base64 map存储需要用到public String ImageToBase64(String netImagePath) {ByteArrayOutputStream data = new ByteArrayOutputStream();try {// 创建URL  URL url = new URL(netImagePath);byte[] by = new byte[1024];// 创建链接 HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);InputStream is = conn.getInputStream();//  // 将内容读取内存中  int len = -1;while ((len = is.read(by)) != -1) {data.write(by, 0, len);}is.close();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码  BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data.toByteArray());}}
@RestController
@RequestMapping("/test")
public class TestController {@Autowiredprivate WordUtil wordUtil;@ApiOperation("下载摄像头部署word模板")@GetMapping(value = "/getWord/{id}")public void getWord(HttpServletResponse response, HttpServletRequest request) throws IOException {//你自己的代码 得到所有数据String name = "测试";List<showDto> list = new ArrayList<>();String url = "https://123213213";//服务器地址//得到数据结束//封装数据Map<String, Object> map = new HashMap<>();map.put("cList", list);map.put("shopName", name);//通过imageio方法 拿到图片宽高BufferedImage bufferedImage = ImageIO.read(new URL(url));int height = bufferedImage.getHeight();int width = bufferedImage.getWidth();// 设置图片的大小map.put("height", height + "px");map.put("width", width + "px");//调用util方法将服务器地址转为base64 展示到word中map.put("picture", wordUtil.ImageToBase64(url));try {//这里设置文档的名称 和模板的名字 abc.ftl为 resource下的 ftl包下的 abc.ftl文件wordUtil.exportMillCertificateWord(request, response, map, "测试word", "abc.ftl");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

freemarker加载模板方法转自: https://blog.csdn.net/erpenggg/article/details/81216386

下载后用win10自带Word打开图片不显示问题解决方案转自:(wps可以正常显示图片 word不显示)https://blog.csdn.net/weixin_39674487/article/details/106422125?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-8.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-8.pc_relevant_default&utm_relevant_index=11tt

通过Imageio.read方法读取jpeg,webp格式图片为null解决方案为:

pom添加一个依赖包:

<dependency><groupId>org.sejda.imageio</groupId><artifactId>webp-imageio</artifactId><version>0.1.6</version></dependency>

Freemarker下载Word文档(文字+图片+表格)Idea示例 (附word展示图片异常解决方案)(附JPEG格式图片通过imageio.read方法读取为null解决方案)相关推荐

  1. java word添加图片_Java 替换word文档文字并指定位置插入图片

    先说下 需要的依赖包 org.apache.poi poi-excelant 3.12 org.apache.poi poi-scratchpad 3.12 org.apache.poi poi-oo ...

  2. C# VS2012操作word文档 (二).插入表格图片

    在上一篇文章"C# VS2012创建word文档.(一)"中我们讲述了如何使用VS2012引用COM中Miscrosoft Word 14.0 Object Library实现创建 ...

  3. java poi操作word2007_java使用poi解析2007以上的word文档中的表格与图片

    项目中使用到了要解析word文档中的表格与图片,网上的2003的解析方式很多,2007以上的很少,我看了官网找了资料自己写了一个简单的解析方案,大家共同学习吧!有不对的地方希望大神指教! import ...

  4. 【在工程Word文档的大量表格中自动插入图片的python程序】

    在工程Word文档的大量表格中自动插入图片的python程序 一.问题描述 在word的表格中插入图片代码 图形界面GUI设计 程序打包 一.问题描述 我的姐姐是一个工程技术公司的资料员,经常需要在w ...

  5. 办公室小姐姐的福利!用Python批量提取word文档中的表格和图片内容

    点上方"菜鸟学Python",选择"星标" 第491篇原创干货,第一时间送达 最近有许多小伙伴想要一些自动化办公的福利小程序,今天就满足大家的需求.日常的办公过 ...

  6. 如何在微信公众号推文加入Word文档、Excel表格,超实用30秒学会

    大家都知道,当我们订阅了公众号(关注公众号),公众号的运营者就能给我们推送最新发布的公众号文章,我们也能在订阅号栏收到最新的文章.有一些微信公众号推文中会有附件,如word文档.excel表格,比如政 ...

  7. python处理word文档文字重复_Python-docx 对 word 文本处理实现自动化操作!

    之前介绍了一个Python包 openpyxl ,用于处理 Excel :而对于 Word 文本时同样也有对应的 Python库 Python-docx,在日常办公中,如果需要处理多个 word 文本 ...

  8. 用Aspose.Words 从Word文档中提取表格数据

    用Aspose.Words 从Word文档中提取表格数据 对于某些项目,开发人员需要从Word文档中提取数据并导出到数据库.最大的挑战是必须支持现有Word文档. 相同格式且带多个数据块的Word文档 ...

  9. aspose.words 操作 word 文档-文字替换、删除首行、添加水印等方案

    近日,遇到一个需求,需要用到 aspose.words 开处理 word 文档,将调试通过的一些代码和过程记录如下: 相关软件:点击下载 aspose.words.jar 文章目录 一.对 word ...

最新文章

  1. linux限制pptp连接数_性能调优,让你的服务器更强大!增加TCP连接最大限制
  2. ImportError: /home/kzl/anaconda2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
  3. VUEX中关于 mapActions, mapMutations使用解析
  4. overline css,CSS text-decoration-line 属性
  5. java定义一个方法,向控制台输出99乘法表
  6. 编写一个猜数字游戏程序:
  7. 阻塞会话_使用根会话解决SQL阻塞链并进行故障排除
  8. 麦克纳姆轮速度分解再分析
  9. Linux学习笔记(6)
  10. hibernate java_Hibernate对Java 9的支持
  11. 系统架构设计师教程 第四版 带目录 免费
  12. 用golang生成6位数的唯一id
  13. P3320 [SDOI2015]寻宝游戏 题解
  14. 如何用微信公众号二维码事件做扫码登陆
  15. 2020 前端必看 20个最好的前端Web开发工具
  16. lua 调用c++ dll, 提示:%1 不是有效的 Win32 应用程序。
  17. Excel每页都打印表头
  18. 二维离散型随机变量及其分布
  19. CSS的表格样式和列表样式
  20. 如何向icloud上传文件_怎样用icloud把手机文件传到电脑上?

热门文章

  1. 全球与中国柱塞计量泵市场现状及未来发展趋势
  2. 蜗牛学院SpringBoot第一周总结
  3. java查询学生信息_JAVA学生信息管理系统
  4. css通过计算得出width
  5. 【原创】彼得德鲁克《管理的实践》札记(十一)
  6. php支付宝api新版,【推荐】thinkphp支付宝API接口
  7. 2020年 我对数据行业的思考 | 特邀专栏
  8. python reversed
  9. 史上最详细的VMware 安装CentOS 7
  10. python运算结果是浮点数_Python中的浮点数原理与运算分析 python中浮点数等于整数?为什么?...