Java使用POI通过模板生成Word
前言
最近工作需要用到,所以记录下来以便查找。
一、概述
POI读写word使用的核心类是XWPFDocument。一个XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档。
主要包含下面这几种对象:
- XWPFParagraph:代表一个段落。
- XWPFRun:代表具有相同属性的一段文本。
- XWPFTable:代表一个表格。
- XWPFTableRow:表格的一行。
- XWPFTableCell:表格对应的一个单元格。
引用一段写的很好的结构说明:
1、poi之word文档结构介绍之正文段落
一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元
获取所有段落:
List<XWPFParagraph> paragraphs = word.getParagraphs();
获取一个段落中的所有Runs:
List<XWPFRun> xwpfRuns = xwpfParagraph.getRuns();
获取一个Runs中的一个Run:
XWPFRun run = xwpfRuns.get(index);
2、poi之word文档结构介绍之正文表格
一个文档包含多个表格,一个表格包含多行,一行包含多列(格),每一格的内容相当于一个完整的文档
获取所有表格:
List<XWPFTable> xwpfTables = doc.getTables();
获取一个表格中的所有行:
List<XWPFTableRow> xwpfTableRows = xwpfTable.getRows();
获取一行中的所有列:
List<XWPFTableCell> xwpfTableCells = xwpfTableRow.getTableCells();
获取一格里的内容:
List<XWPFParagraph> paragraphs = xwpfTableCell.getParagraphs();
之后和正文段落一样
注:
- 表格的一格相当于一个完整的docx文档,只是没有页眉和页脚。里面可以有表格,使用
xwpfTableCell.getTables()
获取。- 在poi文档中段落和表格是完全分开的,如果在两个段落中有一个表格,在poi中是没办法确定表格在段落中间的。(当然除非你本来知道了,这句是废话)。只有文档的格式固定,才能正确的得到文档的结构
3、poi之word文档结构介绍之页眉:
一个文档可以有多个页眉(不知道怎么会有多个页眉。。。),页眉里面可以包含段落和表格
获取文档的页眉:
List<XWPFHeader> headerList = doc.getHeaderList();
获取页眉里的所有段落:
List<XWPFParagraph> paras = header.getParagraphs();
获取页眉里的所有表格:
List<XWPFTable> tables = header.getTables();
之后就一样了
4、poi之word文档结构介绍之页脚:
页脚和页眉基本类似,可以获取表示页数的角标
二、用例测试
先使用代码去达到对word的读和写。
数据准备
编写一个word文档如下:
源文件地址:
1- 读
/**
* @Description 测试读取word文件
* @Author hacah
* @Date 2021/6/15 14:45
*/
public static void testReadWord() throws IOException {
// 填写输入流
XWPFDocument xwpfDocument = new XWPFDocument(new FileInputStream("E:\\OneDrive\\文档\\自我介绍.docx"));
// 获取文本数据
List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
for (XWPFRun run : paragraph.getRuns()) {
System.out.println(run.text());
}
}
// 获取表格数据
List<XWPFTable> tables = xwpfDocument.getTables();
for (XWPFTable table : tables) {
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> tableCells = row.getTableCells();
for (XWPFTableCell tableCell : tableCells) {
List<XWPFParagraph> paragraphs1 = tableCell.getParagraphs();
for (XWPFParagraph xwpfParagraph : paragraphs1) {
List<XWPFRun> runs = xwpfParagraph.getRuns();
for (XWPFRun run : runs) {
System.out.println(run