需要通过,某模板生成固定格式的docx文档时,可采用该方法。
步骤主要有以下几步:
1.准备好模板docx,把你需要的替换成指定的格式名称如:${待替换的key},具体文本如下

我们把需要填充的内容都替换成了指定的key,这样后续方便替换。
2.下面上代码:

    // 若前端调用后有其余操作推荐使用返回值,单纯的下载的话void即可public ClientResp export(ConflictResolutionEntity entity, HttpServletResponse response) throws IOException {// 将实体类转为mapMap<String, String> result = TransferUtil.convertBeanToMap(entity);/** 获取模板文件的路径,并将模板文件拷贝到指定路径下,如果只需要在jar包中启动的话直接获取jar的相对资源路径获取即可(放在src/main/resources/你的自定义文件的下面,注意不要加斜杠,否则会导致获取不到路径报错)**/String docPath = this.getResourceFilePath("contradiction.docx");// 设置响应体的请求头,Content-disposition 是 MIME 协议的扩展,可以让用户弹窗下载response.setHeader("Content-Disposition", "attachment; filename=" +new String(("contradiction.docx").getBytes(), "UTF-8"));// 将文件流写入http响应体boolean flag = WriteDocx.write(docPath, result, response);// 以下代码在void时不需要if(flag) {return new ClientResp();}return new ClientResp(RespCode.FAIL);}
