模版word文件,内容和表格都已处理,保留了字体和样式,图片可以指定大小,docx类型的模版字段有问题的话,整个字段复制进去即可,不要手敲${}

生成的word文件

/*** word工具类** @author lks* @date 2021/2/24 11:16*/
public class WordUtils {//本地测试/*** 模版图片规则:${img-上传图片-200-200}   * img:代表是图片* 上传图片:模版的字段* 200:宽(像素),可自定义* 200:高(像素),可自定义*/public static void main(String[] args) throws IOException {//docx本地Map<String, Object> map = new HashMap<>();map.put("姓名", "张三");map.put("上传图片", "https://smart-form-dev.oss-cn-beijing.aliyuncs.com/fillImg/150a3d39976ab324/1632644009526_%E5%9B%BE%E7%89%871.png");FileInputStream in = new FileInputStream("/Users/liangkesai/Downloads/1.docx");XWPFDocument docx = new XWPFDocument(in);//表格内容替换添加Iterator<XWPFTable> itTable = docx.getTablesIterator();while (itTable.hasNext()) {//表格中所有的行List<XWPFTableRow> rows = itTable.next().getRows();for (XWPFTableRow row : rows) {//获取每一行的格子List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {if (cell != null) {processParagraphs(cell.getParagraphs(), map);}}}}//替换段落中的指定文字processParagraphs(docx.getParagraphs(), map);docx.write(new FileOutputStream("/Users/liangkesai/Downloads/4.doc"));//doc 本地,doc暂时不支持图片,只能做到文本替换
//        Map<String, Object> map = new HashMap<>();
//        map.put("姓名", "张三");
//        map.put("上传图片", "https://smart-form-dev.oss-cn-beijing.aliyuncs.com/fillImg/150a3d39976ab324/1632644009526_%E5%9B%BE%E7%89%871.png");
//        FileInputStream in = new FileInputStream("/Users/liangkesai/Downloads/1.docx");
//        HWPFDocument doc = new HWPFDocument(in);
//        Range range = doc.getRange();
//        for (Map.Entry entry : map.entrySet()) {//            String key = "${" + entry.getKey() + "}";
//            range.replaceText(key, String.valueOf(entry.getValue()));
//        }
//        doc.write(new FileOutputStream("/Users/liangkesai/Downloads/4.doc"));}/*** 下载** @param templateUrl* @param map* @param response* @param fileName*/public static void downWordByTemplate(String templateUrl, Map<String, Object> map, HttpServletResponse response, String fileName) {//输出流OutputStream os = null;InputStream in = null;try {// 生成word文档并读取模板in = new URL(templateUrl).openStream();if (!templateUrl.endsWith("doc") && !templateUrl.endsWith("docx")) {throw new CustomException("文件类型错误");}if (templateUrl.endsWith("doc")) {HWPFDocument doc = new HWPFDocument(in);Range range = doc.getRange();for (Map.Entry entry : map.entrySet()) {String key = "${" + entry.getKey() + "}";range.replaceText(key, String.valueOf(entry.getValue()));}fileName = fileName + ".doc";response.reset();response.setContentType("application/msword");response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));os = response.getOutputStream();doc.write(os);doc.close();} else {XWPFDocument docx = new XWPFDocument(in);//表格内容替换添加Iterator<XWPFTable> itTable = docx.getTablesIterator();while (itTable.hasNext()) {//表格中所有的行List<XWPFTableRow> rows = itTable.next().getRows();for (XWPFTableRow row : rows) {//获取每一行的格子List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {if (cell != null) {processParagraphs(cell.getParagraphs(), map);}}}}//替换段落中的指定文字processParagraphs(docx.getParagraphs(), map);fileName = fileName + ".docx";response.reset();response.setContentType("application/msword");response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));os = response.getOutputStream();docx.write(os);docx.close();}} catch (Exception e) {e.printStackTrace();} finally {try {if (os != null) {os.close();}if (in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 替换文字和图片** @param paragraphs* @param map*/protected static void processParagraphs(List<XWPFParagraph> paragraphs, Map<String, Object> map) {for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String textTemp = StrUtil.subBetween(run.getText(run.getTextPosition()), "${", "}");if (StrUtil.isNotBlank(textTemp)) {// 图片规则,${img-上传图片-200-200}   img-字段名-宽-高if (textTemp.startsWith("img-")) {String[] split = textTemp.split("-");if (split.length == 4 && StrUtil.isNotBlank(split[1]) && map.containsKey(split[1])) {try {String imgurl = String.valueOf(map.get(split[1]));String picType = null;if (imgurl.contains(".")) {picType = imgurl.substring(imgurl.lastIndexOf(".") + 1);}byte[] bs = IOUtils.toByteArray(new URL(imgurl).openStream());int width = Units.toEMU(Double.parseDouble(split[2]));int height = Units.toEMU(Double.parseDouble(split[3]));run.setText("", 0);run.addPicture(new ByteArrayInputStream(bs), getPictureType(picType), "", width, height);} catch (IOException | InvalidFormatException e) {run.setText(String.valueOf(map.get(split[1])), 0);}}} else {if (map.containsKey(textTemp)) {run.setText(String.valueOf(map.get(textTemp)), 0);}}}}}}/*** 根据图片类型,取得对应的图片类型代码** @param picType* @return int*/private static int getPictureType(String picType) {int res = Document.PICTURE_TYPE_JPEG;if (picType != null) {if (picType.equalsIgnoreCase("png")) {res = Document.PICTURE_TYPE_PNG;} else if (picType.equalsIgnoreCase("dib")) {res = Document.PICTURE_TYPE_DIB;} else if (picType.equalsIgnoreCase("emf")) {res = Document.PICTURE_TYPE_EMF;} else if (picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")) {res = Document.PICTURE_TYPE_JPEG;} else if (picType.equalsIgnoreCase("wmf")) {res = Document.PICTURE_TYPE_WMF;} else {res = Document.PICTURE_TYPE_JPEG;}}return res;}

JAVA根据word模版使用poi导出word文档,包含图片、文字相关推荐

