当前位置: 首页 > news >正文

Apache POI详解

目录

 

 前言

        Apache POI是一个强大的Java库,广泛用于处理Microsoft Office文档,包括Word、Excel和PowerPoint等。本文将详细介绍如何使用Apache POI库操作Word模板(包括替换占位符、操作表格)、将Word文档转换为PDF,以及如何处理PowerPoint文档。我们将通过代码示例逐步演示这些操作。

1. Apache POI简介

依赖配置

2. 操作Word模板中的占位符

示例:替换占位符

3. 操作Word模板中的表格

示例:操作表格

4. 将Word文档转换为PDF

示例:使用Apache PDFBox将Word转换为PDF

5. 处理PowerPoint文档

示例:操作PowerPoint文档

6. 总结


 前言

        Apache POI是一个强大的Java库,广泛用于处理Microsoft Office文档,包括Word、Excel和PowerPoint等。本文将详细介绍如何使用Apache POI库操作Word模板(包括替换占位符、操作表格)、将Word文档转换为PDF,以及如何处理PowerPoint文档。我们将通过代码示例逐步演示这些操作。

1. Apache POI简介

Apache POI(Poor Obfuscation Implementation)是一个开源的Java库,主要用于处理Microsoft Office文档。它支持多种Office文档格式,包括:

  • Word.doc(旧版)和.docx(新版)。
  • Excel.xls(旧版)和.xlsx(新版)。
  • PowerPoint.ppt(旧版)和.pptx(新版)。

依赖配置

在使用Apache POI之前,需要在项目中添加相关的依赖。以下是Maven项目中常用的依赖配置:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.17</version>
</dependency>
  • poi:包含POI的核心功能,支持旧版Office格式。
  • poi-ooxml:支持新版Office格式(如.docx.xlsx.pptx)。
  • poi-scratchpad:提供了一些额外的功能,如处理Outlook邮件格式。

2. 操作Word模板中的占位符

在Word模板中,我们通常使用${}作为占位符,表示需要动态替换的内容。以下代码示例展示了如何读取Word模板并替换占位符。

示例:替换占位符

假设我们有一个Word模板template.docx,内容如下:

尊敬的${name}:
    您的订单编号为${orderId},已成功支付。

简单代码示例:

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class WordTemplateExample {
    public static void main(String[] args) throws IOException {
        // 打开Word模板
        FileInputStream file = new FileInputStream("template.docx");
        XWPFDocument document = new XWPFDocument(file);
        // 定义占位符的替换内容
        Map<String, String> replacements = new HashMap<>();
        replacements.put("${name}", "张三");
        replacements.put("${orderId}", "123456");
        // 遍历段落并替换占位符
        for (XWPFParagraph paragraph : document.getParagraphs()) {
            String text = paragraph.getText();
            for (Map.Entry<String, String> entry : replacements.entrySet()) {
                if (text != null && text.contains(entry.getKey())) {
                    text = text.replace(entry.getKey(), entry.getValue());
                    paragraph.removeRun(0); // 删除原有内容
                    paragraph.createRun().setText(text); // 插入新内容
                }
            }
        }
        // 保存修改后的文档
        FileOutputStream out = new FileOutputStream("output.docx");
        document.write(out);
        // 关闭文档
        document.close();
        out.close();
    }
}

3. 操作Word模板中的表格

Word文档中的表格是常见的结构化数据展示方式。以下代码示例展示了如何读取和修改Word模板中的表格。

示例:操作表格

假设我们有一个Word模板template.docx,其中包含一个表格:

| 姓名   | 年龄 | 性别 |
|--------|------|------|
| ${name}| ${age}| ${gender}|

 简单代码示例:

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class WordTableExample {
    public static void main(String[] args) throws IOException {
        // 打开Word模板
        FileInputStream file = new FileInputStream("template.docx");
        XWPFDocument document = new XWPFDocument(file);
        // 定义占位符的替换内容
        Map<String, String> replacements = new HashMap<>();
        replacements.put("${name}", "李四");
        replacements.put("${age}", "25");
        replacements.put("${gender}", "男");
        // 遍历表格并替换占位符
        for (XWPFTable table : document.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph paragraph : cell.getParagraphs()) {
                        String text = paragraph.getText();
                        for (Map.Entry<String, String> entry : replacements.entrySet()) {
                            if (text != null && text.contains(entry.getKey())) {
                                text = text.replace(entry.getKey(), entry.getValue());
                                paragraph.removeRun(0); // 删除原有内容
                                paragraph.createRun().setText(text); // 插入新内容
                            }
                        }
                    }
                }
            }
        }
        // 保存修改后的文档
        FileOutputStream out = new FileOutputStream("output.docx");
        document.write(out);
        // 关闭文档
        document.close();
        out.close();
    }
}

4. 将Word文档转换为PDF

