POI word 模板 字段替换

在这里插入图片描述

<dependency>
<!-- LEVEL-PLT:操作EXCEL所需要的包 -->
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.13</version>
</dependency>
<dependency>
	<!-- LEVEL-PLT:提供对office的word,excel,visio,ppt的操作 -->
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.13</version>
</dependency>
package com.baic.util;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

public class WorderToNewWordUtils {
	
	private static Logger logger = LoggerFactory.getLogger(WorderToNewWordUtils.class);

	/**
	 * 根据模板生成新word文档 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
	 *
	 * @param inputUrl
	 *            模板存放地址
	 * @param textMap
	 *            需要替换的信息集合
	 * @return 成功返回true, 失败返回false
	 */
	public static boolean changWord(String inputUrl, String outputUrl, Map<String, String> textMap) {

		// 模板转换默认成功
		boolean changeFlag = true;
		try {
			// 获取docx解析对象
			XWPFDocument document = new XWPFDocument(new FileInputStream(new File(inputUrl)));
			// 解析替换文本段落对象
			WorderToNewWordUtils.changeText(document, textMap);
			// 生成新的word
			File file = new File(outputUrl);
			FileOutputStream stream = new FileOutputStream(file);
			document.write(stream);
			stream.close();
		} catch (IOException e) {
			logger.error("交付物生成word封面",e);
			changeFlag = false;
		}
		return changeFlag;
	}

	/**
	 * 替换段落文本
	 *
	 * @param document
	 *            docx解析对象
	 * @param textMap
	 *            需要替换的信息集合
	 */
	public static void changeText(XWPFDocument document, Map<String, String> textMap) {
		// 获取段落集合
		List<XWPFParagraph> paragraphs = document.getParagraphs();

		for (XWPFParagraph paragraph : paragraphs) {
			// 判断此段落时候需要进行替换
			String text = paragraph.getText();
			if (checkText(text)) {
				List<XWPFRun> runs = paragraph.getRuns();
				for (XWPFRun run : runs) {
					// 替换模板原来位置
					run.setText(changeValue(run.toString(), textMap), 0);
				}
			}
		}

	}

	/**
	 * 判断文本中时候包含$
	 *
	 * @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<Map.Entry<String, String>> textSets = textMap.entrySet();
		for (Map.Entry<String, String> textSet : textSets) {
			// 匹配模板与替换值 格式${key}
			String key = "${" + textSet.getKey() + "}";
			if (value.indexOf(key) != -1) {
				value = textSet.getValue();
			}
		}
		// 模板未匹配到区域替换为空
		if (checkText(value)) {
			value = "";
		}
		return value;
	}
}

在weblogic上可能报错,解决方法[https://blog.csdn.net/weixin_43893430/article/details/102979370]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值