  1. java用poi导出wrod文档支持图片并解释代码

    使用POI(Poor Obfuscation Implementation,即弱混淆实现)库可以很方便地在Java代码中导出Word文档,同时还支持插入图片. 下面是一个简单的例子,它创建了一个包含一 ...

  2. python环绕文字_Java 设置 Word 文档中图片文字环绕方式

    Java 设置 Word 文档中图片文字环绕方式 在Word文档中插入图片时,选择合理的图片文字环绕方式可以使图片的展示效果更好,也能使页面的排版更加美观.本文就将介绍如何使用Free Spire.D ...

  3. docx 图片预处理 Java_java使用poi给docx文档添加图片(官方例子)

    java使用poi给docx文档添加图片(官方例子) package org.apache.poi.xwpf.usermodel.examples; import java.io.FileInputS ...

  4. java根据 freemarker 生成word文档包含图片和动态表格

    需求 根据提供的模板样式,生成相对应的word文档,之前可以用xdoc生成,但是目前这个需求 是需要动态生成excel表格,有的单元格需要隐藏不展示,所以这边利用freemarker标签解析, 根据数 ...

  5. html转word 图片丢失 java_Java 设置 Word 文档中图片文字环绕方式

    在Word文档中插入图片时,选择合理的图片文字环绕方式可以使图片的展示效果更好,也能使页面的排版更加美观.本文就将介绍如何使用Free Spire.Doc for Java 添加图片到Word文档并设 ...

  6. 工具:语雀导出MarkDown文档后图片修复

    微信公众号:乌鸦安全 扫取二维码获取更多信息!  01  描述 在比较早的时候,我比较纠结记笔记的产品,最初的时候是在使用Typora在本地写Markdown文档,后来试用了一下印象笔记,但是它的缺点 ...

  7. POI导出EXCEL文档、水平垂直居中、表头添加颜色

    如下工具类添加表头颜色.水平垂直居中.设置列宽和行高: package utils;import ggframework.bottom.log.GGLogger;import java.io.File ...

  8. POI导出Excel文档

    首次接触POI,准备把这次经历记录下来.先介绍导出的功能: 首先是针对前端的利用ajax请求 <a href="javascript:printFInfo()" class= ...

  9. java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

    之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了.于是乎我在学会用Java在后 ...

最新文章

  1. 猜想 这样做可能让神经网络更经济
  2. 鸢尾花识别问题,萼片有什么用?
  3. 使用hover后隐藏的图片不显示_持续分享CSS使用小技巧
  4. python用pip安装numpy完整命令_Python使用pip安装Numpy模块
  5. 一加8 Lite或将搭载联发科天玑1000:支持SA、NSA双模5G
  6. “拳打”苹果“脚踢”三星,荣耀 20 DXO 全球第二,仅次华为 P30!
  7. 科普|掀开马甲包的 “神秘面纱”
  8. 生死看淡,不服就GAN(六)----用DCGAN生成马的彩色图片
  9. 完美邮箱(@88.com/@111.com/email.cn):专用密码登录
  10. 用ZBrush做游戏建模,3D打印,手办模型、珠宝设计等
  11. Android三方依赖冲突及Gradle的exclude使用
  12. 基于bp神经网络的pid算法,神经网络pid控制器设计
  13. 租房是每个奋斗者的必修课
  14. A*算法项目实践之一:栅格法的使用与障碍物栅格的生成
  15. 【翻译】Unity2017.3 版本发布说明
  16. rv1126/1109平台下的lt8912显示驱动的调试
  17. 图论欧拉回路初步 BZOJ2095 POI2010 Bridges
  18. 微信公众号开发之(文档02)微信公众号调用接口 全局返回码
  19. Kettle的一些常见问题
  20. 小米众筹防霾神器评测:颠覆设计,防霾新革命

热门文章

  1. BT06串口蓝牙模块的配置以及与电脑的配对
  2. Python分析薛之谦与李雨桐互撕微博
  3. 微软新Logo四色代表什么?Win8/Office/Xbox等
  4. 轻便简洁的电脑录音软件,免费收藏!
  5. UNICODE、GB18030、ASCII编码
  6. 电脑视频加水印软件 视频消重
  7. 一份自己整理的不太详细的常见面试题
  8. RouterOS的DNS设置说明
  9. 火焰纹章核心功能的实现
  10. 微软Azure组面试(部分)