apache poi 操作word模板。

操作方式:

1.对于固定格,可以遍历格子然后替换其中指定的值例如在要替换的cell写入${example} 这样格式,遍历到之后替换。

2.对于需要增长的表格,可以将整行置为空,然后遍历到空格,找到当前那一行,之后,通过生成行,之后再写入。

poi文档地址 https://poi.apache.org/
有两种操作word的接口推荐使用下面的

表格组成从
XWPFDocument–>XWPFTable–>XWPFTableRow–>XWPFTableCell–>XWPFParagraph–>XWPFRun

可以从xwpfDocument往下找到最里面xwpfRun.

其中XWPFParagraph为样式,可以从XWPFTable,XWPFTableRow,XWPFTableCell等中得到其对象

下面给出实例代码

使用这样的word,注意在此例子代码中要分成两个表格

运行结果如下

代码

package com.example.demo.Test;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;import org.apache.poi.xwpf.usermodel.*;/*** 通过word模板生成新的word工具类* @author benran***/
public class GenerateWordByModel {/*** 根据模板生成新word文档* 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入* @param inputUrl 模板存放地址* @param outputUrl 新文档存放地址* @param textMap 需要替换的信息集合* @param tableList 需要插入的表格信息集合* @return 成功返回true,失败返回false*/public static void changWord(String inputUrl, String outputUrl,Map<String, String> textMap, List<String[]> tableList) {XWPFDocument document=null;FileInputStream fileInputStream = null;FileOutputStream fileOutputStream=null;try {fileInputStream = new FileInputStream(inputUrl);//获取docx解析对象document = new XWPFDocument(fileInputStream);//解析替换文本段落对象GenerateWordByModel.changeText(document, textMap);//解析替换表格对象GenerateWordByModel.changeTable(document, textMap, tableList);
//            fileInputStream.close();fileOutputStream = new FileOutputStream(outputUrl);document.write(fileOutputStream);} catch (IOException e) {e.printStackTrace();}finally {if (fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 替换段落文本* @param document docx解析对象* @param textMap 需要替换的信息集合*/public static void changeText(XWPFDocument document, Map<String, String> textMap){//获取段落集合List<XWPFTable> tables = document.getTables();for (XWPFTable table:tables){if(checkText(table.getText())){List<XWPFTableRow> rows = table.getRows();for (XWPFTableRow row:rows) {List<XWPFTableCell> tableCells = row.getTableCells();for (XWPFTableCell cell:tableCells) {if(checkText(cell.getText())){List<XWPFParagraph> paragraphs=cell.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {//判断此段落时候需要进行替换String text = paragraph.getText();if (checkText(text)) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {//替换模板原来位置if(checkText(run.toString())){run.setText(changeValue(paragraph.getText(), textMap), 0);}else{run.setText("", 0);}}}}}}}}}}/*** 替换表格对象方法* @param document docx解析对象* @param textMap 需要替换的信息集合* @param tableList 需要插入的表格信息集合*/public static void changeTable(XWPFDocument document, Map<String, String> textMap,List<String[]> tableList){//获取表格对象集合List<XWPFTable> tables = document.getTables();for (int i = 0; i < tables.size(); i++) {XWPFTable table = tables.get(i);if(table.getRows().size()>1){//判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入if(!checkText(table.getText())){insertTable(table, tableList);}}}}/*** 为表格插入数据,行数不够添加新行* @param table 需要插入数据的表格* @param tableList 插入数据集合*/public static void insertTable(XWPFTable table, List<String[]> tableList){//记录需要插入的第一行int start =-1;boolean findStartFlat=false;for (int i = 0; i < table.getRows().size(); i++) {for (int j = 0; j < table.getRows().get(i).getTableCells().size(); j++) {if("".equals(table.getRows().get(i).getTableCells().get(j).getText())){start=i;break;}}if(findStartFlat){break;}}//创建行,根据需要插入的数据添加新行if(start!=-1){for(int i = 1; i < tableList.size(); i++){insertRow(table,start,start+i);}}//遍历表格插入数据List<XWPFTableRow> rows = table.getRows();for(int i = start; i < rows.size(); i++){List<XWPFTableCell> cells = rows.get(i).getTableCells();for(int j = 0; j < table.getRow(start).getTableCells().size(); j++){XWPFTableCell cell = cells.get(j);cell.setText(tableList.get(0)[j]);}tableList.remove(0);}}public static void insertRow(XWPFTable table, int copyrowIndex, int newrowIndex) {// 在表格中指定的位置新增一行XWPFTableRow targetRow = table.insertNewTableRow(newrowIndex);// 获取需要复制行对象XWPFTableRow copyRow = table.getRow(copyrowIndex);//复制行对象targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr());//或许需要复制的行的列List<XWPFTableCell> copyCells = copyRow.getTableCells();//复制列对象XWPFTableCell targetCell = null;for (int i = 0; i < copyCells.size(); i++) {XWPFTableCell copyCell = copyCells.get(i);targetCell = targetRow.addNewTableCell();targetCell.getCTTc().setTcPr(copyCell.getCTTc().getTcPr());if (copyCell.getParagraphs() != null && copyCell.getParagraphs().size() > 0) {targetCell.getParagraphs().get(0).getCTP().setPPr(copyCell.getParagraphs().get(0).getCTP().getPPr());if (copyCell.getParagraphs().get(0).getRuns() != null&& copyCell.getParagraphs().get(0).getRuns().size() > 0) {XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();cellR.setBold(copyCell.getParagraphs().get(0).getRuns().get(0).isBold());}}}}/*** 判断文本中时候包含$* @param text 文本* @return 包含返回true,不包含返回false*/public static boolean checkText(String text){boolean check  =  false;if(text.indexOf("$")!= -1){check = true;}return check;}/*** 匹配传入信息集合与模板* @param value 模板需要替换的区域* @param textMap 传入信息集合* @return 模板需要替换区域信息集合对应值*/public static 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(key.indexOf(value)!= -1){value = textSet.getValue();}}return value;}public static void main(String[] args) {//模板文件地址String inputUrl = "C:\\Users\\admin\\Desktop\\ffsss.docx";//新生产的模板文件String outputUrl = "C:\\Users\\admin\\Desktop\\replitResult.docx";Map<String, String> testMap = new HashMap<String, String>();testMap.put("name", "名字");testMap.put("sex", "性别");testMap.put("address", "住址");testMap.put("phone", "电话");testMap.put("nation", "民族");List<String[]> testList = new ArrayList<String[]>();testList.add(new String[]{"111","22","33","44"});testList.add(new String[]{"111","22","33","--"});testList.add(new String[]{"111","22","33","00"});testList.add(new String[]{"111","22","33","99"});testList.add(new String[]{"111","22","33","88"});testList.add(new String[]{"111","22","33","77"});testList.add(new String[]{"111","22","33","66"});testList.add(new String[]{"111","22","33","55"});testList.add(new String[]{"111","22","33","12"});GenerateWordByModel.changWord(inputUrl, outputUrl, testMap, testList);}
}

修改代码时注意
${name} 会被分为多个XWPFParagraph,分成$, name,{,} , name可能被分为多个XWPFRun 分成n ,a,m,e

每个属性都会有 getText方法会遍历返回该对象下所有文字。

java word apache poi 操作word模板。相关推荐

