Apache POI 详解 - Java 操作 Excel/Word/PPT

Apache POI 详解 - Java 操作 Excel/Word/PPT

Apache POI(Poor Obfuscation Implementation)是 Apache 提供的 Java 操作 Microsoft Office 文档(Excel、Word、PPT) 的开源库。它支持 .xls(HSSF)、.xlsx(XSSF)、.doc(HWPF)、.docx(XWPF)、.ppt(HSLF)、.pptx(XSLF)等格式。


1. POI 核心组件

组件 功能 适用格式
HSSF 操作 Excel 97-2003(.xls .xls
XSSF 操作 Excel 2007+(.xlsx .xlsx
SXSSF 流式处理大 Excel(.xlsx .xlsx
HWPF 操作 Word 97-2003(.doc .doc
XWPF 操作 Word 2007+(.docx .docx
HSLF 操作 PowerPoint 97-2003(.ppt .ppt
XSLF 操作 PowerPoint 2007+(.pptx .pptx

2. POI 依赖

Maven 依赖

xml 复制代码
<!-- Excel 操作(HSSF/XSSF/SXSSF) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

<!-- Word 操作(XWPF) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>5.2.3</version>
</dependency>

3. POI 操作 Excel(XSSF/HSSF)

(1)写入 Excel(XSSF - .xlsx

java 复制代码
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;

public class ExcelWriter {
    public static void main(String[] args) throws Exception {
        // 1. 创建工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        // 2. 创建工作表
        XSSFSheet sheet = workbook.createSheet("Sheet1");

        // 3. 创建行(第 0 行)
        XSSFRow row = sheet.createRow(0);
        // 4. 创建单元格并写入数据
        row.createCell(0).setCellValue("姓名");
        row.createCell(1).setCellValue("年龄");
        
        // 5. 写入数据行
        XSSFRow dataRow = sheet.createRow(1);
        dataRow.createCell(0).setCellValue("张三");
        dataRow.createCell(1).setCellValue(25);

        // 6. 保存到文件
        try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {
            workbook.write(fos);
        }
        System.out.println("Excel 文件生成成功!");
    }
}

(2)读取 Excel(XSSF - .xlsx

java 复制代码
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;

public class ExcelReader {
    public static void main(String[] args) throws Exception {
        // 1. 加载 Excel 文件
        FileInputStream fis = new FileInputStream("output.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(fis);

        // 2. 获取工作表
        XSSFSheet sheet = workbook.getSheetAt(0);

        // 3. 遍历行和单元格
        for (Row row : sheet) {
            for (Cell cell : row) {
                switch (cell.getCellType()) {
                    case STRING:
                        System.out.print(cell.getStringCellValue() + "\t");
                        break;
                    case NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "\t");
                        break;
                    default:
                        System.out.print("UNKNOWN\t");
                }
            }
            System.out.println();
        }
        workbook.close();
    }
}

(3)SXSSF(流式处理大 Excel)

适用于大数据量(百万行):

java 复制代码
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFRow;
import java.io.FileOutputStream;

public class BigExcelWriter {
    public static void main(String[] args) throws Exception {
        // 1. 创建 SXSSFWorkbook(默认 100 行缓存)
        SXSSFWorkbook workbook = new SXSSFWorkbook();
        SXSSFSheet sheet = workbook.createSheet("大数据");

        // 2. 写入 100 万行数据
        for (int i = 0; i < 1_000_000; i++) {
            SXSSFRow row = sheet.createRow(i);
            row.createCell(0).setCellValue("数据-" + i);
            row.createCell(1).setCellValue(i);
        }

        // 3. 保存到文件
        try (FileOutputStream fos = new FileOutputStream("big-data.xlsx")) {
            workbook.write(fos);
        }
        workbook.dispose(); // 清理临时文件
        System.out.println("大 Excel 文件生成成功!");
    }
}

4. POI 操作 Word(XWPF)

(1)写入 Word(.docx

java 复制代码
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;

public class WordWriter {
    public static void main(String[] args) throws Exception {
        // 1. 创建文档
        XWPFDocument document = new XWPFDocument();

        // 2. 创建段落
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText("Hello, POI Word!");
        run.setBold(true);
        run.setFontSize(16);

        // 3. 保存到文件
        try (FileOutputStream fos = new FileOutputStream("output.docx")) {
            document.write(fos);
        }
        System.out.println("Word 文件生成成功!");
    }
}

(2)读取 Word(.docx

java 复制代码
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;

public class WordReader {
    public static void main(String[] args) throws Exception {
        // 1. 加载 Word 文件
        FileInputStream fis = new FileInputStream("output.docx");
        XWPFDocument document = new XWPFDocument(fis);

        // 2. 读取所有段落
        for (XWPFParagraph paragraph : document.getParagraphs()) {
            System.out.println(paragraph.getText());
        }

        document.close();
    }
}

5. POI 操作 PPT(XSLF)

(1)写入 PPT(.pptx

java 复制代码
import org.apache.poi.xslf.usermodel.*;
import java.io.FileOutputStream;

public class PPTWriter {
    public static void main(String[] args) throws Exception {
        // 1. 创建 PPT
        XMLSlideShow ppt = new XMLSlideShow();

        // 2. 创建幻灯片
        XSLFSlide slide = ppt.createSlide();

        // 3. 添加标题
        XSLFTextBox shape = slide.createTextBox();
        XSLFTextRun textRun = shape.addNewTextParagraph().addNewTextRun();
        textRun.setText("Hello, POI PPT!");
        textRun.setFontSize(24.0);

        // 4. 保存到文件
        try (FileOutputStream fos = new FileOutputStream("output.pptx")) {
            ppt.write(fos);
        }
        System.out.println("PPT 文件生成成功!");
    }
}

(2)读取 PPT(.pptx

java 复制代码
import org.apache.poi.xslf.usermodel.*;
import java.io.FileInputStream;

public class PPTReader {
    public static void main(String[] args) throws Exception {
        // 1. 加载 PPT 文件
        FileInputStream fis = new FileInputStream("output.pptx");
        XMLSlideShow ppt = new XMLSlideShow(fis);

        // 2. 遍历所有幻灯片
        for (XSLFSlide slide : ppt.getSlides()) {
            for (XSLFShape shape : slide.getShapes()) {
                if (shape instanceof XSLFTextShape) {
                    System.out.println(((XSLFTextShape) shape).getText());
                }
            }
        }
        ppt.close();
    }
}

6. 常见问题

(1)POI 如何处理日期格式?

java 复制代码
CellStyle style = workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-MM-dd"));
cell.setCellValue(new Date());
cell.setCellStyle(style);

(2)POI 如何设置单元格样式?

java 复制代码
CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);

(3)POI 如何处理大文件?

  • 使用 SXSSF (Excel)或 Event API(SAX 解析)减少内存占用。

7. 总结

功能 API 适用格式
Excel 操作 HSSF/XSSF/SXSSF .xls/.xlsx
Word 操作 HWPF/XWPF .doc/.docx
PPT 操作 HSLF/XSLF .ppt/.pptx

POI 是 Java 操作 Office 文档的 最主流库,适用于:

  • 报表导出(Excel)
  • 合同生成(Word)
  • 幻灯片处理(PPT)

建议:

  • 小文件XSSF / XWPF / XSLF
  • 大文件SXSSF(Excel)或 SAX 解析(避免 OOM)
相关推荐
wei_shuo5 分钟前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
欧阳秦穆27 分钟前
apoc-5.24.0-extended.jar 和 apoc-4.4.0.36-all.jar 啥区别
java·jar
岁忧37 分钟前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
Java初学者小白42 分钟前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
代码老y1 小时前
Spring Boot + 本地部署大模型实现:优化与性能提升
java·spring boot·后端
GodKeyNet1 小时前
设计模式-桥接模式
java·设计模式·桥接模式
guojl2 小时前
Java多任务编排技术
java
丶意冷2 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
要开心吖ZSH2 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程3 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码