XWPFDocument读取word并修改发送

来源:互联网 发布:怎样修改mac地址 编辑:程序博客网 时间:2024/06/06 02:38

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();}}}}







原创粉丝点击