1. 导入相关jar

由于升级过版本导致其他模板不能正常生成,所以jar包保持在这个版本

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.13</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency>
  1. 工具类

package com.xinke.sunshine_ebid.common.utils;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.*;import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class WordUtil {public void addBreakInCell(XWPFTableCell cell) {if (cell.getText() != null && cell.getText().contains("\n")) {for (XWPFParagraph paragraph : cell.getParagraphs()) {paragraph.setAlignment(ParagraphAlignment.LEFT);for (XWPFRun run : paragraph.getRuns()) {if (run.getText(0) != null && run.getText(0).contains("\n")) {String[] lines = run.getText(0).split("\n");if (lines.length > 0) {// set first line into XWPFRunrun.setText(lines[0], 0);for (int i = 1; i < lines.length; i++) {// add break and insert new textrun.addBreak();run.setText(lines[i]);}}}}}}}/*** 替换段落里面的变量** @param doc    要替换的文档* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInPara(CustomXWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();XWPFParagraph para;while (iterator.hasNext()) {para = iterator.next();this.replaceInPara(para, params,doc);}}/*** 替换段落里面的变量** @param para   要替换的段落* @param params 参数 * @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInPara(XWPFParagraph para, Map<String, Object> params, CustomXWPFDocument doc) throws InvalidFormatException, FileNotFoundException {List<XWPFRun> runs;Matcher matcher;if (this.matcher(para.getParagraphText()).find()) {runs = para.getRuns();int start = -1;int end = -1;String str = "";String text= "";for (int i = 0; i < runs.size(); i++) {text += runs.get(i).toString();}for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);System.out.println("------>>>>>>>>>" + text);if (text.contains("$")) {start = text.indexOf("$");}if ((start != -1)) {str += text.substring(text.indexOf("$"), text.length()).trim();String paraList=runs.toString();System.out.println("未删除前"+paraList);Object[] runArr = runs.toArray();int size=runs.size();int $Index=0;for (int j = 0; j < runArr.length; j++) {if (runArr[j].toString().contains("$")) {$Index=j;break;}}int startIn=$Index;while (startIn<runs.size()) {para.removeRun(startIn);System.out.println("删除中"+para.getRuns());}System.out.println("删除后"+para.getRuns());}if ('}' == text.charAt(text.length() - 1)) {if (start != -1) {end = text.length() - 1;break;}}}System.out.println("start--->"+start);System.out.println("end--->"+end);System.out.println("str---->>>" + str);for (String key : params.keySet()) {if (str.equals(key)) {if(str.indexOf("@")==-1){String value= params.get(key).toString();para.createRun().setText(value);break;}else{String value= params.get(key).toString();int length = para.getRuns().size();if (length > 0) {for (int i = (length - 1); i >= 0; i--) {para.removeRun(i);}}String blipId = doc.addPictureData(new FileInputStream(new File(value)), CustomXWPFDocument.PICTURE_TYPE_PNG);doc.createPicture(blipId,doc.getNextPicNameNumber(CustomXWPFDocument.PICTURE_TYPE_PNG), 550, 250,para);break;}}}}}/*** 替换表格里面的变量 ** @param doc    要替换的文档 * @param params 参数 * @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInTable(CustomXWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {Iterator<XWPFTable> iterator = doc.getTablesIterator();XWPFTable table;List<XWPFTableRow> rows;List<XWPFTableCell> cells;List<XWPFParagraph> paras;while (iterator.hasNext()) {table = iterator.next();rows = table.getRows();for (XWPFTableRow row : rows) {cells = row.getTableCells();for (XWPFTableCell cell : cells) {paras = cell.getParagraphs();for (XWPFParagraph para : paras) {this.replaceInPara(para, params,doc);}}}}}/*** 正则匹配字符串 ** @param str* @return*/private Matcher matcher(String str) {Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}/*** 关闭输入流 ** @param is*/public void close(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 关闭输出流 ** @param os*/public void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}public boolean checkText(String text) {boolean check = false;if (text.indexOf("$") != -1) {check = true;}return check;}public String changeValue(String value, Map<String, Object> textMap) {Set<Map.Entry<String, Object>> textSets = textMap.entrySet();for (Map.Entry<String, Object> textSet : textSets) {// 匹配模板与替换值 格式${key}String key = "${" + textSet.getKey() + "}";if (value.indexOf(key) != -1) {value = textSet.getValue().toString();}}// 模板未匹配到区域替换为空if (checkText(value)) {value = "";}return value;}
}
  1. 代码应用

控制层

    @GetMapping("/test")public void recordSheetWord(HttpServletResponse response) throws Exception{testService.test(response);}   

业务层,需要换行的话追加/n

package com.xinke.sunshine_ebid.service;import com.xinke.sunshine_ebid.common.utils.CustomXWPFDocument;
import com.xinke.sunshine_ebid.common.utils.WordUtil;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;@Service
public class TestService {public void test(HttpServletResponse response) throws Exception{Map<String, Object> params = new HashMap<>();params.put("${test1}","参数111");params.put("${test2}","参数222");// 导出word的设置InputStream is;CustomXWPFDocument doc;// spring项目使用此方法获取创建文件   is = Files.newInputStream(new File("fileRecord/template/word/test.docx").toPath());// springboot项目使用次方法
//        is = FileUtil.class.getClassLoader().getResourceAsStream(ConfigConstant.JD_RECTIFICATION_RECORD);doc = new CustomXWPFDocument(is);WordUtil xwpfTUtil = new WordUtil();xwpfTUtil.replaceInPara(doc, params);xwpfTUtil.replaceInTable(doc, params);for (XWPFTable table : doc.getTables()) {for (XWPFTableRow row : table.getRows()) {for (XWPFTableCell cell : row.getTableCells()) {//单元格 : 直接cell.setText()只会把文字加在原有的后面,删除不了文字xwpfTUtil.addBreakInCell(cell);}}}//此处不指定下载目录,默认到用户本地的下载文件下OutputStream os = response.getOutputStream();response.setContentType("application/vnd.ms-excel");// 文件名String fileName = "文件名";response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setContentType("application/x-zip-compressed");response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") +".docx");doc.write(os);xwpfTUtil.close(os);xwpfTUtil.close(is);os.flush();os.close();}
}

模板位置

  1. 输出结果

链接调用

localhost:本地端口/Test/test

有问题可咨询

直接使用word模板生成word文件相关推荐

  1. java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能. 下面是一个简单的示例代码,可以帮助您快速入门. 模 ...

  2. word模板生成word报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  3. C#根据word模板生成word表格报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  4. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子

    [实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...

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

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

  6. 使用word模板生成word文档的各类方案

    使用word模板生成word文档的各类方案 生成word的各种方案 word另存xml进行后续处理 2003版本word(.doc)的xml处理并生成word 2007版本word(.docx)的xm ...

  7. 使用java Apache poi 根据word模板生成word报表

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  8. 根据word模板生成word和PDF

    根据word模板生成word和PDF 需求:有一个固定的合同模板,在vue前台填写指定的信息,替换合同模板指定的内容 我们使用的默认模板内容如图: 我们在前端填写的字段就是合同名称.项目名称和项目金额 ...

  9. PHP 使用word模板生成word文档示例

    <?php namespace Home\Controller; use PhpOffice\PhpWord\TemplateProcessor; use Think\Controller; c ...

  10. 根据word模板生成pdf文件

    1.首先建一个word,插入一个表格,需要填充的值用${parame}代替 (注意:这里的参数要和java实体类里面的参数对应起来,代码放在下面) 2.制作完成后另存为xml格式 3.然后用文本编辑工 ...

最新文章

  1. DCN-2655 ssh 远程登陆配置
  2. poj 2492A Bug's Life(并查集)
  3. 编译-speex For iOS静态库
  4. linux下find命令用法
  5. Spring Boot Runner启动器
  6. matlab读取心电txt数据画图,图解MIT-BIH数据库心电数据下载和Matlab读取程序
  7. 用PHP实现单向链表
  8. 为什么CRM Opportunity的删除会触发一个通向BW系统的RFC
  9. Python---时间函数
  10. 分区取模分库分表策略:多表事务分库内闭环解决方案
  11. wr703n 4m固件 带打印机服务器_我的WIFI打印机
  12. 有人上传你的脸?Facebook新功能立刻就会提醒你
  13. 高可用Hadoop平台-应用JAR部署
  14. Win7/8/10系统下Protel 99 SE不能添加元件库 File is not recognized
  15. 影子系统 是怎么一回事!-间歇博客
  16. RPM包安装相关命令
  17. php中之美家庭儿童零食,适合孩子吃的零食有哪些
  18. 服务器添加打印机显示没有权限,无法连接打印机(没有权限使用网络资源)解决方法和原因...
  19. 源码看JAVA【十】Short
  20. c php embed,使用PHP Embed SAPI实现Opcodes查看器

热门文章

  1. 写一个强化学习训练的gym环境
  2. 接口监控,系统监控,服务保证
  3. python画圆填色_如何用python在图像上绘制不同笔触和填充颜色的文本?
  4. apple 的 app id
  5. Linux初学运维5
  6. 访客定位系统,室内定位技术的应用
  7. 会员权益HTML,会员权益
  8. 李宏毅机器学习课程 思维导图
  9. 数字图像增强的一般方法
  10. Android Activity向右滑动返回