一,word模板如下

二,将word模板中的参数对应的值放到map中

/*** 将word模板中需要的参数值统一放到map中* * @param resource* @param template* @param job* @return*/public Map<String, String> getWordTemplateParam(ExtractResources resource) {ExtractJobs extractJob = jobsDao.findById(job.getId()).get();String statisticsInfo = this.formatStatistic(extractJob.getStatisticsInfo());Map<String, String> params = new HashMap<String, String>();params.put("data", statisticsInfo);params.put("DataReceivingUnit", resource.getOrganization());params.put("SubjectOrProject", resource.getTopic());return params;}/*** 需要根据\n换行的参数值* @param statisticsInfo* @return*/public String formatStatistic(String statisticsInfo) {String result = "";String bcmStr = "";String subDocTypeStr = "";Map<String, Integer> map = (Map) JSON.parse(statisticsInfo);Set<Entry<String, Integer>> entrySet = map.entrySet();for (Entry<String, Integer> entry : entrySet) {String key = entry.getKey();Integer value = entry.getValue();if (Pattern.matches("^[a-zA-Z]+$", key)) {// 母体类型String keyStr;//省略业务代码keyStr = key;bcmStr += keyStr + ":" + value + "\n";//这里标识以\n为标识,表名明需要换行} else {// 子类型subDocTypeStr += key + " : " + value + "\n";}}result = result + subDocTypeStr + bcmStr;return result;}

三,根据模板生成word文档


/*** 生成word文档*/
public void addStatisticWord(ExtractResources resource, ExtractTemplate template, ExtractJobs job) {OutputStream os = null;InputStream is = null;Map<String, String> params = this.getWordTemplateParam(resource,template,job);try {// word文档模板路径String filePath = "D:" + File.separator + "templateWord" + File.separator + "数据模板.docx";File templateFile = new File(filePath);if (!templateFile.exists()) {templateFile.mkdirs();}// 输出的word文件名称String outputName = "NSTL数据交接登记表-" + template.getTemplateName() + "-" + job.getId() + ".docx";// word输出路径 resourcPath/jobId/successString outputPath = resource.getFileSavePath() + File.separator + job.getId() + File.separator + "success"+ File.separator + outputName;is = new FileInputStream(templateFile);XWPFDocument doc = new XWPFDocument(is);List<XWPFTable> tables = doc.getTables();// 获取全部表格对象(word模板是一个表格)for (XWPFTable xwpfTable : tables) {List<XWPFTableRow> rows = xwpfTable.getRows();// 获取word模板表格每一行for (XWPFTableRow row : rows) {List<XWPFTableCell> tableCells = row.getTableCells();//每一行的单元格for (XWPFTableCell cell : tableCells) {List<XWPFParagraph> paragraphs = cell.getParagraphs();// 每个单元格里的段落集合for (XWPFParagraph paragraph : paragraphs) {String paragraphText = paragraph.getText();if (this.checkText(paragraphText)) {//段落文字包含$,代表是参数,需要替换为map中对应的参数值List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = this.changeValue(run.toString(), params);//根据参数名到map中获取参数值paragraph.removeRun(i);//可以理解为删除当前这一个段落run = paragraph.insertNewRun(i);//然后插入一个新的段落// 设置字体run.setFontFamily("黑体");run.setFontSize(14);if (runText.contains("\n")) {//参数值包含\n代表需要换行(也可以设置成\r,只是一个标识,因为我在formatStatistic方法中设置的以\n为标识换行)String[] text = runText.split("\n");for (int j = 0; j < text.length; j++) {run.setText(text[j].trim());//往新的段落里set参数值run.addBreak();// 换行}} else {run.setText(runText);}}}}}}}os = new FileOutputStream(outputPath);doc.write(os);} catch (Exception e) {e.printStackTrace();} finally {this.close(os);this.close(is);}}/*** 匹配传入信息集合与模板* * @param value   模板需要替换的区域* @param textMap 传入信息集合* @return 模板需要替换区域信息集合对应值*/public String changeValue(String value, Map<String, String> textMap) {Set<Entry<String, String>> textSets = textMap.entrySet();for (Entry<String, String> textSet : textSets) {// 匹配模板与替换值 格式${key}String key = "${" + textSet.getKey() + "}";if (value.indexOf(key) != -1) {value = textSet.getValue();}}// 模板未匹配到区域替换为空if (checkText(value)) {value = "";}return value;}/*** 判断文本中时候包含$* * @param text 文本* @return 包含返回true,不包含返回false*/public boolean checkText(String text) {boolean check = false;if (text.indexOf("$") != -1) {check = true;}return check;}/*** 关闭输入流* * @param is*/private void close(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 关闭输出流* * @param os*/private void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}

java使用POI根据word模板生成文档,并且根据参数值实现换行相关推荐

  1. java根据word模板生成文档(含文本替换和动态生成表格)

    开发功能需求:给定word模板,word模板中存在"${XXX}"格式的需要变量替换的一些词,包括直接可以被替换的词,需要循环获取.替换.格式处理的词(例如根据数据库存储内容循环生 ...

  2. 【3】利用Word模板生成文档的总结

    阅读目录 Word二次开发概况 使用DsoFramer进行开发 使用Interop进行开发 打开.关闭和写入操作 批量替换文本 遍历段落替换文本 查找后逐个替换文本 结论 在各类应用系统开发中,和Wo ...

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

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

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

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

  5. java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片

    介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...

  6. java使用poi替换word模板

    poi 操作word文档 0. 参考文档 感谢大萌音音's B站视频的分享, 如有不懂, 可以去看这个视频 1. poi 依赖 <dependency><groupId>org ...

  7. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  8. Java使用poi根据word模板进行导出(有效可行)

    最近一直在做与导出这部分相关的事情,有一个就是需要将数据库中查询到的信息写入到word模板中再进行导出.下面的代码直接复制使用即可,没啥毛病,无论是段落中的,还是表格中的,都是有效的.使用过程中遇到的 ...

  9. 通过Excel+Word批量生成文档及批量提取和修改文档名字

    excel和word是日常的办公软件,最近老师给了我一个任务,任务内容如下: 给了我一个班级同学成绩单excel表格和一个给家长的一封信word模板,在word模板中有相应的成绩表格要填写,即:我要去 ...

最新文章

  1. colorAccent,colorPrimary,colorPrimaryDark 作用的地方
  2. python中的format什么意思中文-Python中format的用法
  3. 一个关于重定向的问题研究,应该具有实用性
  4. Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?
  5. jstl fn:replace替换换行符
  6. Hibernate之lazy延迟加载
  7. 二叉树的最近公共祖先—leetcode236
  8. Vue项目多域名跨域
  9. K8S精华问答 | Kubernetes集群常见问题
  10. js元素事件绑定与解绑兼容代码
  11. php可以改jsp吗,把默认的php路径改成jsp
  12. Google推出一款用户隐私保护工具箱
  13. Robot Framework(4)——Selenium2Library关键字
  14. 类似平行宇宙的灵异事件,三个常见的解释
  15. cookie被淘汰_可爱可恨的 Cookie
  16. (转)Error launching Console Application PDFLaTeX ... 的解决方法
  17. matlab 指数函数拟合,[转载]MATLAB数据拟合例子(一次函数、指数函数、双曲线)...
  18. 人工智能终将自我进化?排除无用功能,让自己更加完美?
  19. GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式
  20. 对于开发软件的NABCD分析

热门文章

  1. C程序如何与操作系统交互?
  2. 02_Spring Bean 属性 即xml <beans>标签详解
  3. 基于A*和势场寻路的快速小队伍动态势场避障寻路
  4. 雅思写作,评分标准和模板
  5. 二级域名分发美化版源码+搭建教程
  6. Glass Chain 推出 NFT 平台并与疯狂火星鼠俱乐部IP合作
  7. 用python画路飞代码_用Python画路飞骷髅图案【附代码】
  8. redis主从配置方法
  9. 【转】图片像素数、打印机分辨率、打印尺寸之间的关系
  10. vue判断数组是否为空