  1. JAVA - 使用Apache POI生成word(二) 设置纸张大小、调整纸张方向

    JAVA - 使用Apache POI生成word(二) 设置纸张大小.调整纸张方向 前言 之前开发时,需要将纸张方向由纵向改为横向,查询资料得出只需要设置一下纸张的长度与宽度便可实现相同的效果. 1 ...

  2. JAVA - 使用Apache POI生成word(三)设置页边距

    JAVA - 使用Apache POI生成word(三)设置页边距 1. pom引入依赖 <dependency><groupId>org.apache.poi</gro ...

  3. java使用Apache poi根据word模板生成word报表(增加插入符号、控制分页功能)

    原文链接:https://blog.csdn.net/u012775558/article/details/79678701 根据原代码新增了插入符号和控制分页功能.改了类名,一些方法,新增一个符号类 ...

  4. Java Web之POI操作Excel2016模板

    由于要批量生成Excel,并且模板已经给定.所以尝试用POI来操作一下.由于自己用的Office版本大于2007,所以在操作的时候遇到各种坑,特此记录一下~~~ 注意点 1.由于POI对于Office ...

  5. 使用poi操作word

    导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifa ...

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

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

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

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

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

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

  9. [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)

    [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能) 基于Apache POI对Word进行操作 一.基于Apache POI封装的word文档工具V1. ...

最新文章

  1. 安卓APP_ Fragment(1)—— Fragment概念、基础用法、动态变换、管理栈
  2. java顺序表冒泡排序_冒泡排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. static静态属性 java 1614870751
  4. Delphi常用系统函数总结
  5. matlab中sum(w.),matlab中sum
  6. 用 pre-commit hook 解决 Python 项目编码规范
  7. java ByteBuffer flip()和limit()的理解
  8. Javascript特效:距离某个时间倒计时
  9. matlab 并联机器人,MATLAB在并联机器人运动仿真中的应用
  10. 红警2科技时代V2.5d+Win10红警黑屏补丁
  11. Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫 重磅新企划蓄势待发!
  12. 百度地图线路查询路线样式自定义
  13. Gitea配置文件说明
  14. 水牛城大学本科的计算机专业,纽约大学水牛城分校的计算机专业排名
  15. T-SQL基本语句总结(SQL Server版)
  16. Ubuntu 18.04 安装 GeForce RTX 3080
  17. 极智AI | 量化实现分享五:详解格灵深瞳 EQ 量化算法实现
  18. c语言编程酱油和醋互换,c语言 有两个瓶子A和B,分别盛放醋喝酱油,要求将他们互换...
  19. 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈
  20. Maven打包(瘦身打包部署),不包含第三方依赖jar包

热门文章

  1. UE4 快捷键--引擎篇
  2. win10系统双屏显示
  3. 30个值得收藏可免费搜索/下载PDF电子图书(文档)的搜索引擎
  4. 华为、思科、爱立信、诺基亚、中兴等全球11大通讯设施企业2020年第三季度业绩...
  5. 全国大学生软件测试大赛Web应用测试(五)Jmeter性能测试环境配置
  6. excel中设置每行等高
  7. 内心宁静_宁静js的新功能2 16 0
  8. Canvas+Socket搞出一个多人游玩的“我画你猜”
  9. pdf太大了怎么缩小?怎么能缩小pdf文件大小?
  10. 用plink ssh打开wireshark 连接openwrt tcpdump获取抓包数据