java poi之XWPFDocument如何读取word内容并创建新的word

 更新时间:2025年04月19日 11:31:21   作者:L-960  
这篇文章主要介绍了java poi之XWPFDocument如何读取word内容并创建新的word问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Poi的Word文档结构介绍

1、poi之word文档结构介绍之正文段落

一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元

  • 获取所有段落:List paragraphs = word.getParagraphs();
  • 获取一个段落中的所有Runs:List xwpfRuns = xwpfParagraph.getRuns();
  • 获取一个Runs中的一个Run:XWPFRun run = xwpfRuns.get(index);

2、poi之word文档结构介绍之正文表格

一个文档包含多个表格,一个表格包含多行,一行包含多列(格),每一格的内容相当于一个完整的文档

  • 获取所有表格:List xwpfTables = doc.getTables();
  • 获取一个表格中的所有行:List xwpfTableRows = xwpfTable.getRows();
  • 获取一行中的所有列:List xwpfTableCells = xwpfTableRow.getTableCells();
  • 获取一格里的内容:List paragraphs = xwpfTableCell.getParagraphs();

之后和正文段落一样

注:

  • 表格的一格相当于一个完整的docx文档,只是没有页眉和页脚。里面可以有表格,使用xwpfTableCell.getTables()获取,and so on
  • 在poi文档中段落和表格是完全分开的,如果在两个段落中有一个表格,在poi中是没办法确定表格在段落中间的。(当然除非你本来知道了,这句是废话)。只有文档的格式固定,才能正确的得到文档的结构

3、poi之word文档结构介绍之页眉

一个文档可以有多个页眉(不知道怎么会有多个页眉。。。),页眉里面可以包含段落和表格

  • 获取文档的页眉:List headerList = doc.getHeaderList();
  • 获取页眉里的所有段落:List paras = header.getParagraphs();
  • 获取页眉里的所有表格:List tables = header.getTables();

之后就一样了

4、poi之word文档结构介绍之页脚

页脚和页眉基本类似,可以获取表示页数的角标

  • IBodyElement-------------------迭代器(段落和表格)
  • XWPFComment -------------------评论(个人理解应该是批注)
  • XWPFSDT
  • XWPFFooter -------------------页脚
  • XWPFFootnotes -------------------脚注
  • XWPFHeader -------------------页眉
  • XWPFHyperlink -------------------超链接
  • XWPFNumbering -------------------编号
  • XWPFParagraph -------------------段落
  • XWPFPictureData -------------------图片
  • XWPFStyles -------------------样式(设置多级标题的时候用)
  • XWPFTable -------------------表格

pom依赖

<dependencies>
       <!--解析doc文档HWPFDocument-->
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-scratchpad</artifactId>
           <version>4.1.2</version>
       </dependency>
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi</artifactId>
           <version>4.1.2</version>
       </dependency>
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
           <version>4.1.2</version>
       </dependency>

       <dependency>
           <groupId>springframework</groupId>
           <artifactId>spring-core</artifactId>
           <version>1.2.6</version>
       </dependency>
   </dependencies>

代码

  • maven项目

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;


import java.io.*;
import java.util.List;

public class poi3 {
    public static void main(String[] args) throws IOException {

        // 获取文件输入流
        FileInputStream fileInputStream = getFileInputStream("666.docx");

        dealDocx(fileInputStream, "副本.docx");

    }

    private static FileInputStream getFileInputStream(String name) throws FileNotFoundException {
        String dir = poi3.class.getResource("").getPath() + name;
        FileInputStream fileInputStream = new FileInputStream(dir);
        return fileInputStream;
    }

