使用word模板将对应内容替换成当前设置的数据

替换前:

替换后:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;import javax.servlet.http.HttpServletResponse;/*** 操作word文档工具类** @author wangyj* @date 2020-03-03**/
public class POIUtil {/*** 用一个docx文档作为模板,然后替换其中的内容,再写入目标文档中。* @throws Exception*/public static void templateWrite(String filePath, String outFilePath, Map<String, Object> params, HttpServletResponse response) throws Exception {String fileName = new String("生态保护红线人类活动监控报告.docx".getBytes("UTF-8"), "iso-8859-1");    //生成word文件的文件名InputStream is = new FileInputStream(filePath);XWPFDocument doc = new XWPFDocument(is);//替换段落里面的变量replaceInPara(doc, params);//替换表格里面的变量replaceInTable(doc, params);/*OutputStream os = new FileOutputStream(outFilePath);*/OutputStream os = response.getOutputStream();response.setHeader("Content-disposition", "attachment; filename=" + fileName);doc.write(os);close(os);close(is);}/*** 替换段落里面的变量* @param doc 要替换的文档* @param params 参数*/private static void replaceInPara(XWPFDocument doc, Map<String, Object> params) {Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();XWPFParagraph para;while (iterator.hasNext()) {para = iterator.next();replaceInPara(para, params);}}/*** 替换段落里面的变量** @param para   要替换的段落* @param params 参数*/private static void replaceInPara(XWPFParagraph para, Map<String, Object> params) {List<XWPFRun> runs;Matcher matcher;String runText = "";int fontSize = 0;UnderlinePatterns underlinePatterns = null;if (matcher(para.getParagraphText()).find()) {runs = para.getRuns();if (runs.size() > 0) {int j = runs.size();for (int i = 0; i < j; i++) {XWPFRun run = runs.get(0);if (fontSize == 0) {fontSize = run.getFontSize();}if(underlinePatterns==null){underlinePatterns=run.getUnderline();}String i1 = run.toString();runText += i1;para.removeRun(0);}}matcher = matcher(runText);if (matcher.find()) {while ((matcher = matcher(runText)).find()) {runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));}//直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,//所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。//para.insertNewRun(0).setText(runText);//新增的没有样式XWPFRun run = para.createRun();run.setText(runText,0);run.setFontSize(fontSize);run.setUnderline(underlinePatterns);run.setFontFamily("楷体");//字体run.setFontSize(12);//字体大小//run.setBold(true); //加粗//run.setColor("FF0000");//默认:宋体(wps)/等线(office2016) 5号 两端对齐 单倍间距//run.setBold(false);//加粗//run.setCapitalized(false);//我也不知道这个属性做啥的//run.setCharacterSpacing(5);//这个属性报错//run.setColor("BED4F1");//设置颜色--十六进制//run.setDoubleStrikethrough(false);//双删除线//run.setEmbossed(false);//浮雕字体----效果和印记(悬浮阴影)类似//run.setFontFamily("宋体");//字体//run.setFontFamily("华文新魏", FontCharRange.cs);//字体,范围----效果不详//run.setFontSize(14);//字体大小//run.setImprinted(false);//印迹(悬浮阴影)---效果和浮雕类似//run.setItalic(false);//斜体(字体倾斜)//run.setKerning(1);//字距调整----这个好像没有效果//run.setShadow(true);//阴影---稍微有点效果(阴影不明显)//run.setSmallCaps(true);//小型股------效果不清楚//run.setStrike(true);//单删除线(废弃)//run.setStrikeThrough(false);//单删除线(新的替换Strike)//run.setSubscript(VerticalAlign.SUBSCRIPT);//下标(吧当前这个run变成下标)---枚举//run.setTextPosition(20);//设置两行之间的行间距//run.setUnderline(UnderlinePatterns.DASH_LONG);//各种类型的下划线(枚举)//run0.addBreak();//类似换行的操作(html的  br标签)//run0.addTab();//tab键//run0.addCarriageReturn();//回车键//注意:addTab()和addCarriageReturn() 对setText()的使用先后顺序有关:比如先执行addTab,再写Text这是对当前这个Text的Table,反之是对下一个run的Text的Tab效果}}}/*** 替换表格里面的变量* @param doc 要替换的文档* @param params 参数*/private static void replaceInTable(XWPFDocument doc, Map<String, Object> params) {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) {replaceInPara(para, params);}}}}}/*** 正则匹配字符串* @param str* @return*/private static Matcher matcher(String str) {Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}/*** 关闭输入流* @param is*/private static void close(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 关闭输出流* @param os*/private static void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}

如何调用呢?


```javaMap<String, Object> params = new HashMap<String, Object>();params.put("year", Convert.toStr(n));params.put("index", Convert.toStr(jd));// 模板word文件真实路径String wordSrcPath = "D:/MonitoringReport.docx";//调用方法POIUtil.templateWrite(wordSrcPath, null, params,response);

Springboot word文档数据替换工具类相关推荐

  1. PhpWord与GD 和图像处理 函数进行word文档数值替换以及合并插入图片

    #PhpWord与GD 和图像处理 函数进行word文档数值替换以及合并插入图片 代码示例 代码如下(示例): public function test(){//读取模板$templateProces ...

  2. word办公技巧:如何让Excel与Word文档数据同步

    Word和Excel是一对好基友,它们之间的数据信息都是可以关联的.简单来说,就是将Excel数据导入到Word中后,可实现数据同步更新,从而避免我们重复录入或更改数据.那该怎么做呢?今天,小编为大家 ...

  3. word文档转化html 工具mammoth

    word文档转化html 工具mammoth 一.下载mammoth npm install mammoth 二.配置环境变量 npm成功之后会有一个node_modules文件,将node_modu ...

  4. 如何将excel表格导入word_word办公技巧:如何让Excel与Word文档数据同步

    编按: Word和Excel是一对好基友,它们之间的数据信息都是可以关联的.简单来说,就是将Excel数据导入到Word中后,可实现数据同步更新,从而避免我们重复录入或更改数据.那该怎么做呢?今天,小 ...

  5. 木木Word文档转图片工具

    刚刚写的Word文档转图片工具,转换效果非常好,字体清晰,表格也不会失真,支持保存为BMP.JPG格式. http://nj.onlinedown.net/soft/88598.htm

  6. word文档批量生成工具(附免费软件)(按Excel表格内容自动替换内容生成文档)

    批量生成word文档是让人无比厌恶但有时又不得不做的事情.比如学校要给拟录取的学生发通知书,就可能需要批量生成一批只有"姓名"."学院"和"专业&qu ...

  7. Word文档管理首选工具Aspose.Words for .NET完整功能一览!

    Aspose.Words for .NET(点击下载)是用于执行各种文档管理和操作任务,支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.同时支持所有 ...

  8. EasyPoi 实现Word文档内容替换3种情况(正常文本替换、表格文本替换、图表替换)

    1 Maven依赖 <!-- EasyPoi文档处理工具 --><dependency><groupId>cn.afterturn</groupId>& ...

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

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

  10. Word文档批量生成工具分享

    Excel的数据记录可以轻松批量生成Word文档了. 使用标准的excel数据表+单据模板word文档轻松搞定,下面给大家介绍个简单的方法.以准考证模板为例: 第一步:模板及数据文件准备: 第二步: ...

最新文章

  1. Android使用Handler造成内存泄露的分析及解决方法
  2. Elasticsearch查询相关总结以及timestamp和时区问题
  3. hook java_Java 实现 Hook 对鼠标键盘监听 - 沐早'S NOTEBOOK - CSDN博客
  4. 2018陕西省赛K题[watermelon_planting]
  5. db2嵌套查询效率_db2性能优化
  6. 阿里云上千规模节点项目提炼精华,全在这里了!
  7. 计算机英语评价,关于计算机专业英文自我评价
  8. [转]国内Linux操作系统发行商分类溯源
  9. atom对比 vscode_几款前端IDE工具:Sublime、Atom、VSCode比较
  10. 我和面试官的博弈:Redis 篇
  11. STM32实现四驱小车(二)通信任务——遥控器SBUS通信
  12. 用于 3d 渲染应用程序的常见物体 IOR(折射率)值
  13. java连接hsql数据库_访问Hsql .data数据库文件
  14. 《老路用得上的商学课》21-25学习笔记
  15. Python处理excel合并单元格
  16. 有趣的算法:捞鱼问题
  17. 简单的python爬虫程序:爬取斗鱼直播人气前五十的主播
  18. 4K分辨率火狐浏览器宋体过细解决方法
  19. Android仿QQ微信开场导航以及登陆界面
  20. html5文字跳动特效,jQuery网页文字跳动动画特效

热门文章

  1. android xml设置矩形,如何在Android中用XML创建“矩形内部的透明圆”形状?
  2. 百度在线笔试题-裁减网格纸
  3. 2022首届“天权信安catf1ag”网络安全联合公开赛复盘
  4. viv代码分析(一)
  5. 机器学习笔记-K近邻算法
  6. 我的奇思妙想机器人消防员_我的奇思妙想发明机器人作文500字
  7. 数据库系统单表查询笔记
  8. 2023养老展,北京老博会,老年用品与适老家具展,老龄产业展
  9. 软件测试工程师该怎么做自己的职业规划呢
  10. 8.3 子模块分析之SMFC