使用 Java 分页读取 DOCX 文档的完整步骤

今天在开发过程中遇到的一个需求,java读取文档内容并同步生成数据表,在 Java 编程中,操作文档也是一个常见功能,下面就简单介绍一下解决过程。

依赖

<!-- 这边java版本为1.8 -->
<!-- Apache POI 处理 Word 文档 -->
<dependency>
<groupId>org.apache.poi</groupId> 
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency> 

<!-- Apache POI 核心库 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency> 

<!-- XMLBeans 解析器,用于处理 Word XML 数据 --> 
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.1.1</version>
</dependency>

<!-- Commons Compress 库,用于压缩和解压缩文件 --> 
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>

Apache POI

-   `XWPFDocument` 类用于读取 `.docx` 文件。
-   `XWPFParagraph` 代表文档中的段落,`XWPFRun` 用于操作段落中的文本。
-   `XWPFTable` 代表文档中的段落,`XWPFRun` 用于操作表格中的文本。
话不多说直接上代码
// 读取段落 
try(
//获取上传的文档内容,并放入XWPFDocument中
InputStream inputStream = file.getInputStream();
    XWPFDocument document = new XWPFDocument(inputStream)){
    // 读取文档中的段落
    List<XWPFParagraph> paragraphs = document.getParagraphs();
    //循环段落
    for (XWPFParagraph paragraph : paragraphs) {
    //转为list类型
    List<XWPFRun> runs = paragraph.getRuns();
    //循环拿到内容
    for (XWPFRun run : runs) {
    String text = run.getText(0);
    if (text != null) {
    // 假设每个段落占一行
    currentLineCount++;
    pageContent.append(text).append("\n");
    // 判断是否需要分页
    if (currentLineCount >= maxLinesPerPage) { 
    // 输出当前页内容
    savePageContent(pageContent.toString(), pageNumber);
    // 重置分页参数
    pageContent.setLength(0);
    currentLineCount = 0;
    pageNumber++; } } } } 
     
    // 保存最后一页内容
    if (pageContent.length() > 0) {
    savePageContent(pageContent.toString(), pageNumber); 
    }
     // 关闭文档
     file.close();
     document.close();
     
     }
     
     // 将每页内容保存为新的文件或处理分页内容
     private static void savePageContent(String content, int pageNumber) throws IOException {
     String fileName = "页" + pageNumber + ".txt";
     FileOutputStream fos = new FileOutputStream(fileName);
     fos.write(content.getBytes());
     fos.close();
     System.out.println("页 " + pageNumber + " to " + fileName);
     }

这里是未分页获取所有文本内容(内容中含表格)

    try (InputStream inputStream = file.getInputStream();
         XWPFDocument xwpfDocument = new XWPFDocument(inputStream)) {

        // 读取文档中的段落
        List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
        // 创建一个 List 来存储每页的内容
        List<String> pages = new ArrayList<>();
        StringBuilder stringBuilder = new StringBuilder();

        // 遍历段落
        for (XWPFParagraph paragraph : paragraphs) {
            stringBuilder.append(paragraph.getText()).append('\n');
            // 将当前页的内容添加到 pages 列表
            String[] split = stringBuilder.toString().trim().split(" ");
            for (String s : split) {
                if (!s.trim().isEmpty()) {
                    pages.add(s);
                }
            }
 
        }
        System.out.println(pages);


        // 获取所有的表格
        List<XWPFTable> tables = xwpfDocument.getTables();

        // 遍历所有表格
        for (XWPFTable table : tables) {
            System.out.println("New Table:");
            // 遍历表格中的行
            for (XWPFTableRow row : table.getRows()) {
                // 遍历每一行的单元格
                for (XWPFTableCell tableCell : row.getTableCells()) {
                    System.out.print(tableCell.getText() + '\t');  // 改为 `print` 避免多余换行

                    //这里可以来判断也以后得业务逻辑,判断循值是否是自己需要的
                }
                System.out.println();  // 换行,表示一行表格的结束
            }
        }


    } catch (IOException e) {
        // 处理异常逻辑,例如记录日志
        e.printStackTrace();
    }
}

就此功能完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值