XWPFDocument读取word并修改发送

isFile为文件路径,data为一个map对象,data.put("userName",userName);那么就需要在文档中写${userName}就可以输出到文档了

package com.jeeplus.modules.stock;

import java.io.FileInputStream;
import java.io.FileOutputStream;
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.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;


public class FileAlterInfo {
	/**
	 * 实现对word读取和修改操作
	 *
	 * @param filePath
	 *            word模板路径和名称
	 * @param map
	 *            待填充的数据,从数据库读取
	 * @throws IOException
	 * @throws InvalidFormatException
	 */
	public static void readwriteWord(String inFile, Map<String, Object> data) throws InvalidFormatException, IOException {
		InputStream is = new FileInputStream(inFile);
		XWPFDocument document;
		try {
			document = new XWPFDocument(OPCPackage.open(is));
			// 替换段落里面的变量
			replaceInPara(document, data);
			OutputStream os = new FileOutputStream(inFile);
			document.write(os);
			close(os);
			close(is);
		} catch (Exception e) {

			e.printStackTrace();
		}

	}

	/**
	 * 替换段落里面的变量
	 *
	 * @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 = "";

			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);
					String i1 = run.toString();
						runText += i1;
						para.removeRun(0);

					}

				}
			System.out.println(runText);
				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);
				}
			}

	}

	/**
	 * 正则匹配字符串
	 *
	 * @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();
			}
		}
	}
}







  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: xwpfdocument是Apache POI库中的一个类,用于读取和操作Microsoft Word 2007及以上版本的.docx文件。它提供了一种方便的方式来读取Word文档中的内容,包括文本、表格、图片等。使用xwpfdocument可以轻松地将Word文档中的内容提取出来,并进行进一步的处理和分析。 ### 回答2: xwpfdocument是Apache POI库中的一个类,用于读取Microsoft Word的.docx文件。通过xwpfdocument,我们可以将Word文档转换为Java代码中的数据结构,并对文档内容进行读写操作。 首先,我们需要通过java.io包中的FileInputStream类将Word文档读入内存中。代码示例如下: ``` FileInputStream fis = new FileInputStream(new File("example.docx")); XWPFDocument doc = new XWPFDocument(fis); ``` 从上述代码中可以看到,我们首先创建了一个FileInputStream对象,指定了要读取Word文档的路径。然后,我们将FileInputStream对象传递给XWPFDocument的构造函数,生成一个代表Word文档的XWPFDocument对象。 接下来,我们便可以通过XWPFDocument对象来读取文档内容了。例如,我们可以通过以下代码获取文档中所有的段落: ``` List<XWPFParagraph> paragraphs = doc.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { System.out.println(paragraph.getText()); } ``` 上述代码获取了文档中的所有段落,并通过for循环遍历每一个段落,输出其文本内容。 除了获取文本内容外,我们还可以通过XWPFDocument获取文档中的表格、图片等特殊内容,具体的操作可参考Apache POI的官方文档。 总之,xwpfdocument的作用主要是用于读取Word文档,将文档内容转换为Java的数据结构,方便我们进行读写操作。 ### 回答3: xwpfdocument是Apache POI中的一个类,它提供了读取和写入Microsoft Word的DOCX格式的能力。下面是xwpfdocument读取word的解释和过程。 xwpfdocument读取word的解释: xwpfdocument是用于读取Word文档的一个Java类。这个类可以读取.docx格式的Word文档,解析其中的文字、图片等内容,并以Java对象的形式返回到程序中供开发者使用。 xwpfdocument读取word的过程: 1. 导入需要的库文件 使用xwpfdocument读取word文档需要导入Apache POI的核心库poi.jar、poi-ooxml.jar和poi-ooxml-schemas.jar。 2. 创建xwpfdocument对象,并从文件中读取Word文档 实例化xwpfdocument对象,并通过xwpfdocument对象的构造函数将Word文档的路径传入,将会返回一个读取到的Word文档对象。 FileInputStream fileInputStream = new FileInputStream("F:/Java/wxw.docx"); XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream); 3. 读取Word文档中的内容 通过xwpfdocument对象提供的方法来获取Word文档中的内容。包括段落、文字、图片等信息。 //获取所有的段落 List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { System.out.println(paragraph.getText()); } //获取所有图片 List<XWPFPictureData> pictureDatas = xwpfDocument.getAllPictures(); for (XWPFPictureData pictureData : pictureDatas) { System.out.println(pictureData.getFileName()); byte[] pictureByte = pictureData.getData(); } 4. 关闭文件输入流 使用完毕后使用close方法关闭文件输入流。 fileInputStream.close(); 总之,xwpfdocument读取word是非常简单并且实用的。通过xwpfdocument对象读取Word文档并获取其中的内容,方便快捷地操作Word文档。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未名胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值