【JAVA_POI】解析word文档一(docx)4.1.2版本

一、.doc和.docx两种后缀的区别

    docx文件比doc文件所占用空间更bai小。

    docx格式的文件本质du上是一个ZIP文件。将一个docx文件的后缀改为ZIP后是可dao以用解压工具打开或是解压的。事实上,Word2007的基本文件就是ZIP格式的,他可以算作是docx文件的容器。

    docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中,然后取扩展名为docx。将.docx 格式的文件后缀改为ZIP后解压, 可以看到解压出来的文件夹中有word这样一个文件夹,它包含了Word文档的大部分内容。而其中的document.xml文件则包含了文档的主要文本内容。

具体来讲可以分以下几个区别:

1、运行环境不同,docx格式的文件是Office2007及以上版本保存的新型文档,而doc是Word2003以及之前版本保存的文档,如果要转化它们还需要特殊的兼容系统。

2、它们所占用的内存空间不同,docx更加节省空间。

3、它们的响应速度有所不同,docx比doc的响应速度更加快捷,并且更加方便修改文件。

4、docx格式的文件本质上是一个ZIP文件,是docx文件的容器。而doc则容纳文字格式、脚本语言及复原等资讯的文件。

二、java对word文件的解析

2.1 引入所需要的jar包

<!--解析doc文档的HWPFDocument对象在这个包里-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>4.1.2</version>
</dependency>
<!--解析docx文档的XWPFDocument对象在这个包里-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

2.2常用方法

XWPFDocument类(文档类):
xd.getAllPictures(); 返回图片列表
xd.getParagraphs(); 返回段落列表
xd.getTables(); 返回表格列表
xd.getFooterList(); 返回脚脚列表
xd.getFootnotes(); 返回脚注列表
xd.getHeaderList(); 返回页眉列表
xd.getEndnotes(); 返回尾注列表

XWPFParagraph类(段落类):
xwpfParagraph.getText(); 返回段落的文本内容,包括图片中的文本和其中的sdt元素。
xwpfParagraph.getParagraphText(); 返回段落的文本,但不返回段落中的任何对象
xwpfParagraph.getRuns()); 返回段落run的列表

XWPFTable类(表格类):
xwpfTable.getRows(); 返回行对象XWPFTableRow

XWPFTableRow类(表格行类):
xwpfTableRow.getTableCells(); 返回单元格对象XWPFTableCell
xwpfTableCell.getParagraphs(); 返回单元格里面的段落
xwpfTableCell.getTables(); 返回单元格里面的表格

2.3准备一个docx文件

2.4解析这个文档 DocXUtils 

package com.xuexue.firstproject.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class DocXUtils {

    public static void main(String[] args) {
        String filePath = "F:\\work\\other\\测试docx文档解析.docx";
        String suffix = filePath.substring(filePath.lastIndexOf("."));
        if(".docx".equals(suffix)){
            System.out.println("文件类型是.docx");
            dealDocXFile(filePath);
        }
    }

    public static void dealDocXFile(String filePath){

        InputStream input = null;
        try {
            //实例化解析docx文档的对象
            input = new FileInputStream(filePath);
            XWPFDocument xd = new XWPFDocument(input);

            //1   getAllPackagePictures()此包装中的所有图片
            List<XWPFPictureData> xwpfPictureDataList2 = xd.getAllPictures();
            if(CollUtil.isNotEmpty(xwpfPictureDataList2)){
                for (XWPFPictureData xwpfPictureData : xwpfPictureDataList2) {
                    //图像的文件名
                    System.out.println("图片名称:" + xwpfPictureData.getFileName());
                }
            }

            //文本的段落
            List<XWPFParagraph> xwpfParagraphList = xd.getParagraphs();
            dealParagraph(xwpfParagraphList);



            //文本的表格
            List<XWPFTable> xwpfTableList = xd.getTables();
            dealTable(xwpfTableList);

            //页脚列表
            List <XWPFFooter> xwpfFooterList = xd.getFooterList();
            //System.out.println("页脚列表size:"+xwpfFooterList.size());
            if(CollUtil.isNotEmpty(xwpfFooterList)){
                for (XWPFFooter xwpfFooter : xwpfFooterList) {
                    //页脚的文本的段落
                    dealParagraph(xwpfFooter.getParagraphs());
                    dealTable(xwpfFooter.getTables());
                    System.out.println("getText:"+xwpfFooter.getText());
                }
            }

            //脚注列表
            List <XWPFFootnote> xwpfFootnoteList = xd.getFootnotes();
            for(XWPFFootnote xwpfFootnote : xwpfFootnoteList){
                //处理脚注段落
                dealParagraph(xwpfFootnote.getParagraphs());
                dealTable(xwpfFootnote.getTables());
            }

            //页眉列表
            List <XWPFHeader> xwpfHeaderList = xd.getHeaderList();
            if(CollUtil.isNotEmpty(xwpfHeaderList)){
                for(XWPFHeader xwpfHeader : xwpfHeaderList){
                    dealParagraph(xwpfHeader.getParagraphs());
                    dealTable(xwpfHeader.getTables());
                    System.out.println(xwpfHeader.getText());
                }
            }

            //尾注列表
            List<XWPFEndnote> xwpfEndnoteList = xd.getEndnotes();
            if(CollUtil.isNotEmpty(xwpfEndnoteList)){
                for(XWPFEndnote xwpfEndnote : xwpfEndnoteList){
                    dealParagraph(xwpfEndnote.getParagraphs());
                    dealTable(xwpfEndnote.getTables());
                }
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件没有找到");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("发生io异常");
        }

    }

    public static void dealParagraph(List<XWPFParagraph> xwpfParagraphListList){
        if(CollUtil.isNotEmpty(xwpfParagraphListList)){
            for(XWPFParagraph xwpfParagraph : xwpfParagraphListList){
                if(ObjectUtil.isNull(xwpfParagraph) || StrUtil.isEmpty(xwpfParagraph.getText())){
                    continue;
                }
                System.out.println("______________________________________________________________");
                //返回段落的文本内容,包括图片中的文本和其中的sdt元素。String
                System.out.println("getText~~~~~~~~~~~:"+xwpfParagraph.getText());
                //返回段落的文本,但不返回段落中的任何对象.String
                System.out.println("getParagraphText:~~"+xwpfParagraph.getParagraphText());
                System.out.println("getRuns~~~~~~~~~~~:"+xwpfParagraph.getRuns());
            }
        }

    }

    public static void dealTable(List<XWPFTable> xwpfTableList){
        if(CollUtil.isNotEmpty(xwpfTableList)){
            for(XWPFTable xwpfTable : xwpfTableList){
                //遍历行
                for(XWPFTableRow xwpfTableRow : xwpfTable.getRows()){
                    //遍历单元格
                    for(XWPFTableCell xwpfTableCell : xwpfTableRow.getTableCells()){
                        //处理段落
                        dealParagraph(xwpfTableCell.getParagraphs());
                        dealTable(xwpfTableCell.getTables());
                    }
                }
            }
        }
    }
}

对你有帮助就点个赞呗~~

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Apache POI 4.1.2 版本生成 Word 文档时,要实现目录跳转,可以按照以下步骤进行操作: 1. 创建一个 XWPFDocument 对象,用于生成 Word 文档。 ```java XWPFDocument document = new XWPFDocument(); ``` 2. 创建一个目录,并设置其样式。 ```java XWPFParagraph tocTitle = document.createParagraph(); tocTitle.setStyle("Heading1"); XWPFRun tocTitleRun = tocTitle.createRun(); tocTitleRun.setText("Table of Contents"); ``` 3. 创建一个目录内容的段落,并设置其样式。 ```java XWPFParagraph tocContent = document.createParagraph(); tocContent.setStyle("TOC"); ``` 4. 为目录内容段落设置段落属性。 ```java CTP tocRun = tocContent.getCTP(); CTPPr tocRunProperties = tocRun.getPPr(); if (tocRunProperties == null) { tocRunProperties = tocRun.addNewPPr(); } tocRunProperties.addNewPStyle().setVal("TOC"); ``` 5. 使用 XWPFDocument 的 createTOC() 方法创建目录。 ```java document.createTOC(); ``` 6. 生成正文内容。 ```java // 生成正文内容,包括标题和内容 // ... // 在正文中添加目录跳转的书签 document.createParagraph().createRun().addBreak(BreakType.PAGE); // 换页 XWPFParagraph bookmarkParagraph = document.createParagraph(); bookmarkParagraph.createRun().setText("Bookmark1"); bookmarkParagraph.createRun().addBreak(BreakType.PAGE); // 换页 // ... ``` 7. 在生成的正文内容中,使用 createHyperlinkRange 方法创建目录跳转链接。 ```java XWPFParagraph hyperlinkParagraph = document.createParagraph(); XWPFHyperlinkRun hyperlinkRun = hyperlinkParagraph.createHyperlinkRun("#Bookmark1"); hyperlinkRun.setText("Link to Bookmark1"); hyperlinkRun.setHyperlinkType(HyperlinkType.BOOKMARK); ``` 8. 最后,保存生成的 Word 文档。 ```java FileOutputStream out = new FileOutputStream("path/to/your/document.docx"); document.write(out); out.close(); document.close(); ``` 通过以上步骤,你可以生成一个带有目录跳转的 Word 文档。请注意,此示例仅适用于 Apache POI 4.1.2 版本及以上。如果你使用的是其他版本POI,请参考相应版本的文档和示例代码进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值