    private static void dealDocx(InputStream inputStream, String newFileName) throws IOException {
        // 创建输出文件
        File file = new File(poi3.class.getResource("").getPath() + newFileName);

        // 获取文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream(file);

        // 创建操作word的对象
        XWPFDocument wordInput = new XWPFDocument(inputStream);
        XWPFDocument wordOutput = new XWPFDocument();

        // 获取所有段落
        List<XWPFParagraph> xwpfParagraphs = wordInput.getParagraphs();

        // 迭代每一个段落
        for (XWPFParagraph xwpfParagraph : xwpfParagraphs) {

            // 原文档有多少个段落 我就创建多少个
            XWPFParagraph wordOutputParagraph = wordOutput.createParagraph();

            // 获取当前段落的所有run
            List<XWPFRun> runs = xwpfParagraph.getRuns();

            for (XWPFRun run : runs) {
                XWPFRun wordOutputParagraphRun = wordOutputParagraph.createRun();
                // 赋值
                //wordOutputParagraphRun.setText("哈哈哈哈~我修改过了");
                // 添加回车 硬回车
                //wordOutputParagraphRun.addCarriageReturn();
                //wordOutputParagraphRun.addBreak(); // 软回车
                wordOutputParagraphRun.setText(run.getText(run.getCharacterSpacing()));
            }

        }

        // 获取所有表格
        List<XWPFTable> xwpfTables = wordInput.getTables();
        for (XWPFTable xwpfTable : xwpfTables) {
            XWPFTable wordOutputTable = wordOutput.createTable();
            // 获取一个表格中的所有行
            List<XWPFTableRow> xwpfTableRows = xwpfTable.getRows();
            System.out.println("xwpfTableRows个数"+xwpfTableRows.size());
            for (XWPFTableRow xwpfTableRow : xwpfTableRows) {

                XWPFTableRow wordOutputTableRow = wordOutputTable.createRow();
                // 获取一行的所有列
                List<XWPFTableCell> xwpfTableCell = xwpfTableRow.getTableCells();
                System.out.println("xwpfTableCell个数"+xwpfTableCell.size());
                int index = 0;
                for (XWPFTableCell tableCell : xwpfTableCell) {
                    index++;
                    XWPFTableCell wordOutputTableRowCell = wordOutputTableRow.createCell();
                    // 获取单个列
                    //wordOutputTableRowCell.setText("哈哈哈哈~我修改过了");
                    System.out.println(tableCell.getText());
                    wordOutputTableRowCell.setText(tableCell.getText());
                    System.out.println("index:"+index);
                }

            wordOutputTable.removeRow(0);
            }
            //wordOutputTable.removeBorders(); 虚线边框

        }

        CTDocument1 document = wordInput.getDocument();
        System.out.println();


        wordOutput.write(fileOutputStream);
        wordInput.close();
        wordOutput.close();
        inputStream.close();
        fileOutputStream.close();
    }

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 替换字符串中的回车换行符的方法

    Java 替换字符串中的回车换行符的方法

    Java 替换字符串中的回车换行符的方法,需要的朋友可以参考一下
    2013-03-03
  • java如何替换word/doc文件中的内容

    java如何替换word/doc文件中的内容

    docx格式的文件本质上是一个XML文件,只要用占位符在指定的地方标记,然后替换掉标记出的内容,这篇文章主要介绍了java替换word/doc文件中的内容,需要的朋友可以参考下
    2023-06-06
  • java编写ftp下载工具

    java编写ftp下载工具

    本文给大家介绍的是如何一步步实现使用java编写FTP下载工具,而且是在Linux环境下使用javac编译的,在运行和编译上有些不同之处,有需要的小伙伴们参考下吧。
    2015-03-03
  • 在Java中将double转换为int的操作方法

    在Java中将double转换为int的操作方法

    这篇文章主要介绍了在Java中将double转换为int的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 浅谈log4j 不打印异常堆栈

    浅谈log4j 不打印异常堆栈

    这篇文章主要介绍了浅谈log4j 不打印异常堆栈,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 使用Java编写控制JDBC连接、执行及关闭的工具类

    使用Java编写控制JDBC连接、执行及关闭的工具类

    这篇文章主要介绍了如何使用Java来编写控制JDBC连接、执行及关闭的程序,包括一个针对各种数据库通用的释放资源的工具类的写法,需要的朋友可以参考下
    2016-03-03
  • 浅析Java中的Caffeine缓存源码

    浅析Java中的Caffeine缓存源码

    这篇文章主要介绍了浅析Java中的Caffeine缓存源码,Caffeine是一个Java开发的高性能缓存库,它提供了一种简单而强大的方式来管理内存中的缓存数据,Caffeine的设计目标是提供快速、高效的缓存访问,同时保持简单易用的API,本文针对其部分源码做出解析,需要的朋友可以参考下
    2023-10-10
  • Java实现角色扮演游戏的示例代码

    Java实现角色扮演游戏的示例代码

    这篇文章主要介绍了通过Java语言实现的自制的角色扮演游戏,选择两个角色,然后进行PK,可用来学习JAVA的接口,继承和多态。需要的可以参考一下
    2022-02-02
  • Java实现斗地主的发牌功能

    Java实现斗地主的发牌功能

    这篇文章主要为大家详细介绍了Java实现斗地主的发牌功能,含按顺序发牌和玩家牌排序显示等功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Java HttpClient实现socks代理的示例代码

    Java HttpClient实现socks代理的示例代码

    这篇文章主要介绍了Java HttpClient 实现 socks 代理的示例代码,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11

最新评论