public String getResourceFilePath(String fileName) {//返回读取指定资源的输入流InputStream is = this.getClass().getResourceAsStream("/doc/" + fileName);//获取文件路径String filePath  = TransferUtil.createFile(fileName);//文件不存在,则创建流输入默认数据到新文件if (null == filePath) {File file = new File(filePath);TransferUtil.inputStreamToFile(is, file);return filePath;}return filePath.substring(5);}
/*** 实体类转map* @param obj* @return*/public static Map<String, String> convertBeanToMap(Object obj) {if (obj == null) {return null;}Map<String, String> map = new HashMap<>();try {BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor property : propertyDescriptors) {String key = property.getName();// 过滤class属性if (!key.equals("class")) {// 得到property对应的getter方法Method getter = property.getReadMethod();Object value = getter.invoke(obj);if(ObjectUtils.isEmpty(value)){map.put("${"+key+"}","");}else if ( value instanceof Date){map.put("${"+key+"}",DateUtils.format((Date)value, DateUtils.DATE_PATTERN));}else{map.put("${"+key+"}",value.toString());}}}} catch (Exception e) {log.error("convertBean2Map Error {}" ,e);}return map;}public static String createFile(String filename) {String path = System.getProperty("user.dir");//创建文件夹String dirPath = path + File.separator + "doc";File dir = new File(dirPath);dir.mkdirs();//生成文件String filePath = dirPath + File.separator + filename;File file = new File(filePath);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {log.error("创建文件错误,IO流错误:{}", e.getMessage());}return filePath;}return null;}public static void inputStreamToFile(InputStream ins, File file) {OutputStream os = null;try {os = new FileOutputStream(file);int bytesRead = 0;byte[] buffer = new byte[1024];while ((bytesRead = ins.read(buffer, 0, 1024)) != -1) {os.write(buffer, 0, bytesRead);}os.close();ins.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static boolean write(String filepathString, Map<String, String> map, HttpServletResponse response){try{// 以流的形式获取文档内容InputStream is = new FileInputStream(filepathString);// poi解析文档XWPFDocument xdoc = new XWPFDocument(is);// 下面的2个替换方法是百度的,有特别需求的就去问百度君吧=-=/*** 对段落中的标记进行替换*/List<XWPFParagraph> parasList = xdoc.getParagraphs();replaceInAllParagraphs(parasList, map);/*** 对表格中的标记进行替换*/List<XWPFTable> tables = xdoc.getTables();replaceInTables(tables, map);//把docx输出到输出流中xdoc.write(response.getOutputStream());is.close();}catch (Exception e){log.error("写文件失败:{}",e.getMessage());return false;}return true;}/*** 替换所有段落中的标记** @param xwpfParagraphList* @param params*/public static void replaceInAllParagraphs(List<XWPFParagraph> xwpfParagraphList, Map<String, String> params) {for (XWPFParagraph paragraph : xwpfParagraphList) {if (paragraph.getText() == null || paragraph.getText().equals("")) continue;for (String key : params.keySet()) {if (paragraph.getText().contains(key)) {replaceInParagraph(paragraph, key, params.get(key));}}}}/*** 替换段落中的字符串** @param xwpfParagraph* @param oldString* @param newString*/public static void replaceInParagraph(XWPFParagraph xwpfParagraph, String oldString, String newString) {Map<String, Integer> pos_map = findSubRunPosInParagraph(xwpfParagraph, oldString);if (pos_map != null) {System.out.println("start_pos:" + pos_map.get("start_pos"));System.out.println("end_pos:" + pos_map.get("end_pos"));List<XWPFRun> runs = xwpfParagraph.getRuns();XWPFRun modelRun = runs.get(pos_map.get("end_pos"));XWPFRun xwpfRun = xwpfParagraph.insertNewRun(pos_map.get("end_pos") + 1);xwpfRun.setText(newString);System.out.println("字体大小:" + modelRun.getFontSize());if (modelRun.getFontSize() != -1) xwpfRun.setFontSize(modelRun.getFontSize());//默认值是五号字体,但五号字体getFontSize()时,返回-1xwpfRun.setFontFamily(modelRun.getFontFamily());for (int i = pos_map.get("end_pos"); i >= pos_map.get("start_pos"); i--) {System.out.println("remove run pos in :" + i);xwpfParagraph.removeRun(i);}}}/*** 替换所有的表格** @param xwpfTableList* @param params*/public static void replaceInTables(List<XWPFTable> xwpfTableList, Map<String, String> params) {for (XWPFTable table : xwpfTableList) {replaceInTable(table, params);}}/*** 替换一个表格中的所有行** @param xwpfTable* @param params*/public static void replaceInTable(XWPFTable xwpfTable, Map<String, String> params) {List<XWPFTableRow> rows = xwpfTable.getRows();replaceInRows(rows, params);}/*** 替换表格中的一行** @param rows* @param params*/public static void replaceInRows(List<XWPFTableRow> rows, Map<String, String> params) {for (int i = 0; i < rows.size(); i++) {XWPFTableRow row = rows.get(i);replaceInCells(row.getTableCells(), params);}}/*** 替换一行中所有的单元格** @param xwpfTableCellList* @param params*/public static void replaceInCells(List<XWPFTableCell> xwpfTableCellList, Map<String, String> params) {for (XWPFTableCell cell : xwpfTableCellList) {replaceInCell(cell, params);}}
/*** 替换表格中每一行中的每一个单元格中的所有段落** @param cell* @param params*/public static void replaceInCell(XWPFTableCell cell, Map<String, String> params) {List<XWPFParagraph> cellParagraphs = cell.getParagraphs();replaceInAllParagraphs(cellParagraphs, params);}

第二部分的代码内容在类TransferUtil中,大家自行加入到工具类中即可。
第一次发文章,有不完善的地方请大家指正,随手点个赞,谢谢诸位同仁。

Java通过docx模板生成docx相关推荐

  1. java利用Freemarker模板生成docx格式的word文档(全过程)

    参考汇总: wordexport: JAVA生成并导出Word文档技术论证 java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园 # 参考资料 - 其他项 ...

  2. JAVA通过xml模板生成DOCX文档

    准备工作: 1.xml模版,获取方式为docx文件winrar方式打开,取出document.xml 2.将内容格式化后修改需要替换的内容为freemarker标签,如下: 3.文件准备好后存放到某个 ...

  3. springboot结合Freemarker模板生成docx格式的word文档(附代码)

    首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...

  4. java利用Freemarker模板生成格式友好的doc或者docx文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...

  5. JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...

    Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...

  6. java根据pdf模板生成指定格式的pdf文件

    java根据pdf模板生成指定格式的pdf文件 一.工具准备 事先得准备好Adobe Acrobat DC,这是一款专门编辑pdf的工具,小编已经给大家准备好了. 链接:https://pan.bai ...

  7. java生成docx_java利用Freemarker模板生成docx格式的word文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...

  8. java手动/按模板生成word与excel

    目录 一.前言 二.生成word 1.使用Apache poi手动生成一个word (1)导入依赖 (2)手动生成一个包含表格的word 2.使用Apache poi 按模板生成一个简单的word ( ...

  9. JAVA根据word模板生成合同,并能实现网页在线浏览/打印/下载

    最近, 项目有这样一个需求:       根据我选择的模板(docx文件),和我表单填的数据,生成相应的合同文件(docx),该合同要能网页在线浏览/打印/下载在合同中还要放置签字图片和身份证图片 我 ...

最新文章

  1. 2022-2028年中国大气污染防治产业投资分析及前景预测报告
  2. TensorFlow XLA加速编译器
  3. Linux 命令集锦
  4. java pdf添加图片_java实现在pdf模板的指定位置插入图片
  5. USTC English Club Note20171023
  6. Redhat安装tftp的方法
  7. django使用mysql原始语句,Django中使用mysql数据库并使用原生sql语句操作
  8. pytorch 保存、读取 tensor 数据
  9. Python实现机房管理软件的文件分发功能
  10. RedHat 7通过yum安装图形界面
  11. pip安装mysql驱动_windows环境下Python安装mysql驱动遇到“坎”
  12. 纯净内存清理加速软件(Mem Reduct)
  13. 计算机病毒鬼畜,[原创]彩虹猫病毒的逆向
  14. 网络延迟到底是什么东西?
  15. js打印html表格内容,js实现简单的打印表格
  16. 数据库事务Transaction)那点事
  17. 论文(二)YOLOv2详解(翻译、总结和思考)
  18. Redis 详细入门教程
  19. SQLyog的下载安装与配置(转载)
  20. Win7安装VisualC++6.0全程图解

热门文章

  1. open3d完成点云ICP配准
  2. 多端统一技术方案选型
  3. 智能计算机怎么玩游戏,智能电视玩电脑游戏攻略分享
  4. IE能够打开网页 可是chrome和火狐打不开网页解决的方法
  5. 单片机串口android串口调试助手,单片机串口及串口调试助手的使用
  6. IE无法打开的原因及解决办法
  7. webpack的一些常用打包配置
  8. java-net-php-python-jspm作业管理系统计算机毕业设计程序
  9. 程序员命名必备网站|变量命名
  10. 用word2013发布csdn博客