POI往word模板中写入数据
转:
POI的XWPFDocument和XWPFTemplate两种方法往word模板中填充数据
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.apache.poi.POIXMLProperties.CoreProperties;
- import org.apache.poi.hwpf.HWPFDocument;
- import org.apache.poi.hwpf.usermodel.Range;
- import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
- import org.apache.poi.xwpf.usermodel.XWPFDocument;
- import org.apache.poi.xwpf.usermodel.XWPFParagraph;
- import org.apache.poi.xwpf.usermodel.XWPFRun;
- import org.apache.poi.xwpf.usermodel.XWPFTable;
- import org.apache.poi.xwpf.usermodel.XWPFTableCell;
- import org.apache.poi.xwpf.usermodel.XWPFTableRow;
- import com.deepoove.poi.XWPFTemplate;
- import com.deepoove.poi.data.PictureRenderData;
- /**
- * @author Admin
- *
- */
- public class WriteWordUtil {
- public void writeDocx(String path, Map<String, String> map) throws Exception {
- InputStream is = new FileInputStream(path);
- XWPFDocument doc = new XWPFDocument(is);
- // XWPFWordExtractor extractor = new XWPFWordExtractor(doc) ;
- // String text = extractor.getText();
- // System.out.println(text);
- // CoreProperties coreProps = extractor.getCoreProperties();
- // this.printCoreProperties(coreProps);
- // this.close(is);
- }
- /**
- * 替换段落里面的变量
- *
- * @param doc
- * 要替换的文档
- * @param params
- * 参数
- */
- private void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
- Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
- XWPFParagraph para;
- while (iterator.hasNext()) {
- para = iterator.next();
- this.replaceInPara(para, params);
- }
- }
- /**
- * 替换段落里面的变量
- *
- * @param para
- * 要替换的段落
- * @param params
- * 参数
- */
- private void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
- List<XWPFRun> runs;
- Matcher matcher;
- if (this.matcher(para.getParagraphText()).find()) {
- runs = para.getRuns();
- for (int i = 0; i < runs.size(); i++) {
- XWPFRun run = runs.get(i);
- String runText = run.toString();
- matcher = this.matcher(runText);
- if (matcher.find()) {
- while ((matcher = this.matcher(runText)).find()) {
- runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
- }
- // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
- // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
- para.removeRun(i);
- if(runText.equals("null")){
- runText="";
- }
- para.insertNewRun(i).setText(runText);
- }
- }
- }
- }
- /**
- * 替换表格里面的变量
- *
- * @param doc
- * 要替换的文档
- * @param params
- * 参数
- */
- private void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
- Iterator<XWPFTable> iterator = doc.getTablesIterator();
- XWPFTable table;
- List<XWPFTableRow> rows;
- List<XWPFTableCell> cells;
- List<XWPFParagraph> paras;
- while (iterator.hasNext()) {
- table = iterator.next();
- rows = table.getRows();
- for (XWPFTableRow row : rows) {
- cells = row.getTableCells();
- for (XWPFTableCell cell : cells) {
- String cellTextString = cell.getText();
- for (Entry<String, Object> e : params.entrySet()) {
- if (cellTextString.contains("${"+e.getKey()+"}"))
- cellTextString = cellTextString.replace("${"+e.getKey()+"}", e.getValue().toString());
- }
- cell.removeParagraph(0);
- if(cellTextString.contains("${") && cellTextString.contains("}")){
- cellTextString = "";
- }
- cell.setText(cellTextString);
- // paras = cell.getParagraphs();
- // for (XWPFParagraph para : paras) {
- // this.replaceInPara(para, params);
- // }
- }
- }
- }
- }
- /**
- * 正则匹配字符串
- *
- * @param str
- * @return
- */
- private Matcher matcher(String str) {
- Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
- Matcher matcher = pattern.matcher(str);
- return matcher;
- }
- /**
- * 关闭输入流
- *
- * @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();
- }
- }
- }
- /**
- * 输出CoreProperties信息
- *
- * @param coreProps
- */
- private void printCoreProperties(CoreProperties coreProps) {
- System.out.println(coreProps.getCategory()); // 分类
- System.out.println(coreProps.getCreator()); // 创建者
- System.out.println(coreProps.getCreated()); // 创建时间
- System.out.println(coreProps.getTitle()); // 标题
- }
- /**
- * word占位用${object}有缺陷不能填充图片
- * @param filePath
- * @param params
- * @throws Exception
- */
- public static String templateWrite(String filePath, Map<String, Object> params,String outFilePath)throws Exception{
- InputStream is = new FileInputStream(filePath);
- WriteWordUtil writeWordUtil = new WriteWordUtil();
- XWPFDocument doc = new XWPFDocument(is);
- // 替换段落里面的变量
- writeWordUtil.replaceInPara(doc, params);
- // 替换表格里面的变量
- writeWordUtil.replaceInTable(doc, params);
- OutputStream os = new FileOutputStream(outFilePath);
- doc.write(os);
- writeWordUtil.close(os);
- writeWordUtil.close(is);
- os.flush();
- os.close();
- return "";
- }
- /**
- * word占位用{{object}}比较完美可以填充图片
- * @param filePath
- * @param params
- * @param outFilePath
- * @return
- * @throws Exception
- */
- public static String templateWrite2(String filePath, Map<String, Object> params,String outFilePath)throws Exception{
- XWPFTemplate template = XWPFTemplate.compile(filePath).render(params);
- FileOutputStream out = new FileOutputStream(outFilePath);
- template.write(out);
- out.flush();
- out.close();
- template.close();
- return "";
- }
- public static void main(String[] args) throws Exception {
- Map<String, Object> params = new HashMap<String, Object>();
- params.put("JSDWMC", "项目1\r\na");//
- params.put("XMMC", "项目2\r\nb");//
- params.put("1", "1");//
- params.put("2", "2");//
- params.put("object1", "o1");//
- params.put("object2", "o2");//
- params.put("localPicture", new PictureRenderData(120, 120, "D:\\A.png"));
- templateWrite("D:\\template\\1.docx", params, "D:\\template\\5.docx");
- templateWrite2("D:\\2.docx", params, "D:\\template\\7.docx");
- }
- }
用到的jar包
poi-3.17.jar
poi-examples-3.17.jar
poi-excelant-3.17.jar
poi-ooxml-3.17.jar
poi-ooxml-schemas-3.17.jar
poi-scratchpad-3.17.jar
poi-tl.jar
jar下载:下载地址
POI往word模板中写入数据的更多相关文章
- 向Word模板中填充数据
现在有这样的需求,给Word文档的指定位置填充上特定数据,例如我们有一个终端,用来打印员工的薪资证明,对于一个公司来说,他的薪资证明模板是固定的,变化的地方是员工姓名,部门,职位等.我们只需要将这些指 ...
- [转载]java向word模板中填充数据(总结)
使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...
- [原创]java向word模板中填充数据(总结)
使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...
- 将excel中的数据填入word模板中-VBA
首先将word模板中需要填写excel中数据的空白处用自己独特的字符串标记,比如 数据001 什么的.如下图: 这样,就可以用vba搜寻这些自己独特的标记来根据excel内容填充word了. 第 ...
- POI向Excel中写入数据及追加数据
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import ...
- 使用java Apache poi 根据word模板生成word报表
项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...
- 读取word模板,填充数据后导出
一.需求说明 定期生成word报告,报告中含有文本.表格.图表等元素,依次获取进行替换,保留原有样式,生成新的word文档 二.引入依赖 <dependency> <groupId& ...
- poi导出word模板项目实例(一个文件)
在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面 <table class="formTa ...
- 复制excel表,往excel表中写入数据
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import jav ...
随机推荐
- unset命令详解
基础命令学习目录首页 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现.它可以取消 ...
- Daily Scrum 11.15
今日完成任务: 1.在回答页面显示用户的相关信息 2.重写了搜索方法,并在自己的Demo网站测试成功 3.修改问题实体属性,加入悬赏积分:并在问题列表页面显示问题悬赏分数 遇到困难:一个是对于学长的搜 ...
- 《JavaScript》split和join
首先了解split和join两个函数 split 根据条件截断字符串,返回数组 //str.split(option,length) 字符串转数组 //option:表示分割依据 //length:用 ...
- 福大软工1816 · 评分结果 · beta冲刺总评
作业地址:beta答辩总结.beta冲刺7.beta冲刺6.beta冲刺5.beta冲刺4.beta冲刺3.beta冲刺2.beta冲刺1.beta冲刺前准备 作业提交准则 按时交 - 有分 晚交 - ...
- eg_5
问题描述:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符. 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” ...
- ssh结合使用
springxml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=& ...
- 预则立&&他山之石--团队计划、访谈优秀前辈
团队计划&访谈内容 一.团队计划 序号 任务内容 计划完成时间 主要负责人 备注 1 对接教师报课系统 决定是否重构代码 2016.10.16 陈少铭.黄家俊 阅读CourseManageme ...
- 使用testng多线程来测试成交编号重复的问题
1.首先编写一个测试用的 function CREATE OR REPLACE FUNCTION getDealmainNo_test(dealdate IN varchar2, productcod ...
- (二)Jmeter各部件的作用
JMeter主要组件介绍 1.测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组(Thread Group)代表一定数量的并发用户 ...
- 如何处理UIVIew addsubview 不显示subview
老代码: addsubview不显示uilabel -(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSIn ...