模板文档

首先,需要创建一个word模板,我的模板例子如下:

动态生成的文档

根据java代码动态的修改模板生成自己想要的文档,结果如下:

具体代码

代码操作如下:其中进行了文本的替换,图片的插入,以及表格的操作。

引入依赖

     <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>

java代码

工具类FileUtil,OfficeUtil,CustomXWPFDocument的下载
提取码: x9dd
注:CustomXWPFDocument是继承XWPFDocument的重写的工具类

@RestController
@CrossOrigin
@RequestMapping("Download")
@Slf4j
public class DownloadWordController {@RequestMapping("Word")@ResponseBodypublic ResponseEntity<ByteArrayResource> downLoadReport(HttpServletRequest request, HttpServletResponse response) {try {String img1="D://file//图片1.png";//复制模板1给模板2,之后操作模板2,为了防止模板1的变动,之后动态修改模板2FileUtil.fileChannelCopy("D://file//模板1.docx", "D://file//模板2.docx");Map<String,Object> param = new HashMap<String, Object>();param.put("Hi", "你好!");param.put("Welcome", "欢迎!");/*指定模板位置pg_gyscpzlgksppg的位置替换为图片Map<String,Object> header = new HashMap<String, Object>();header.put("width", 100);header.put("height", 100);header.put("type", "png");header.put("content", image2Bytes("D:\\test\\upload\\img\\a.png"));param.put("我的图片",header);*///根据工具类将param中的要替换的内容替换到模板2中CustomXWPFDocument doc = OfficeUtil.generateWord(param, "D://file//模板2.docx");//遍历word文档的所有段落,向指定位置添加图片和操作指定表格for (XWPFParagraph p : doc.getParagraphs()) {List<XWPFRun> runs = p.getRuns();if (runs != null) {for (XWPFRun r : runs) {//需要替换的文本String text = "图片1";String tableName = "我的表格";String text2 = r.getText(0);//向指定位置添加图片if (text != null && text2 != null && text2.contains(text)) {//从0开始替换文本为“”r.setText("图片1如下:", 0);r.addBreak();//换行r.setText("                  ");//设置图片(图片流,图片格式,图片名称,图片宽,图片高)r.addPicture(new FileInputStream(img1), XWPFDocument.PICTURE_TYPE_PNG, new File(img1).getName(), Units.toEMU(200), Units.toEMU(100));r.addBreak();//换行r.setText("                                 图片1");r.addBreak();//换行r.setText(" ");}//操作指定表格if (text2 != null && text2.contains(tableName)) {//获取模板中的第1个表格XWPFTable table = doc.getTables().get(0);//给此表格添加三行addRows(table, 2, 3);//删除第2行和第3行原有的的第一个单元格的第一段数据//table.getRow(1).getCell(0).removeParagraph(0);//table.getRow(2).getCell(0).removeParagraph(0);//开始为表格添加数据for (int i = 1; i <= 5; i++) {XWPFTableRow row = table.getRow(i);int index=0;row.getCell(index).removeParagraph(0);row.getCell(index++).setText(String.valueOf(i));//设置序号row.getCell(index++).setText("五年2班");//设置班级row.getCell(index++).setText("李雷");//设置姓名row.getCell(index++).setText("90");//设置语文row.getCell(index++).setText("95");//设置数学}//合并单元格mergeCellsVertically(table, 1, 1, 5);}}}}//将修改后的模板2文档写入最终文档final.docxFileOutputStream fopts = new FileOutputStream("D:\\test\\wordFile\\final.docx");doc.write(fopts);fopts.close();doc.close();//设备供应商String fileName = "最终文档";File file = new File("D:\\test\\wordFile\\final.docx");ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(Paths.get(file.getAbsolutePath())));return ResponseEntity.ok().header("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8")).header("FileName", URLEncoder.encode(fileName + ".docx", "UTF-8")).header("Access-Control-Expose-Headers", "FileName").contentLength(file.length()).contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.wordprocessingml.document")).body(resource);} catch (Exception e) {e.printStackTrace();}return null;}/*** author:wangzhiming* date:2022-01-18* des:表末尾添加行(表下标,要复制样式的行,添加行数),此方法先添加行之后再操作表格较好* @param table* @param source* @param rows*/public void addRows(XWPFTable table, int source, int rows){try{int index = table.getNumberOfRows();for(int i=1;i<=rows;i++) {XWPFTableRow sourceRow = table.getRow(source);XWPFTableRow targetRow = table.insertNewTableRow(index++);targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());List<XWPFTableCell> sourceCells = sourceRow.getTableCells();for (XWPFTableCell sourceCell : sourceCells) {XWPFTableCell newCell = targetRow.addNewTableCell();newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());List<XWPFParagraph> sourceParagraphs = sourceCell.getParagraphs();if (StringUtils.isEmpty(sourceCell.getText())) {continue;}XWPFParagraph sourceParagraph = sourceParagraphs.get(0);List<XWPFParagraph> targetParagraphs = newCell.getParagraphs();if (StringUtils.isEmpty(newCell.getText())) {XWPFParagraph ph = newCell.addParagraph();ph.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = ph.getRuns().isEmpty() ? ph.createRun() : ph.getRuns().get(0);if(sourceParagraph.getRuns().size()>0)run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());} else {XWPFParagraph ph = targetParagraphs.get(0);ph.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = ph.getRuns().isEmpty() ? ph.createRun() : ph.getRuns().get(0);if(sourceParagraph.getRuns().size()>0)run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());}}}}catch (Exception e){log.error(e.getMessage(),e);}}/*** author:wangzhiming* date:2022-01-18* des:word跨行并单元格(表,合并哪一列,开始合并的行,合并结束的行)* @param table* @param col* @param fromRow* @param toRow*/public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {/*for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {XWPFTableCell cell = table.getRow(rowIndex).getCell(col);if ( rowIndex == fromRow ) {// The first merged cell is set with RESTART merge valuecell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);} else {// Cells which join (merge) the first one, are set with CONTINUEcell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);}}*/for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++){XWPFTableCell cell = table.getRow(rowIndex).getCell(col);CTTc ctTc = cell.getCTTc();if (ctTc.getTcPr() == null){ctTc.addNewTcPr();}//第一个合并单元格用重启合并值设置if (rowIndex == fromRow){cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);}else{//合并第一个单元格的单元被设置为“继续”cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);}}}
}

java根据模板动态生成word文档相关推荐