将Word文档转换为PDF是一个常见的需求。我们可以使用Apache POI结合其他库(如Apache PDFBoxiText)来实现这一功能。

示例:使用Apache PDFBox将Word转换为PDF

首先,添加PDFBox的依赖:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version>
</dependency>

简单代码示例:

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class WordToPdfExample {
    public static void main(String[] args) throws IOException {
        // 打开Word文档
        FileInputStream file = new FileInputStream("output.docx");
        XWPFDocument document = new XWPFDocument(file);
        // 创建PDF文档
        PDDocument pdfDocument = new PDDocument();
        PDPage page = new PDPage();
        pdfDocument.addPage(page);
        // 写入PDF内容
        PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page);
        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
        contentStream.beginText();
        contentStream.newLineAtOffset(100, 700);
        for (XWPFParagraph paragraph : document.getParagraphs()) {
            contentStream.showText(paragraph.getText());
            contentStream.newLineAtOffset(0, -15);
        }
        contentStream.endText();
        contentStream.close();
        // 保存PDF文件
        pdfDocument.save("output.pdf");
        // 关闭文档
        pdfDocument.close();
        document.close();
    }
}

5. 处理PowerPoint文档

Apache POI也支持处理PowerPoint文档。以下代码示例展示了如何读取和修改PowerPoint文档。

示例:操作PowerPoint文档

假设我们有一个PowerPoint模板template.pptx,其中包含一个幻灯片,内容为:

标题:${title}
内容:${content}

操作PowerPoint文档的简单代码示例:

import org.apache.poi.xslf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class PowerPointExample {
    public static void main(String[] args) throws IOException {
        // 打开PowerPoint模板
        FileInputStream file = new FileInputStream("template.pptx");
        XMLSlideShow ppt = new XMLSlideShow(file);
        // 定义占位符的替换内容
        Map<String, String> replacements = new HashMap<>();
        replacements.put("${title}", "项目报告");
        replacements.put("${content}", "这是项目的最新进展。");
        // 遍历幻灯片并替换占位符
        for (XSLFSlide slide : ppt.getSlides()) {
            for (XSLFShape shape : slide.getShapes()) {
                if (shape instanceof XSLFTextShape) {
                    XSLFTextShape textShape = (XSLFTextShape) shape;
                    String text = textShape.getText();
                    for (Map.Entry<String, String> entry : replacements.entrySet()) {
                        if (text != null && text.contains(entry.getKey())) {
                            text = text.replace(entry.getKey(), entry.getValue());
                            textShape.clearText(); // 清除原有内容
                            textShape.setText(text); // 插入新内容
                        }
                    }
                }
            }
        }
        // 保存修改后的文档
        FileOutputStream out = new FileOutputStream("output.pptx");
        ppt.write(out);
        // 关闭文档
        ppt.close();
        out.close();
    }
}

6. 总结

通过Apache POI库,可以轻松地操作Word模板(包括替换占位符、操作表格)、将Word文档转换为PDF,以及处理PowerPoint文档。本文提供了详细的代码示例,帮助您快速上手这些操作。如果您有更多需求或问题,欢迎在评论区留言讨论!

相关文章:

  • 保安员考试:巧用记忆术,攻克理论知识堡垒
  • 目标检测YOLO实战应用案例100讲-基于毫米波雷达的多目标检测 (续)
  • protobuf, rpc, 火焰图
  • 大语言模型 (LLM) 基础知识
  • 介绍如何开发一个小样本增量学习程序
  • 国产LIMS系统深度横评 实验室数字化转型最优解
  • Linux之kernel(1)系统基础理论(6)
  • C++ 使用红黑树的实现及迭代器完成对set和map的封装
  • 2025年Draw.io最新版本下载安装教程,附详细图文
  • asm磁盘组扩容加错磁盘
  • 脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法
  • Tomcat下载安装及日志乱码问题解决
  • DeepSeek-专家并行(二)
  • Spring Boot+RabbitMQ+Canal 解决数据一致性
  • 【算法学习计划】动态规划 -- 路径问题
  • 1433抓鸡工具_1433抓鸡工具在软件安全测试中的重要性及应用
  • Mysql主从复制和Mysql高可用以及负载均衡配置
  • 项目管理起源是什么
  • EDIFACT端口配置指南:交换头、测试标识符与ACK
  • 如何去除文章的 AI 痕迹
  • 媒体:西安62岁男子当街殴打妻子,警方称打人者已被行拘
  • 江西省文化和旅游厅厅长梅亦已任省委宣传部副部长
  • 消失的日本中年劳动者:任何人都有与社会脱节的风险
  • 贵州省黔西市发生载人游船侧翻事故
  • A股2024年年报披露收官,四分之三公司盈利
  • 美“群聊泄密门”始作俑者沃尔兹将离职