# poi-demo **Repository Path**: yangzhizhao/poi-demo ## Basic Information - **Project Name**: poi-demo - **Description**: java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 18 - **Forks**: 8 - **Created**: 2021-11-25 - **Last Updated**: 2026-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # poi-demo #### 介绍 java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片 #### 软件架构 ![img.png](images/img.png) #### 安装教程 1. 环境搭建:jdk1.8.0_291、maven1.8.0_291 2. IDEA工具:IntelliJ IDEA 2021.1.2 (Community Edition) 3. git clone https://gitee.com/yangzhizhao/poi-demo.git #### 实现思路 1. 通过poi加载XWPFDocument对象,再获取word模板文档里的所有段落XWPFParagraph、图片XWPFPicture、表格XWPFTable、图表XWPFChart对象,最后对这些对象进行数据替换 #### 替换对比 1. 原模板 ![test_template_01.jpg](images/test_template/test_template_01.jpg) 2. 替换后 ![test_result_01.jpg](images/test_result/test_result_01.jpg) #### 使用说明 1. 抽象类WordContentParser ```java package com.poi.demo.parser; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.*; import java.util.Objects; /** *

Word内容解析器

* * @author Allen Yang * @datetime 2021/11/18 14:46 */ @Setter @Getter @Slf4j public abstract class WordContentParser { public static final String ERR_MSG_DOC_LOAD_FAIL = "文档加载失败"; public static final String ERR_MSG_DOC_OUTPUT_FAIL = "文档导出失败"; public static final String ERR_MSG_DOC_NOT_LOADED = "文档未加载"; public static final String ERR_MSG_PARAM_NOT_INITIALIZED = "替换参数未初始化"; public static final String ERR_MSG_ROW_ELEMENT_MISMATCH = "下标${index}的行值元素不匹配"; public static final String ERR_MSG_TABLE_NOT_EXIST = "不存在下标${index}的表格"; public static final String ERR_MSG_CELLS_NOT_UNANIMOUS = "下标${index}的表格值和单元格个数不一致"; public static final String ERR_MSG_TEMPLATE_CHART_NOT_EXIST = "不存在下标${index}的图表"; public static final String ERR_MSG_PIC_NOT_ADD = "下标${index}的图片替换失败"; public static final String ERR_MSG_PIC_NOT_EXIST = "模板中${type}下标${index}的图片不存在替换值"; //文档对象 private XWPFDocument doc; public WordContentParser(InputStream in) { try { this.doc = new XWPFDocument(in); } catch (IOException e) { log.error("{}:{}", ERR_MSG_DOC_LOAD_FAIL, e.getMessage()); throw new RuntimeException(ERR_MSG_DOC_LOAD_FAIL); } } public WordContentParser(XWPFDocument doc) { this.doc = doc; } public WordContentParser(String path) { this.doc = loadXWPFDocument(path); } public static XWPFDocument loadXWPFDocument(String path) { InputStream in = null; XWPFDocument doc = null; try { in = new FileInputStream(path); doc = new XWPFDocument(in); } catch (Exception e) { log.error("{}:{}", ERR_MSG_DOC_LOAD_FAIL, e.getMessage()); throw new RuntimeException(ERR_MSG_DOC_LOAD_FAIL); } finally { if (Objects.nonNull(in)) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } return doc; } } public File outputFile(String path) { if (Objects.isNull(doc)) { throw new RuntimeException(ERR_MSG_DOC_LOAD_FAIL); } File file = null; FileOutputStream fos = null; try { file = new File(path); if (file.exists()) { file.delete(); } fos = new FileOutputStream(path); doc.write(fos); } catch (Exception e) { log.error("{}:{}", ERR_MSG_DOC_OUTPUT_FAIL, e.getMessage()); throw new RuntimeException(ERR_MSG_DOC_OUTPUT_FAIL); } finally { if (Objects.nonNull(fos)) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } return file; } } public abstract XWPFDocument replace(); } ``` 2. 继承抽象类的有子类WordParagraphParser、WordPictureParser、WordTableParser、WordChartParser,分别实现了replace()替换word文字、图片、表格、图标,具体实现看项目代码 3. 下载项目后运行WordContentParserTest #### 最后 1. 有更好的方案或者问题咨询请联系我 2. 邮箱:mr.yangzhizhao艾特qq.com