  1. java根据模板动态生成word文档带表格

    废话不多说上代码 <dependencies><!-- web支持 --><dependency><groupId>org.springframewor ...

  2. Freemarker - 根据模板动态生成word文档

    文章目录 Freemarker 根据模板动态生成word文档 Freemarker 介绍: Freemarker 使用: freemarker加载模板目录的方法 参考资料 Freemarker 根据模 ...

  3. java利用freemarker动态生成word文档及动态表格

    这里写自定义目录标题 目标 准备 实现 处理模板 java实现 验证 目标 根据给定word模板,动态填充指定内容,并输出为新的word文档. 准备 1.模板: 准备一份目标格式的word文档,如:w ...

  4. Springboot中使用freemarker动态生成word文档

    文章目录 freemarker模板动态生成word文档 前言 准备 简单模板准备 <一> `word 2003` 新建`.doc` 模板 <二> 另存为`.xml` 文件,格式 ...

  5. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  6. 【.NET】用Aspose.Words for .NET动态生成word文档中的数据表格

    1.概述 最近项目中有一个这样的需求:导出word 文档,要求这个文档的格式不是固定的,用户可以随便的调整,导出内容中的数据表格列是动态的,例如要求导出姓名和性别,你就要导出这两列的数据,而且这个文档 ...

  7. 用Aspose.Words for .NET动态生成word文档中的图片或水印

    1.概述 在项目中生成word文档,这个功能很普遍的,一般生成都是纯文字或是列表的比较多,便于客户打印,而要把图片也生成到word文档中的需求有些客户也是需要的,例如产品图片.这次我们介绍的是如何利用 ...

  8. velocity模板技术生成word文档

    本文介绍采用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容如下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项目v ...

  9. 动态生成word文档的靠谱方式

    需求:将数据生成到word模板文件 实现方式:使用ftl做模板文件,将数据写到word文档中 1.导包 <dependency><groupId>org.freemarker& ...

最新文章

  1. lua sleep函数实现
  2. Oracle数据库表空间占用过大的解决办法
  3. 用python画图所需要的插件_用Python画图
  4. 西电计算机应用基础 一,15秋西电《计算机应用基础(一)》在线作业答案解析.doc...
  5. Ubuntu出现没有正确安装GNOME电源管理器的默认配置
  6. elementui table某一列是否显示_Vue项目引进ElementUI组件的方法
  7. 哥廷根,世界数学家的摇篮和圣地
  8. cad2008加载 et拓展工具_生物信息工具 | 如何为网络图添加漂亮的图例?
  9. 第六章—条件语句和循环
  10. 在集合点的同步 CyclicBarrier
  11. 滴滴征战澳洲 全球“追击”优步
  12. 龙芯电脑的详细资料,支持国货的请进来!
  13. 15---TernaryOperator 三目运算符
  14. windows应用(vc++2022)MFC基础到实战(1)-基础(1)
  15. 计算机方面的顶级会议
  16. Luminati代理动态IP,海量资源可调用!
  17. 版图匹配之差分电流镜
  18. Hadoop基础教程-第12章 Hive:进阶(12.3 HiveServer2)(草稿)
  19. 坯子库无法一键安装插件没用_坯子插件库下载-坯子插件库下载 v2021.1官方版--pc6下载站...
  20. C/C++字符数组的输入输出方式详解

热门文章

  1. Java-routine
  2. 【Proxy】PAC模式和全局代理模式的区别
  3. 2020影响因子及JCR分区变化
  4. Plupload插件
  5. mysql 查看函数fsync_fsync()函数 Unix/Linux
  6. DM8达梦数据库:达梦数据库分区表
  7. html:display属性
  8. 微信小程序源代码_模仿共享单车ofo
  9. java jframe 容器,容器(JFrame)
  10. maven中央仓库官网